Skip to content

v1.3.122

Choose a tag to compare

@topcheer topcheer released this 04 Jul 02:22
· 4029 commits to main since this release

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 — Added math/rand/v2 import, jitter
    computation in retryDelay() (Retry-After path bypasses jitter)
  • internal/provider/openai_test.goTestRetryDelayJitterRange (100
    iterations verify delay stays within ±25%), TestRetryDelayRetryAfterNoJitter
    (verifies Retry-After values are exact), updated
    TestRetryWithBackoffCtxRetriesDeadlineExceededWhenContextActive to
    accept jitter range