-
Notifications
You must be signed in to change notification settings - Fork 195
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix token bucket not being set for both standard and adaptive retry m…
…odes (#3964) ## Motivation and Context <!--- Why is this change required? What problem does it solve? --> <!--- If it fixes an open issue, please link to the issue here --> awslabs/aws-sdk-rust#1234 ## Description <!--- Describe your changes in detail --> PR adds a new interceptor registered as part of the default retry plugin components that ensures a token bucket is _always_ present and available to the retry strategy. The buckets are partitioned off the retry partition (which defaults to the service name and is already set by the default plugin). We use a `static` variable in the runtime for this which means that token buckets can and will apply to every single client that uses the same retry partition. The implementation tries to avoid contention on this new global lock by only consulting it if the retry partition is overridden after client creation. For AWS SDK clients I've updated the default retry partition clients are created with to include the region when set. Now the default partition for a client will be `{service}-{region}` (e.g. `sts-us-west-2`) rather than just the service name (e.g. `sts`). This partitioning is a little more granular and closer to what we want/expect as failures in one region should not cause throttling to another (and vice versa for success in one should not increase available quota in another). I also updated the implementation to follow the SEP a little more literally/closely as far as structure which fixes some subtle bugs. State is updated in one place and we ensure that the token bucket is always consulted (before the token bucket could be skipped in the case of adaptive retries returning a delay and the adaptive rate limit was updated in multiple branches). ## Testing <!--- Please describe in detail how you tested your changes --> <!--- Include details of your testing environment, and the tests you ran to --> <!--- see how your change affects other areas of the code, etc. --> ## Checklist <!--- If a checkbox below is not applicable, then please DELETE it rather than leaving it unchecked --> - [x ] For changes to the smithy-rs codegen or runtime crates, I have created a changelog entry Markdown file in the `.changelog` directory, specifying "client," "server," or both in the `applies_to` key. - [ x] For changes to the AWS SDK, generated SDK code, or SDK runtime crates, I have created a changelog entry Markdown file in the `.changelog` directory, specifying "aws-sdk-rust" in the `applies_to` key. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._
- Loading branch information
Showing
14 changed files
with
525 additions
and
93 deletions.
There are no files selected for viewing
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
--- | ||
applies_to: | ||
- aws-sdk-rust | ||
- client | ||
authors: | ||
- aajtodd | ||
references: | ||
- aws-sdk-rust#1234 | ||
breaking: false | ||
new_feature: false | ||
bug_fix: true | ||
--- | ||
Fix token bucket not being set for standard and adaptive retry modes |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains 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
This file contains 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
93 changes: 93 additions & 0 deletions
93
aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RetryPartitionTest.kt
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
/* | ||
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
package software.amazon.smithy.rustsdk | ||
|
||
import org.junit.jupiter.api.Test | ||
import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency | ||
import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate | ||
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType | ||
import software.amazon.smithy.rust.codegen.core.testutil.integrationTest | ||
import software.amazon.smithy.rust.codegen.core.testutil.tokioTest | ||
|
||
class RetryPartitionTest { | ||
@Test | ||
fun `default retry partition`() { | ||
awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { ctx, rustCrate -> | ||
val rc = ctx.runtimeConfig | ||
val codegenScope = | ||
arrayOf( | ||
*RuntimeType.preludeScope, | ||
"capture_request" to RuntimeType.captureRequest(rc), | ||
"capture_test_logs" to | ||
CargoDependency.smithyRuntimeTestUtil(rc).toType() | ||
.resolve("test_util::capture_test_logs::capture_test_logs"), | ||
"Credentials" to | ||
AwsRuntimeType.awsCredentialTypesTestUtil(rc) | ||
.resolve("Credentials"), | ||
"Region" to AwsRuntimeType.awsTypes(rc).resolve("region::Region"), | ||
) | ||
|
||
rustCrate.integrationTest("default_retry_partition") { | ||
tokioTest("default_retry_partition_includes_region") { | ||
val moduleName = ctx.moduleUseName() | ||
rustTemplate( | ||
""" | ||
let (_logs, logs_rx) = #{capture_test_logs}(); | ||
let (http_client, _rx) = #{capture_request}(#{None}); | ||
let client_config = $moduleName::Config::builder() | ||
.http_client(http_client) | ||
.region(#{Region}::new("us-west-2")) | ||
.credentials_provider(#{Credentials}::for_tests()) | ||
.build(); | ||
let client = $moduleName::Client::from_conf(client_config); | ||
let _ = client | ||
.some_operation() | ||
.send() | ||
.await | ||
.expect("success"); | ||
let log_contents = logs_rx.contents(); | ||
assert!(log_contents.contains("token bucket for RetryPartition { name: \"dontcare-us-west-2\" } added to config bag")); | ||
""", | ||
*codegenScope, | ||
) | ||
} | ||
|
||
tokioTest("user_config_retry_partition") { | ||
val moduleName = ctx.moduleUseName() | ||
rustTemplate( | ||
""" | ||
let (_logs, logs_rx) = #{capture_test_logs}(); | ||
let (http_client, _rx) = #{capture_request}(#{None}); | ||
let client_config = $moduleName::Config::builder() | ||
.http_client(http_client) | ||
.region(#{Region}::new("us-west-2")) | ||
.credentials_provider(#{Credentials}::for_tests()) | ||
.retry_partition(#{RetryPartition}::new("user-partition")) | ||
.build(); | ||
let client = $moduleName::Client::from_conf(client_config); | ||
let _ = client | ||
.some_operation() | ||
.send() | ||
.await | ||
.expect("success"); | ||
let log_contents = logs_rx.contents(); | ||
assert!(log_contents.contains("token bucket for RetryPartition { name: \"user-partition\" } added to config bag")); | ||
""", | ||
*codegenScope, | ||
"RetryPartition" to RuntimeType.smithyRuntime(ctx.runtimeConfig).resolve("client::retries::RetryPartition"), | ||
) | ||
} | ||
} | ||
} | ||
} | ||
} |
This file contains 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
This file contains 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
This file contains 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
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains 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
Oops, something went wrong.