From 30dc11a931010cdca52dddddb7b06fafbe0db8b2 Mon Sep 17 00:00:00 2001 From: Aditya Manthramurthy Date: Wed, 26 Oct 2016 20:13:00 -0700 Subject: [PATCH] No `listener.json` for single-node mode (Fixes #3052) (#3108) In FS or single-node XL mode, there is no need to save listener configuration to persistent storage. As there is only one server, if it is restarted, any connected listenBucketAPI clients were disconnected and will have to reconnect - so there is nothing to actually store. This incidentally solves #3052 by avoiding the problem. --- cmd/bucket-notification-handlers.go | 24 ++++++++++++++---------- cmd/event-notifier.go | 7 +++++++ cmd/event-notifier_test.go | 10 ++++++++++ cmd/s3-peer-client.go | 6 ++++++ 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/cmd/bucket-notification-handlers.go b/cmd/bucket-notification-handlers.go index c5c75bcdb..b4f1e7960 100644 --- a/cmd/bucket-notification-handlers.go +++ b/cmd/bucket-notification-handlers.go @@ -379,11 +379,13 @@ func AddBucketListenerConfig(bucket string, lcfg *listenerConfig, objAPI ObjectL // Release lock after notifying peers defer nsMutex.Unlock(bucket, "", opsID) - // update persistent config - err := persistListenerConfig(bucket, listenerCfgs, objAPI) - if err != nil { - errorIf(err, "Error persisting listener config when adding a listener.") - return err + // update persistent config if dist XL + if globalS3Peers.isDistXL { + err := persistListenerConfig(bucket, listenerCfgs, objAPI) + if err != nil { + errorIf(err, "Error persisting listener config when adding a listener.") + return err + } } // persistence success - now update in-memory globals on all @@ -419,11 +421,13 @@ func RemoveBucketListenerConfig(bucket string, lcfg *listenerConfig, objAPI Obje // Release lock after notifying peers defer nsMutex.Unlock(bucket, "", opsID) - // update persistent config - err := persistListenerConfig(bucket, updatedLcfgs, objAPI) - if err != nil { - errorIf(err, "Error persisting listener config when removing a listener.") - return + // update persistent config if dist XL + if globalS3Peers.isDistXL { + err := persistListenerConfig(bucket, updatedLcfgs, objAPI) + if err != nil { + errorIf(err, "Error persisting listener config when removing a listener.") + return + } } // persistence success - now update in-memory globals on all diff --git a/cmd/event-notifier.go b/cmd/event-notifier.go index f5594ab50..d648afd9b 100644 --- a/cmd/event-notifier.go +++ b/cmd/event-notifier.go @@ -347,6 +347,13 @@ func loadNotificationConfig(bucket string, objAPI ObjectLayer) (*notificationCon // loads notification config if any for a given bucket, returns // structured notification config. func loadListenerConfig(bucket string, objAPI ObjectLayer) ([]listenerConfig, error) { + // in single node mode, there are no peers, so in this case + // there is no configuration to load, as any previously + // connected listen clients have been disconnected + if !globalS3Peers.isDistXL { + return nil, nil + } + // Construct the notification config path. listenerConfigPath := path.Join(bucketConfigPrefix, bucket, bucketListenerConfig) objInfo, err := objAPI.GetObjectInfo(minioMetaBucket, listenerConfigPath) diff --git a/cmd/event-notifier_test.go b/cmd/event-notifier_test.go index be2beab45..e15561cf2 100644 --- a/cmd/event-notifier_test.go +++ b/cmd/event-notifier_test.go @@ -291,6 +291,11 @@ func TestInitEventNotifier(t *testing.T) { t.Fatal("Unexpected error:", err) } + // needed to load listener config from disk for testing (in + // single peer mode, the listener config is ingored, but here + // we want to test the loading from disk too.) + globalS3Peers.isDistXL = true + // test event notifier init if err := initEventNotifier(obj); err != nil { t.Fatal("Unexpected error:", err) @@ -361,6 +366,11 @@ func TestListenBucketNotification(t *testing.T) { t.Fatalf("Test Setup error: %v", err) } + // needed to load listener config from disk for testing (in + // single peer mode, the listener config is ingored, but here + // we want to test the loading from disk too.) + globalS3Peers.isDistXL = true + // Init event notifier if err := initEventNotifier(obj); err != nil { t.Fatal("Unexpected error:", err) diff --git a/cmd/s3-peer-client.go b/cmd/s3-peer-client.go index 46a4a64c4..002bab97f 100644 --- a/cmd/s3-peer-client.go +++ b/cmd/s3-peer-client.go @@ -32,6 +32,9 @@ type s3Peers struct { mutex *sync.RWMutex + // Is single-node? + isDistXL bool + // Slice of all peer addresses (in `host:port` format). peers []string } @@ -53,6 +56,9 @@ func initGlobalS3Peers(eps []storageEndPoint) { // Save new peers globalS3Peers.peers = peers + + // store if this is a distributed setup or not. + globalS3Peers.isDistXL = len(globalS3Peers.peers) > 1 } func (s3p *s3Peers) GetPeers() []string {