Repository navigation
Conversation
The S3 assembly thread pool is a setting of the node building the storage resolver, not of the storage configs. Move it into an `S3NodeOptions` struct handed to `StorageResolver::configured_with_s3_node_options`, so other node-level S3 settings can be added without a new resolver constructor. No behavior change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The same transient/permanent classification of SDK errors was repeated in the put, upload part and get paths. Move it to `into_retry`. No behavior change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Move the body of the retried closure of `get_to_bytes`, the GetObject request and the read of its body, to `get_to_bytes_attempt`. No behavior change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Changes recommended
Non-CLI initialization can lose configured S3 timeout protection, and SDK timeouts can be misreported as policy exhaustion.
2 open issues
What changed in this PR
This PR moves S3 slice timeouts inside the storage retry loop so backoff delays no longer consume the download deadline. Other storage backends retain the existing timeout wrapper.
Changes:
- Apply a fresh timeout to each S3 slice attempt, including response-body reads.
- Allow two extra attempts for throttling errors.
- Pass node-specific S3 options through CLI resolver setup and add retry tests.
| File | Description |
|---|---|
quickwit/quickwit-storage/src/storage_resolver.rs |
Accept node-specific S3 options. |
quickwit/quickwit-storage/src/object_storage/s3_compatible_storage.rs |
Implement per-attempt timeouts, metrics, and tests. |
quickwit/quickwit-storage/src/object_storage/s3_compatible_storage_resolver.rs |
Define and apply S3 node options. |
quickwit/quickwit-storage/src/object_storage/mod.rs |
Export S3 node options. |
quickwit/quickwit-storage/src/lib.rs |
Expose S3 node options publicly. |
quickwit/quickwit-search/src/leaf.rs |
Bypass the outer timeout wrapper for S3. |
quickwit/quickwit-config/src/node_config/mod.rs |
Extract single-attempt timeout calculation and document behavior. |
quickwit/quickwit-common/src/retry.rs |
Add throttling classification, extra attempts, and tests. |
quickwit/quickwit-cli/src/tool.rs |
Update resolver options for CLI tools. |
quickwit/quickwit-cli/src/service.rs |
Pass S3 options during service startup. |
quickwit/quickwit-cli/src/lib.rs |
Derive S3 options from node configuration. |
quickwit/quickwit-aws/src/retry.rs |
Forward throttling classification through retry adapters. |
quickwit/quickwit-aws/src/error.rs |
Identify SDK throttling errors from metadata. |
Review effort: Balanced
…longer Signed-off-by: Darkheir <raphael.cohen@sekoia.io>
Darkheir
force-pushed
the
feat/s3-get-slice-attempt-timeout
branch
from
October 23, 2026 15:44
96683de to
9dcd303
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Description
Tip
This PR can be reviewed commit by commit
Only the last commit changes the behavior
storage_timeout_policyused to time the wholeget_slicecall from outside the storage, including S3's own retries and backoff sleeps, so throttling (SlowDown) turned into split failures (internal timeout on get_slice).S3 storages now apply the policy to each attempt (request and body) inside their retry loop: waiting between attempts is no longer counted, and timed-out attempts are retried at most
max_num_retriestimes. Other storages keep the existing wrapper.Throttled requests also get 2 extra attempts (
THROTTLING_EXTRA_ATTEMPTS), spaced by the usual exponential backoff, to outlast short throttling bursts.Throttling (
SlowDown) on a small slice, by how long the bucket keeps rejecting the request:internal timeout on get_sliceat 2sSlowDownerror; the root's split retry still appliesOther cases:
InternalError500) lasting 1.9–3.75smax_num_retries: 0(prod)max_num_retries: 1How was this PR tested?
Added tests