From 8c1471aedaac1ca8ed7e6b7f994bb4eebb5987ff Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Thu, 5 Oct 2017 18:51:57 -0400 Subject: [PATCH] cache.ListWatchUntil should return err.ErrWaitTimeout Clients shouldn't have to know about watch.ErrWatchClosed, which is typically a server side decision to close and always means "Timeout" in this conetxt. Kubernetes-commit: cbecf177274e6f6924d6ca756eccf0a55e2933c0 --- tools/cache/listwatch.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/cache/listwatch.go b/tools/cache/listwatch.go index 454d50aa..db2329c5 100644 --- a/tools/cache/listwatch.go +++ b/tools/cache/listwatch.go @@ -25,6 +25,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/pager" @@ -103,6 +104,8 @@ func (lw *ListWatch) Watch(options metav1.ListOptions) (watch.Interface, error) return lw.WatchFunc(options) } +// ListWatchUntil checks the provided conditions against the items returned by the list watcher, returning wait.ErrWaitTimeout +// if timeout is exceeded without all conditions returning true, or an error if an error occurs. // TODO: check for watch expired error and retry watch from latest point? Same issue exists for Until. func ListWatchUntil(timeout time.Duration, lw ListerWatcher, conditions ...watch.ConditionFunc) (*watch.Event, error) { if len(conditions) == 0 { @@ -166,5 +169,10 @@ func ListWatchUntil(timeout time.Duration, lw ListerWatcher, conditions ...watch return nil, err } - return watch.Until(timeout, watchInterface, remainingConditions...) + evt, err := watch.Until(timeout, watchInterface, remainingConditions...) + if err == watch.ErrWatchClosed { + // present a consistent error interface to callers + err = wait.ErrWaitTimeout + } + return evt, err }