diff --git a/pkg/storage/cacher.go b/pkg/storage/cacher.go index 13eabb2b8c9..b9140f7e26a 100644 --- a/pkg/storage/cacher.go +++ b/pkg/storage/cacher.go @@ -414,6 +414,11 @@ func (c *Cacher) LastSyncResourceVersion() (uint64, error) { return strconv.ParseUint(resourceVersion, 10, 64) } +// For debugging #18794 only. +func (c *Cacher) GetAllCachedEvents() ([]watchCacheEvent, error) { + return c.watchCache.getAllCachedEvents() +} + // cacherListerWatcher opaques storage.Interface to expose cache.ListerWatcher. type cacherListerWatcher struct { storage Interface diff --git a/pkg/storage/cacher_test.go b/pkg/storage/cacher_test.go index 5ae7977d25a..91830c1cf57 100644 --- a/pkg/storage/cacher_test.go +++ b/pkg/storage/cacher_test.go @@ -37,6 +37,7 @@ import ( "k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/watch" + "github.com/golang/glog" "golang.org/x/net/context" ) @@ -299,6 +300,15 @@ func TestFiltering(t *testing.T) { } watcher, err := cacher.Watch(context.TODO(), "pods/ns/foo", fooCreated.ResourceVersion, filter) if err != nil { + // For debugging #18794 only. + events, err := cacher.GetAllCachedEvents() + if err != nil { + glog.Error("Unexpected error: %v", err) + } else { + for _, event := range events { + glog.Errorf("cached event: %s %#v", event.Type, event.Object) + } + } t.Fatalf("Unexpected error: %v", err) } defer watcher.Stop() diff --git a/pkg/storage/watch_cache.go b/pkg/storage/watch_cache.go index 196e35e0cb8..5e557b21fdd 100644 --- a/pkg/storage/watch_cache.go +++ b/pkg/storage/watch_cache.go @@ -298,3 +298,13 @@ func (w *watchCache) GetAllEventsSince(resourceVersion uint64) ([]watchCacheEven defer w.RUnlock() return w.GetAllEventsSinceThreadUnsafe(resourceVersion) } + +// For debugging #18794 only. +func (w *watchCache) getAllCachedEvents() ([]watchCacheEvent, error) { + w.RLock() + defer w.RUnlock() + if w.startIndex == w.endIndex { + return make([]watchCacheEvent, 0), nil + } + return w.GetAllEventsSinceThreadUnsafe(w.cache[w.startIndex%w.capacity].resourceVersion) +}