From 547250321bed03828339310c0faebfced4554dfd Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Mon, 11 Jan 2016 22:42:05 -0800 Subject: [PATCH] store: handle watch dir removal correctly --- store/event_history.go | 4 ++++ store/event_test.go | 15 +++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/store/event_history.go b/store/event_history.go index 5db95b244..5bd967ead 100644 --- a/store/event_history.go +++ b/store/event_history.go @@ -90,6 +90,10 @@ func (eh *EventHistory) scan(key string, recursive bool, index uint64) (*Event, ok = ok || strings.HasPrefix(e.Node.Key, key) } + if (e.Action == Delete || e.Action == Expire) && e.PrevNode != nil && e.PrevNode.Dir { + ok = ok || strings.HasPrefix(key, e.PrevNode.Key) + } + if ok { return e, nil } diff --git a/store/event_test.go b/store/event_test.go index b25c41318..6dd5f60e1 100644 --- a/store/event_test.go +++ b/store/event_test.go @@ -14,9 +14,7 @@ package store -import ( - "testing" -) +import "testing" // TestEventQueue tests a queue with capacity = 100 // Add 200 events into that queue, and test if the @@ -55,6 +53,11 @@ func TestScanHistory(t *testing.T) { eh.addEvent(newEvent(Create, "/foo/bar/bar", 4, 4)) eh.addEvent(newEvent(Create, "/foo/foo/foo", 5, 5)) + // Delete a dir + de := newEvent(Delete, "/foo", 6, 6) + de.PrevNode = newDir(nil, "/foo", 1, nil, Permanent).Repr(false, false, nil) + eh.addEvent(de) + e, err := eh.scan("/foo", false, 1) if err != nil || e.Index() != 1 { t.Fatalf("scan error [/foo] [1] %v", e.Index) @@ -72,8 +75,12 @@ func TestScanHistory(t *testing.T) { t.Fatalf("scan error [/foo/bar/bar] [4] %v", e.Index) } - e, err = eh.scan("/foo/bar", true, 6) + e, err = eh.scan("/foo/foo/foo", false, 6) + if err != nil || e.Index() != 6 { + t.Fatalf("scan error [/foo/foo/foo] [6] %v", e.Index) + } + e, err = eh.scan("/foo/bar", true, 7) if e != nil { t.Fatalf("bad index shoud reuturn nil") }