Skip to content

feat(transport): add HTTP retry with exponential backoff#1520

Open
jpnurmi wants to merge 103 commits intomasterfrom
jpnurmi/feat/http-retry
Open

feat(transport): add HTTP retry with exponential backoff#1520
jpnurmi wants to merge 103 commits intomasterfrom
jpnurmi/feat/http-retry

Conversation

@jpnurmi
Copy link
Collaborator

@jpnurmi jpnurmi commented Feb 13, 2026

Add HTTP retry with exponential backoff for network failures, modeled after Crashpad's upload retry behavior.

Note

Adds an explicit 15s connect timeout to both curl and WinHTTP, matching the value used by Crashpad. This reduces the time the transport worker is blocked on unreachable hosts, previously ~75s on curl (OS TCP SYN retry limit) and 60s on WinHTTP.

Failed envelopes are stored as <db>/cache/<ts>-<n>-<uuid>.envelope and retried on startup after a 100ms throttle, and then with exponential backoff (15min, 30min, 1h, 2h, 4h, 8h). When retries are exhausted, and offline caching is enabled, envelopes are stored as <db>/cache/<uuid>.envelope instead of being discarded.

flowchart TD
    startup --> sretry{retry?}
    sretry -->|yes| throttle
    throttle -. 100ms .-> send
    send -->|success| discard
    send -->|fail| retry{retry?}
    retry -->|no| cache{cache?}
    cache -->|no| discard
    cache -->|yes| cache-dump[&lt;db&gt;/cache/<br/>&lt;uuid&gt;.envelope]
    retry -->|yes| cache-retry[&lt;db&gt;/cache/<br/>&lt;ts&gt;-&lt;n&gt;-&lt;uuid&gt;.envelope]
    cache-retry --> backoff
    backoff -. 2ⁿ×15min .-> send
Loading

Builds upon:

See also:

Loading
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.

4 participants