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 {