diff --git a/store/watcher_hub.go b/store/watcher_hub.go index 737fab028..03211a470 100644 --- a/store/watcher_hub.go +++ b/store/watcher_hub.go @@ -161,6 +161,11 @@ func (wh *watcherHub) clone() *watcherHub { // isHidden checks to see if key path is considered hidden to watch path i.e. the // last element is hidden or it's within a hidden directory func isHidden(watchPath, keyPath string) bool { + // When deleting a directory, watchPath might be deeper than the actual keyPath + // For example, when deleting /foo we also need to notify watchers on /foo/bar. + if len(watchPath) > len(keyPath) { + return false + } // if watch path is just a "/", after path will start without "/" // add a "/" to deal with the special case when watchPath is "/" afterPath := path.Clean("/" + keyPath[len(watchPath):]) diff --git a/store/watcher_hub_test.go b/store/watcher_hub_test.go index 08a30f71b..1f32675a4 100644 --- a/store/watcher_hub_test.go +++ b/store/watcher_hub_test.go @@ -40,4 +40,13 @@ func TestIsHidden(t *testing.T) { if !hidden { t.Fatalf("%v should be hidden to %v\n", key, watch) } + + // watch at "/_foo/foo" + // key is "/_foo" + watch = "_foo/foo" + key = "/_foo/" + hidden = isHidden(watch, key) + if hidden { + t.Fatalf("%v should not be hidden to %v\n", key, watch) + } }