Phase 7a: client retries with backoff + gzip @requestCompression + consumer OS matrix - #15
Merged
Merged
Conversation
…flows) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WjaNFwBZxoHdqagvq8ycQf
Client robustness and the first Phase 7 hardening slice: - runtime //runtime:client gains RetryPolicy (full-jitter exponential backoff, injectable sleep/jitter) and SendWithRetries: transport failures flagged retryable and transient statuses (429/500/502/503/504) are retried up to max_attempts (default 3). Generated clients send through it; generated test suites pin max_attempts = 1 to stay wire-exact, and a weather e2e test drives the generated client through transient transport failures. - runtime //runtime:compression (zlib via BCR): GzipCompress / GzipDecompress with a decompression-bomb output cap and trailing-garbage rejection. Generated clients gzip request bodies of @requestCompression operations at the Smithy-default 10 KiB threshold (ClientConfig.request_min_compression_size_bytes), appending to any member-bound Content-Encoding header; generated server routes transparently gunzip such requests and reject malformed gzip with a 400 serialization error. The suite's two client compression cases are un-excluded and green; ~1,175 conformance cases still pass. - consumer CI job now runs the quick-start module on the full OS matrix (linux/macos/windows); bazel/defs.bzl adds //runtime:compression to the generated-library deps. - docs: new production guide (timeouts, retries, compression), runtime overview + server guide + README status updates. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WjaNFwBZxoHdqagvq8ycQf
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.
First Phase 7 hardening slice: client-side retries,
@requestCompression(gzip) on both sides of the wire, and the consumer acceptance job on the full OS matrix.Retries (
//runtime:client)smithy::RetryPolicy— full-jitter exponential backoff (uniform(0, min(max_backoff, initial_backoff × 2^(n-1)))), defaults 3 attempts / 100ms / 20s cap, with injectablesleep/jitterso tests run instantly and deterministically.smithy::SendWithRetriesretries transport failures flagged retryable and the transient statuses every Smithy SDK retries (429/500/502/503/504); everything else returns immediately. Generated clients now send through it.retry.max_attempts = 1to stay wire-exact; a new weather e2e test drives the generated client through transient transport failures and verifies recovery.@requestCompressiongzip (//runtime:compression, zlib via BCR)GzipCompress/GzipDecompresswith a decompression-bomb output cap (64 MB default) and trailing-garbage rejection.@requestCompression(encodings: ["gzip"])operations at leastClientConfig.request_min_compression_size_bytes(Smithy default 10240) are gzipped, appendinggzipto any member-boundContent-Encodingheader.Content-Encoding: gzip(or..., gzip) and reject malformed gzip with a 400 serialization error.SDKAppliedContentEncoding_restJson1,SDKAppendedGzipAfterProvidedEncoding_restJson1) are un-excluded and green; the exclusion list only shrank. ~1,175 conformance cases still pass.Consumer CI OS matrix
The quick-start out-of-tree module job now runs on linux/macos/windows (the consumer
.bazelrcalready carried per-OS C++20 flags), closing the Phase 6 follow-up.Docs
New docs/production-guide.md (timeouts, retry tuning, compression semantics), plus runtime overview, server guide, and README status updates.
Validation
bazel test //...— 43/43 green (gcc and clang, plus ASan+UBSan)bazel/defs.bzl🤖 Generated with Claude Code
https://claude.ai/code/session_01WjaNFwBZxoHdqagvq8ycQf
Generated by Claude Code