Skip to content

fix: interrupt retry backoff when context is canceled - #26

Draft
Kayvan-Zahiri wants to merge 1 commit into
loops-so:mainfrom
Kayvan-Zahiri:codex/cancel-retry-backoff-with-context
Draft

Kayvan-Zahiri wants to merge 1 commit into
loops-so:mainfrom
Kayvan-Zahiri:codex/cancel-retry-backoff-with-context

Conversation

@Kayvan-Zahiri

Copy link
Copy Markdown

Client.Do(ctx, ...) checks cancellation after transport errors, but its retry backoff uses time.Sleep. Cancelling the context (or reaching its deadline) while waiting after a 429/5xx response still waits out the 500–750ms first backoff before returning.

Use a timer selected against ctx.Done() and wrap the context error with the existing request-failed prefix. Recreate the request body only after the wait succeeds, so cancellation does not allocate an unused replacement body. Preserve retry counts, exponential delays, jitter and response handling. Adapt the two existing sleep stubs to the context-aware signature.

Four new public Do cases cover cancellation and deadlines during retry backoff after 429 and 503 responses, using a synthetic RoundTripper with no network calls. Each fails before and passes after. Each test joins its request goroutine before returning.

Validation on Go 1.27.0: focused regressions pass; full go test -race -cover ./... passes (76.4% statement coverage), go vet ./..., go build ./..., gofmt and git diff --check pass. Existing full-suite HTTP fixtures require local loopback permissions. No live Loops requests or account credentials were used.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant