diff --git a/util/retry/util.go b/util/retry/util.go index 57d3cd49c..fd2a959ec 100644 --- a/util/retry/util.go +++ b/util/retry/util.go @@ -59,7 +59,7 @@ func OnError(backoff wait.Backoff, retriable func(error) bool, fn func() error) return false, err } }) - if wait.Interrupted(err) { + if wait.Interrupted(err) && lastErr != nil { err = lastErr } return err diff --git a/util/retry/util_test.go b/util/retry/util_test.go index dbb4374fe..76529fdf9 100644 --- a/util/retry/util_test.go +++ b/util/retry/util_test.go @@ -17,6 +17,8 @@ limitations under the License. package retry import ( + "context" + stderrors "errors" "fmt" "testing" @@ -69,3 +71,12 @@ func TestRetryOnConflict(t *testing.T) { t.Errorf("unexpected error: %v", err) } } + +func TestRetryOnConflictPreservesContextErrorWithoutLastError(t *testing.T) { + err := RetryOnConflict(DefaultBackoff, func() error { + return context.Canceled + }) + if !stderrors.Is(err, context.Canceled) { + t.Fatalf("expected context.Canceled, got %v", err) + } +}