From b7a4fa56bf3ec7fbb42bbd89fd3f0b33a2ff6d5a Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Wed, 13 Oct 2021 19:10:02 -0700 Subject: [PATCH] retry: abort retry loop on context errors (#1383) Fixes #1377 --- internal/retry/retry.go | 5 +++++ internal/retry/retry_test.go | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/internal/retry/retry.go b/internal/retry/retry.go index 267e265a2..1c53b2d4f 100644 --- a/internal/retry/retry.go +++ b/internal/retry/retry.go @@ -56,6 +56,11 @@ func internalRetry(ctx context.Context, desc string, attempt AttemptFunc, isRetr var lastError error for i := 0; i < count; i++ { + if cerr := ctx.Err(); cerr != nil { + // nolint:wrapcheck + return nil, cerr + } + v, err := attempt() if err == nil { return v, nil diff --git a/internal/retry/retry_test.go b/internal/retry/retry_test.go index 1a8d3eeca..48624f481 100644 --- a/internal/retry/retry_test.go +++ b/internal/retry/retry_test.go @@ -1,10 +1,12 @@ package retry import ( + "context" "testing" "time" "github.com/pkg/errors" + "github.com/stretchr/testify/require" "github.com/kopia/kopia/internal/testlogging" ) @@ -58,3 +60,16 @@ func TestRetry(t *testing.T) { }) } } + +func TestRetryContextCancel(t *testing.T) { + t.Parallel() + + ctx := testlogging.Context(t) + + canceledctx, cancel := context.WithCancel(ctx) + cancel() + + require.ErrorIs(t, context.Canceled, WithExponentialBackoffNoValue(canceledctx, "canceled", func() error { + return errRetriable + }, isRetriable)) +}