diff --git a/staging/src/k8s.io/client-go/rest/request.go b/staging/src/k8s.io/client-go/rest/request.go index fb572169272..fe3c066729a 100644 --- a/staging/src/k8s.io/client-go/rest/request.go +++ b/staging/src/k8s.io/client-go/rest/request.go @@ -20,6 +20,7 @@ import ( "bytes" "context" "encoding/hex" + stderrors "errors" "fmt" "io" "mime" @@ -671,7 +672,8 @@ func (r *Request) tryThrottleWithInfo(ctx context.Context, retryInfo string) err now := time.Now() err := r.rateLimiter.Wait(ctx) - if err != nil { + // Don't wrap context errors as caller initiated ctx cancellations is not a rate limiter error. + if err != nil && !stderrors.Is(err, context.Canceled) && !stderrors.Is(err, context.DeadlineExceeded) { err = fmt.Errorf("client rate limiter Wait returned an error: %w", err) } latency := time.Since(now) diff --git a/staging/src/k8s.io/client-go/rest/request_test.go b/staging/src/k8s.io/client-go/rest/request_test.go index ad106169d4e..64a6179a7b0 100644 --- a/staging/src/k8s.io/client-go/rest/request_test.go +++ b/staging/src/k8s.io/client-go/rest/request_test.go @@ -4275,3 +4275,16 @@ func TestRequestWarningHandler(t *testing.T) { assert.Nil(t, request.warningHandler) }) } + +func TestTryThrottleWithInfoContextDeadline(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + + r := &Request{ + rateLimiter: flowcontrol.NewTokenBucketRateLimiter(1, 1), + c: &RESTClient{base: &url.URL{Path: "/"}}, + } + err := r.tryThrottleWithInfo(ctx, "") + require.ErrorIs(t, err, context.Canceled) + assert.NotContains(t, err.Error(), "client rate limiter") +}