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.
master
Harshavardhana 5 years ago committed by GitHub
parent dc1eb57f4e
commit 8f1243986e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      cmd/bucket-notification-handlers.go
  2. 1
      cmd/peer-rest-common.go
  3. 3
      cmd/peer-rest-server.go

@ -228,6 +228,7 @@ func (api objectAPIHandlers) ListenBucketNotificationHandler(w http.ResponseWrit
bucketName := vars["bucket"] bucketName := vars["bucket"]
values := r.URL.Query() values := r.URL.Query()
values.Set(peerRESTListenBucket, bucketName)
var prefix string var prefix string
if len(values[peerRESTListenPrefix]) > 1 { if len(values[peerRESTListenPrefix]) > 1 {
@ -295,6 +296,9 @@ func (api objectAPIHandlers) ListenBucketNotificationHandler(w http.ResponseWrit
if !ok { if !ok {
return false return false
} }
if ev.S3.Bucket.Name != values.Get(peerRESTListenBucket) {
return false
}
objectName, uerr := url.QueryUnescape(ev.S3.Object.Key) objectName, uerr := url.QueryUnescape(ev.S3.Object.Key)
if uerr != nil { if uerr != nil {
objectName = ev.S3.Object.Key objectName = ev.S3.Object.Key
@ -306,7 +310,7 @@ func (api objectAPIHandlers) ListenBucketNotificationHandler(w http.ResponseWrit
if peer == nil { if peer == nil {
continue continue
} }
peer.Listen(listenCh, doneCh, r.URL.Query()) peer.Listen(listenCh, doneCh, values)
} }
keepAliveTicker := time.NewTicker(500 * time.Millisecond) keepAliveTicker := time.NewTicker(500 * time.Millisecond)

@ -82,6 +82,7 @@ const (
peerRESTTraceAll = "all" peerRESTTraceAll = "all"
peerRESTTraceErr = "err" peerRESTTraceErr = "err"
peerRESTListenBucket = "bucket"
peerRESTListenPrefix = "prefix" peerRESTListenPrefix = "prefix"
peerRESTListenSuffix = "suffix" peerRESTListenSuffix = "suffix"
peerRESTListenEvents = "events" peerRESTListenEvents = "events"

@ -978,6 +978,9 @@ func (s *peerRESTServer) ListenHandler(w http.ResponseWriter, r *http.Request) {
if !ok { if !ok {
return false return false
} }
if ev.S3.Bucket.Name != values.Get(peerRESTListenBucket) {
return false
}
objectName, uerr := url.QueryUnescape(ev.S3.Object.Key) objectName, uerr := url.QueryUnescape(ev.S3.Object.Key)
if uerr != nil { if uerr != nil {
objectName = ev.S3.Object.Key objectName = ev.S3.Object.Key

Loading…
Cancel
Save