diff --git a/tracker/enqueue.go b/tracker/enqueue.go index 88d0254b33..f04928d3c3 100644 --- a/tracker/enqueue.go +++ b/tracker/enqueue.go @@ -277,8 +277,8 @@ func (i *impl) GetObservers(obj interface{}) []types.NamespacedName { keys = append(keys, key) } } - if len(s) == 0 { - delete(i.exact, ref) + if len(ms) == 0 { + delete(i.inexact, ref) } } @@ -309,7 +309,7 @@ func (i *impl) OnDeletedObserver(obj interface{}) { for ref, matchers := range i.inexact { delete(matchers, key) if len(matchers) == 0 { - delete(i.exact, ref) + delete(i.inexact, ref) } } } diff --git a/tracker/enqueue_test.go b/tracker/enqueue_test.go index 2f7e926e1c..9c08107088 100644 --- a/tracker/enqueue_test.go +++ b/tracker/enqueue_test.go @@ -808,5 +808,32 @@ func TestHappyPathsByBoth(t *testing.T) { if got, want := len(trk.GetObservers(thing1)), 0; got != want { t.Fatalf("len(GetObservers()) = %v, wanted %v", got, want) } + if got, want := len(trk.(*impl).exact), 0; got != want { + t.Fatalf("OnDeletedObserver() did not clean up exact map: len = %v, wanted %v", got, want) + } + if got, want := len(trk.(*impl).inexact), 0; got != want { + t.Fatalf("OnDeletedObserver() did not clean up inexact map: len = %v, wanted %v", got, want) + } + } + + // Verify inexact map cleanup on expiry when exact tracker is also present. + { + if err := trk.TrackReference(ref1, thing2); err != nil { + t.Fatal("Track() =", err) + } + if err := trk.TrackReference(ref2, thing2); err != nil { + t.Fatal("Track() =", err) + } + + time.Sleep(101 * time.Millisecond) + + trk.GetObservers(thing1) + + if got, want := len(trk.(*impl).exact), 0; got != want { + t.Fatalf("Timeout passed, but exact map not cleaned up: len = %v, wanted %v", got, want) + } + if got, want := len(trk.(*impl).inexact), 0; got != want { + t.Fatalf("Timeout passed, but inexact map not cleaned up: len = %v, wanted %v", got, want) + } } }