From 21b9a31c3308c1f4c0e3b5492fbe0301f2bfeaf7 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Fri, 17 May 2019 10:02:08 -0400 Subject: [PATCH] Terminate watchers when watch cache is destroyed --- .../apiserver/pkg/storage/cacher/cacher.go | 1 + .../storage/cacher/cacher_whitebox_test.go | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher.go b/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher.go index 0f5c0848dae18..0e63405befc4d 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher.go @@ -268,6 +268,7 @@ func NewCacherFromConfig(config Config) *Cacher { cacher.stopWg.Add(1) go func() { defer cacher.stopWg.Done() + defer cacher.terminateAllWatchers() wait.Until( func() { if !cacher.isStopped() { diff --git a/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher_whitebox_test.go b/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher_whitebox_test.go index 2de915eb5a9a9..6c7775bf7c7cd 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher_whitebox_test.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher_whitebox_test.go @@ -443,3 +443,39 @@ func TestWatcherNotGoingBackInTime(t *testing.T) { } } } + +func TestCacheWatcherStoppedOnDestroy(t *testing.T) { + backingStorage := &dummyStorage{} + cacher, _ := newTestCacher(backingStorage, 1000) + defer cacher.Stop() + + // Wait until cacher is initialized. + cacher.ready.wait() + + w, err := cacher.Watch(context.Background(), "pods/ns", "0", storage.Everything) + if err != nil { + t.Fatalf("Failed to create watch: %v", err) + } + + watchClosed := make(chan struct{}) + go func() { + defer close(watchClosed) + for event := range w.ResultChan() { + switch event.Type { + case watch.Added, watch.Modified, watch.Deleted: + // ok + default: + t.Errorf("unexpected event %#v", event) + } + } + }() + + cacher.Stop() + + select { + case <-watchClosed: + case <-time.After(wait.ForeverTestTimeout): + t.Errorf("timed out waiting for watch to close") + } + +}