v1.3.122
v1.3.122
Provider Retry — Exponential Backoff Jitter
Add ±25% jitter to retry backoff delays
The provider retry logic used deterministic exponential backoff without
jitter. When multiple ggcode instances (or other API clients) hit a shared
rate limit simultaneously, they would all retry at exactly the same intervals,
creating a thundering herd pattern that prolongs the outage.
Fix: retryDelay() now applies ±25% random jitter to the computed
exponential backoff. Retry-After header values from the server are NOT
jittered — those are respected exactly as the server instructs.
Before: 1s → 2s → 4s → 8s → 16s → 30s → 30s → ...
After: ~0.9s → ~1.8s → ~3.7s → ~7.5s → ~15.2s → ~28.1s → ...
This follows the 2025-2026 best practice for distributed system retry
patterns: wait_time = base_delay × 2^attempt + random_jitter.
Files changed
internal/provider/retry.go— Addedmath/rand/v2import, jitter
computation inretryDelay()(Retry-After path bypasses jitter)internal/provider/openai_test.go—TestRetryDelayJitterRange(100
iterations verify delay stays within ±25%),TestRetryDelayRetryAfterNoJitter
(verifies Retry-After values are exact), updated
TestRetryWithBackoffCtxRetriesDeadlineExceededWhenContextActiveto
accept jitter range