Backlog Tier 3. In crates/store/src/backend/s3/mod.rs upstream retries only a 5xx response. A transport error from the client (connection reset, timeout, a Garage node mid-restart) returned straight away through map_err, so the blob read or write failed on the first hiccup; and the first retry slept a full second (1 << attempt seconds, capped at 64 s), which on a user-facing read is already a long wait.
A transport error on GET, PUT, the HEAD after PUT, and DELETE now retries like a 5xx, within the same max_retries budget.
429 is retried too.
The waits run 100 ms, 200 ms, 400 ms ... capped at 5 s (retry_wait, unit-tested). With the default retry count the total wait stays bounded in seconds instead of minutes.
No behaviour change on a 2xx or 404. The S3 store test needs an object store container, so this is covered by the unit test for the schedule and by compile/clippy; production is the real test (Garage rf 3, three nodes).
Backlog Tier 3. In crates/store/src/backend/s3/mod.rs upstream retries only a 5xx response. A transport error from the client (connection reset, timeout, a Garage node mid-restart) returned straight away through map_err, so the blob read or write failed on the first hiccup; and the first retry slept a full second (1 << attempt seconds, capped at 64 s), which on a user-facing read is already a long wait.
- A transport error on GET, PUT, the HEAD after PUT, and DELETE now retries like a 5xx, within the same max_retries budget.
- 429 is retried too.
- The waits run 100 ms, 200 ms, 400 ms ... capped at 5 s (retry_wait, unit-tested). With the default retry count the total wait stays bounded in seconds instead of minutes.
No behaviour change on a 2xx or 404. The S3 store test needs an object store container, so this is covered by the unit test for the schedule and by compile/clippy; production is the real test (Garage rf 3, three nodes).
The S3 backend retried only a 5xx answer: a dropped connection or a
timeout on the way to the object store failed the read or write at
once, and the first retry waited a whole second. A transport error and
a 429 now retry the same way, and the waits run 100 ms, 200 ms, 400 ms
... capped at 5 s, so a Garage node restarting costs a request tenths
of a second rather than failing it.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Backlog Tier 3. In crates/store/src/backend/s3/mod.rs upstream retries only a 5xx response. A transport error from the client (connection reset, timeout, a Garage node mid-restart) returned straight away through map_err, so the blob read or write failed on the first hiccup; and the first retry slept a full second (1 << attempt seconds, capped at 64 s), which on a user-facing read is already a long wait.
No behaviour change on a 2xx or 404. The S3 store test needs an object store container, so this is covered by the unit test for the schedule and by compile/clippy; production is the real test (Garage rf 3, three nodes).