From 8f1243986e58e903c6381ff0067046e3481d1106 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Fri, 20 Dec 2019 11:45:03 -0800 Subject: [PATCH] fix: listenBucket should filter events based on bucket (#8677) Currently all bucket events are sent to all watchers with matching prefix and event names, this becomes problematic and prone to performance issues, fix this situation by filtering based on buckets as well. --- cmd/bucket-notification-handlers.go | 6 +++++- cmd/peer-rest-common.go | 1 + cmd/peer-rest-server.go | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/cmd/bucket-notification-handlers.go b/cmd/bucket-notification-handlers.go index 79de4f4d0..cfd83891e 100644 --- a/cmd/bucket-notification-handlers.go +++ b/cmd/bucket-notification-handlers.go @@ -228,6 +228,7 @@ func (api objectAPIHandlers) ListenBucketNotificationHandler(w http.ResponseWrit bucketName := vars["bucket"] values := r.URL.Query() + values.Set(peerRESTListenBucket, bucketName) var prefix string if len(values[peerRESTListenPrefix]) > 1 { @@ -295,6 +296,9 @@ func (api objectAPIHandlers) ListenBucketNotificationHandler(w http.ResponseWrit if !ok { return false } + if ev.S3.Bucket.Name != values.Get(peerRESTListenBucket) { + return false + } objectName, uerr := url.QueryUnescape(ev.S3.Object.Key) if uerr != nil { objectName = ev.S3.Object.Key @@ -306,7 +310,7 @@ func (api objectAPIHandlers) ListenBucketNotificationHandler(w http.ResponseWrit if peer == nil { continue } - peer.Listen(listenCh, doneCh, r.URL.Query()) + peer.Listen(listenCh, doneCh, values) } keepAliveTicker := time.NewTicker(500 * time.Millisecond) diff --git a/cmd/peer-rest-common.go b/cmd/peer-rest-common.go index ce5761019..2b62a5125 100644 --- a/cmd/peer-rest-common.go +++ b/cmd/peer-rest-common.go @@ -82,6 +82,7 @@ const ( peerRESTTraceAll = "all" peerRESTTraceErr = "err" + peerRESTListenBucket = "bucket" peerRESTListenPrefix = "prefix" peerRESTListenSuffix = "suffix" peerRESTListenEvents = "events" diff --git a/cmd/peer-rest-server.go b/cmd/peer-rest-server.go index 372413c50..64b7a0fff 100644 --- a/cmd/peer-rest-server.go +++ b/cmd/peer-rest-server.go @@ -978,6 +978,9 @@ func (s *peerRESTServer) ListenHandler(w http.ResponseWriter, r *http.Request) { if !ok { return false } + if ev.S3.Bucket.Name != values.Get(peerRESTListenBucket) { + return false + } objectName, uerr := url.QueryUnescape(ev.S3.Object.Key) if uerr != nil { objectName = ev.S3.Object.Key