From 6ec977f754682d274385a1002790e496535b78dc Mon Sep 17 00:00:00 2001 From: Dongie Agnir Date: Fri, 10 Apr 2026 16:12:15 -0700 Subject: [PATCH 01/18] Introduce AWS_NEW_RETRIES_2026 feature gate This property will be used to gate the retries update (v 2.1) behind a feature flag. This option defaults to false. --- .../software/amazon/awssdk/core/SdkSystemSetting.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/SdkSystemSetting.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/SdkSystemSetting.java index 65889c2d08fd..759ee4ad4a59 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/SdkSystemSetting.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/SdkSystemSetting.java @@ -263,7 +263,14 @@ public enum SdkSystemSetting implements SystemSetting { * Configure the preferred auth scheme to use. * This is a comma-delimited list of AWS auth scheme names used during signing. */ - AWS_AUTH_SCHEME_PREFERENCE("aws.authSchemePreference", null); + AWS_AUTH_SCHEME_PREFERENCE("aws.authSchemePreference", null), + + /** + * Configure whether v2.1 retry behavior is enabled. When {@code true}, the SDK uses updated retry + * defaults including STANDARD as the default retry mode, reduced base backoff delays, differentiated token bucket + * costs, and other v2.1 retry specification changes. When {@code false} (the default), the SDK uses v2.0 retry behavior. + */ + AWS_NEW_RETRIES_2026("aws.newRetries2026", "false"); private final String systemProperty; private final String defaultValue; From f387f6f9b5868de677dd84da92ee454b78f6f900 Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Mon, 20 Apr 2026 11:43:07 -0700 Subject: [PATCH 02/18] Use AWS_NEW_RETRIES_2026 during mode resolution (#6872) * Use AWS_NEW_RETRIES_2026 during mode resolution * Review comments --- .../amazon/awssdk/core/retry/RetryMode.java | 11 +- .../core/SdkSystemSettingNewRetriesTest.java | 89 +++++++++++++++ .../core/retry/RetryModeGatedDefaultTest.java | 104 ++++++++++++++++++ 3 files changed, 201 insertions(+), 3 deletions(-) create mode 100644 core/sdk-core/src/test/java/software/amazon/awssdk/core/SdkSystemSettingNewRetriesTest.java create mode 100644 core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/RetryModeGatedDefaultTest.java diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/retry/RetryMode.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/retry/RetryMode.java index fdfe4fa68a82..0f233b46326b 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/retry/RetryMode.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/retry/RetryMode.java @@ -130,8 +130,6 @@ public static Resolver resolver() { * Allows customizing the variables used during determination of a {@link RetryMode}. Created via {@link #resolver()}. */ public static class Resolver { - private static final RetryMode SDK_DEFAULT_RETRY_MODE = LEGACY; - private Supplier profileFile; private String profileName; private RetryMode defaultRetryMode; @@ -204,7 +202,14 @@ private static Optional fromString(String string) { } private RetryMode fromDefaultMode() { - return defaultRetryMode != null ? defaultRetryMode : SDK_DEFAULT_RETRY_MODE; + return defaultRetryMode != null ? defaultRetryMode : sdkDefaultRetryMode(); + } + + /** + * Resolves the SDK default retry mode dynamically based on the {@code AWS_NEW_RETRIES_2026} gate. + */ + private static RetryMode sdkDefaultRetryMode() { + return SdkSystemSetting.AWS_NEW_RETRIES_2026.getBooleanValue().orElse(false) ? STANDARD : LEGACY; } } } diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/SdkSystemSettingNewRetriesTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/SdkSystemSettingNewRetriesTest.java new file mode 100644 index 000000000000..a55bcfc324ec --- /dev/null +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/SdkSystemSettingNewRetriesTest.java @@ -0,0 +1,89 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.core; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import software.amazon.awssdk.testutils.EnvironmentVariableHelper; + +/** + * Tests for the {@link SdkSystemSetting#AWS_NEW_RETRIES_2026} system setting. + */ +class SdkSystemSettingNewRetriesTest { + + @AfterEach + void cleanup() { + System.clearProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()); + } + + @Test + void defaultsToFalse_whenUnset() { + assertThat(SdkSystemSetting.AWS_NEW_RETRIES_2026.getBooleanValue()).hasValue(false); + } + + @ParameterizedTest(name = "systemProperty=\"{0}\" -> {1}") + @CsvSource({ + "false, false", + "true, true" + }) + void getBooleanValue_reflectsSystemProperty(String propertyValue, boolean expected) { + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), propertyValue); + assertThat(SdkSystemSetting.AWS_NEW_RETRIES_2026.getBooleanValue()).hasValue(expected); + } + + @ParameterizedTest(name = "envVar=\"{0}\" -> {1}") + @CsvSource({ + "false, false", + "true, true" + }) + void getBooleanValue_reflectsEnvVar(String envVarValue, boolean expected) { + EnvironmentVariableHelper.run(helper -> { + helper.set(SdkSystemSetting.AWS_NEW_RETRIES_2026, envVarValue); + assertThat(SdkSystemSetting.AWS_NEW_RETRIES_2026.getBooleanValue()).hasValue(expected); + }); + } + + @Test + void systemPropertyTakesPrecedenceOverEnvVar() { + EnvironmentVariableHelper.run(helper -> { + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), "false"); + helper.set(SdkSystemSetting.AWS_NEW_RETRIES_2026, "true"); + assertThat(SdkSystemSetting.AWS_NEW_RETRIES_2026.getBooleanValue()).hasValue(false); + }); + } + + @Test + void environmentVariable_isCorrectName() { + assertThat(SdkSystemSetting.AWS_NEW_RETRIES_2026.environmentVariable()) + .isEqualTo("AWS_NEW_RETRIES_2026"); + } + + @Test + void systemProperty_isCorrectName() { + assertThat(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()) + .isEqualTo("aws.newRetries2026"); + } + + @Test + void defaultValue_isFalse() { + assertThat(SdkSystemSetting.AWS_NEW_RETRIES_2026.defaultValue()) + .isEqualTo("false"); + } +} diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/RetryModeGatedDefaultTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/RetryModeGatedDefaultTest.java new file mode 100644 index 000000000000..f14cad1efd9a --- /dev/null +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/RetryModeGatedDefaultTest.java @@ -0,0 +1,104 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.core.retry; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import software.amazon.awssdk.core.SdkSystemSetting; +import software.amazon.awssdk.testutils.EnvironmentVariableHelper; + +/** + * Tests for the gated default {@link RetryMode} behavior controlled by + * {@link SdkSystemSetting#AWS_NEW_RETRIES_2026}. + */ +class RetryModeGatedDefaultTest { + + @BeforeEach + @AfterEach + void cleanup() { + System.clearProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()); + System.clearProperty(SdkSystemSetting.AWS_RETRY_MODE.property()); + } + + @Test + void defaultRetryMode_returnsLegacy_whenGateIsUnset() { + assertThat(RetryMode.defaultRetryMode()).isEqualTo(RetryMode.LEGACY); + } + + @ParameterizedTest(name = "gate=\"{0}\" -> {1}") + @CsvSource({ + "false, LEGACY", + "true, STANDARD" + }) + void defaultRetryMode_reflectsGate_whenSetViaSystemProperty(String gateValue, RetryMode expected) { + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), gateValue); + assertThat(RetryMode.defaultRetryMode()).isEqualTo(expected); + } + + @ParameterizedTest(name = "gate=\"{0}\" -> {1}") + @CsvSource({ + "false, LEGACY", + "true, STANDARD" + }) + void defaultRetryMode_reflectsGate_whenSetViaEnvVar(String gateValue, RetryMode expected) { + EnvironmentVariableHelper.run(helper -> { + helper.set(SdkSystemSetting.AWS_NEW_RETRIES_2026, gateValue); + assertThat(RetryMode.defaultRetryMode()).isEqualTo(expected); + }); + } + + @Test + void defaultRetryMode_changesDynamically_whenGateSystemPropertyChangesAtRuntime() { + // Initially unset — should be LEGACY + assertThat(RetryMode.defaultRetryMode()).isEqualTo(RetryMode.LEGACY); + + // Enable gate — should switch to STANDARD + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), "true"); + assertThat(RetryMode.defaultRetryMode()).isEqualTo(RetryMode.STANDARD); + + // Disable gate — should revert to LEGACY + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), "false"); + assertThat(RetryMode.defaultRetryMode()).isEqualTo(RetryMode.LEGACY); + + // Clear gate — should fall back to default (LEGACY) + System.clearProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()); + assertThat(RetryMode.defaultRetryMode()).isEqualTo(RetryMode.LEGACY); + } + + @ParameterizedTest(name = "gate=\"{0}\" retryMode=\"{1}\" -> {2}") + @CsvSource({ + "true, legacy, LEGACY", + "false, standard, STANDARD", + "false, adaptive, ADAPTIVE_V2" + }) + void resolve_honorsExplicitRetryMode_regardlessOfGate(String gateValue, String retryModeValue, RetryMode expected) { + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), gateValue); + System.setProperty(SdkSystemSetting.AWS_RETRY_MODE.property(), retryModeValue); + assertThat(RetryMode.defaultRetryMode()).isEqualTo(expected); + } + + @Test + void resolve_throwsIllegalStateException_whenInvalidRetryModeConfigured() { + System.setProperty(SdkSystemSetting.AWS_RETRY_MODE.property(), "invalid_mode"); + assertThatThrownBy(RetryMode::defaultRetryMode).isInstanceOf(IllegalStateException.class); + } +} From b18babdb1723c56d6defd595a68a9a9dffca4178 Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Tue, 21 Apr 2026 15:03:44 -0700 Subject: [PATCH 03/18] 2.1 behavior in standard, adaptive strats (#6871) * 2.1 behavior in standard, adaptive strats Support the 2.1 behavior changes in adaptive and standard strategies. This includes the change in constant values based on 2.0 and 2.1, and the application of a different cost for throttling retries in 2.1. The 2.1 behavior is implemented as an overload of the builder() method that accepts a boolean to select between 2.0 and 2.1. The no-arg version defaults to false, i.e. 2.0. * Review comments --- .../awssdk/retries/AdaptiveRetryStrategy.java | 23 ++- .../awssdk/retries/DefaultRetryStrategy.java | 12 +- .../awssdk/retries/StandardRetryStrategy.java | 23 ++- .../retries/internal/BaseRetryStrategy.java | 19 ++- .../DefaultAdaptiveRetryStrategy.java | 5 + .../DefaultStandardRetryStrategy.java | 5 + ...AdaptiveRetryStrategyV21ConstantsTest.java | 137 +++++++++++++++++ ...StandardRetryStrategyV21ConstantsTest.java | 138 ++++++++++++++++++ 8 files changed, 353 insertions(+), 9 deletions(-) create mode 100644 core/retries/src/test/java/software/amazon/awssdk/retries/AdaptiveRetryStrategyV21ConstantsTest.java create mode 100644 core/retries/src/test/java/software/amazon/awssdk/retries/StandardRetryStrategyV21ConstantsTest.java diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/AdaptiveRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/AdaptiveRetryStrategy.java index de4e9127fd68..b398201841bd 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/AdaptiveRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/AdaptiveRetryStrategy.java @@ -15,6 +15,7 @@ package software.amazon.awssdk.retries; +import java.time.Duration; import java.util.function.Predicate; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.annotations.ThreadSafe; @@ -64,15 +65,33 @@ public interface AdaptiveRetryStrategy extends RetryStrategy { * */ static AdaptiveRetryStrategy.Builder builder() { + return builder(false); + } + + /** + * Create a new {@link AdaptiveRetryStrategy.Builder} with v2.0 or v2.1 retry constants. + * + * @param retries2026Enabled when {@code true}, uses v2.1 constants (50ms base delay, differentiated token costs); + * when {@code false}, uses v2.0 constants (100ms base delay, uniform token costs) + */ + static AdaptiveRetryStrategy.Builder builder(boolean retries2026Enabled) { + Duration baseDelay = retries2026Enabled ? DefaultRetryStrategy.Standard.BASE_DELAY_V21 + : DefaultRetryStrategy.Standard.BASE_DELAY_V20; + int exceptionCost = retries2026Enabled ? DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST_V21 + : DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST_V20; + // v2.0 does not treat throttling exceptions differently from others + int throttlingCost = retries2026Enabled ? DefaultRetryStrategy.Standard.THROTTLING_EXCEPTION_TOKEN_COST_V21 + : exceptionCost; return DefaultAdaptiveRetryStrategy .builder() .maxAttempts(DefaultRetryStrategy.Adaptive.MAX_ATTEMPTS) .tokenBucketStore(TokenBucketStore.builder() .tokenBucketMaxCapacity(DefaultRetryStrategy.Standard.TOKEN_BUCKET_SIZE) .build()) - .tokenBucketExceptionCost(DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST) + .tokenBucketExceptionCost(exceptionCost) + .throttlingTokenBucketExceptionCost(throttlingCost) .rateLimiterTokenBucketStore(RateLimiterTokenBucketStore.builder().build()) - .backoffStrategy(BackoffStrategy.exponentialDelay(DefaultRetryStrategy.Standard.BASE_DELAY, + .backoffStrategy(BackoffStrategy.exponentialDelay(baseDelay, DefaultRetryStrategy.Standard.MAX_BACKOFF)) .throttlingBackoffStrategy(BackoffStrategy.exponentialDelay( DefaultRetryStrategy.Standard.THROTTLED_BASE_DELAY, diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/DefaultRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/DefaultRetryStrategy.java index b02709c847e6..879ddd002d49 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/DefaultRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/DefaultRetryStrategy.java @@ -87,11 +87,19 @@ public static AdaptiveRetryStrategy.Builder adaptiveStrategyBuilder() { static final class Standard { static final int MAX_ATTEMPTS = 3; - static final Duration BASE_DELAY = Duration.ofMillis(100); + + // v2.1 constants + static final Duration BASE_DELAY_V21 = Duration.ofMillis(50); + static final int DEFAULT_EXCEPTION_TOKEN_COST_V21 = 14; + static final int THROTTLING_EXCEPTION_TOKEN_COST_V21 = 5; + + // v2.0 constants + static final Duration BASE_DELAY_V20 = Duration.ofMillis(100); + static final int DEFAULT_EXCEPTION_TOKEN_COST_V20 = 5; + static final Duration THROTTLED_BASE_DELAY = Duration.ofSeconds(1); static final Duration MAX_BACKOFF = Duration.ofSeconds(20); static final int TOKEN_BUCKET_SIZE = 500; - static final int DEFAULT_EXCEPTION_TOKEN_COST = 5; private Standard() { } diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/StandardRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/StandardRetryStrategy.java index dff43d017333..8618a1293424 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/StandardRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/StandardRetryStrategy.java @@ -15,6 +15,7 @@ package software.amazon.awssdk.retries; +import java.time.Duration; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.annotations.ThreadSafe; import software.amazon.awssdk.retries.api.BackoffStrategy; @@ -56,6 +57,23 @@ public interface StandardRetryStrategy extends RetryStrategy { * */ static Builder builder() { + return builder(false); + } + + /** + * Create a new {@link StandardRetryStrategy.Builder} with v2.0 or v2.1 retry constants. + * + * @param retries2026Enabled when {@code true}, uses v2.1 constants (50ms base delay, differentiated token costs); + * when {@code false}, uses v2.0 constants (100ms base delay, uniform token costs) + */ + static Builder builder(boolean retries2026Enabled) { + Duration baseDelay = retries2026Enabled ? DefaultRetryStrategy.Standard.BASE_DELAY_V21 + : DefaultRetryStrategy.Standard.BASE_DELAY_V20; + int exceptionCost = retries2026Enabled ? DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST_V21 + : DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST_V20; + // v2.0 does not treat throttling exceptions differently from others + int throttlingCost = retries2026Enabled ? DefaultRetryStrategy.Standard.THROTTLING_EXCEPTION_TOKEN_COST_V21 + : exceptionCost; return DefaultStandardRetryStrategy .builder() .maxAttempts(DefaultRetryStrategy.Standard.MAX_ATTEMPTS) @@ -63,8 +81,9 @@ static Builder builder() { .builder() .tokenBucketMaxCapacity(DefaultRetryStrategy.Standard.TOKEN_BUCKET_SIZE) .build()) - .tokenBucketExceptionCost(DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST) - .backoffStrategy(BackoffStrategy.exponentialDelay(DefaultRetryStrategy.Standard.BASE_DELAY, + .tokenBucketExceptionCost(exceptionCost) + .throttlingTokenBucketExceptionCost(throttlingCost) + .backoffStrategy(BackoffStrategy.exponentialDelay(baseDelay, DefaultRetryStrategy.Standard.MAX_BACKOFF)) .throttlingBackoffStrategy(BackoffStrategy.exponentialDelay(DefaultRetryStrategy.Standard.THROTTLED_BASE_DELAY, DefaultRetryStrategy.Standard.MAX_BACKOFF)); diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/BaseRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/BaseRetryStrategy.java index 89bce90f7155..293c8401f088 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/BaseRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/BaseRetryStrategy.java @@ -57,6 +57,7 @@ public abstract class BaseRetryStrategy implements DefaultAwareRetryStrategy { protected final BackoffStrategy throttlingBackoffStrategy; protected final Predicate treatAsThrottling; protected final int exceptionCost; + protected final int throttlingExceptionCost; protected final TokenBucketStore tokenBucketStore; protected final Set defaultsAdded; protected final boolean useClientDefaults; @@ -71,6 +72,8 @@ public abstract class BaseRetryStrategy implements DefaultAwareRetryStrategy { this.throttlingBackoffStrategy = Validate.paramNotNull(builder.throttlingBackoffStrategy, "throttlingBackoffStrategy"); this.treatAsThrottling = Validate.paramNotNull(builder.treatAsThrottling, "treatAsThrottling"); this.exceptionCost = Validate.paramNotNull(builder.exceptionCost, "exceptionCost"); + this.throttlingExceptionCost = builder.throttlingExceptionCost != null + ? builder.throttlingExceptionCost : this.exceptionCost; this.tokenBucketStore = Validate.paramNotNull(builder.tokenBucketStore, "tokenBucketStore"); this.defaultsAdded = Collections.unmodifiableSet( Validate.paramNotNull(new HashSet<>(builder.defaultsAdded), "defaultsAdded")); @@ -194,10 +197,13 @@ protected void updateStateForRetry(RefreshRetryTokenRequest request) { * amount for the specific kind of failure. */ protected int exceptionCost(RefreshRetryTokenRequest request) { - if (circuitBreakerEnabled) { - return exceptionCost; + if (!circuitBreakerEnabled) { + return 0; } - return 0; + if (treatAsThrottling.test(request.failure())) { + return throttlingExceptionCost; + } + return exceptionCost; } /** @@ -397,6 +403,7 @@ public String toString() { .add("tokenBucketStore", tokenBucketStore) .add("defaultsAdded", defaultsAdded) .add("useClientDefaults", useClientDefaults) + .add("throttlingExceptionCost", throttlingExceptionCost) .build(); } @@ -408,6 +415,7 @@ public abstract static class Builder implements DefaultAwareRetryStrategy.Builde private Boolean circuitBreakerEnabled; private Boolean useClientDefaults; private Integer exceptionCost; + private Integer throttlingExceptionCost; private BackoffStrategy backoffStrategy; private BackoffStrategy throttlingBackoffStrategy; private Predicate treatAsThrottling = throwable -> false; @@ -423,6 +431,7 @@ public abstract static class Builder implements DefaultAwareRetryStrategy.Builde this.maxAttempts = strategy.maxAttempts; this.circuitBreakerEnabled = strategy.circuitBreakerEnabled; this.exceptionCost = strategy.exceptionCost; + this.throttlingExceptionCost = strategy.throttlingExceptionCost; this.backoffStrategy = strategy.backoffStrategy; this.throttlingBackoffStrategy = strategy.throttlingBackoffStrategy; this.treatAsThrottling = strategy.treatAsThrottling; @@ -463,6 +472,10 @@ void setTokenBucketExceptionCost(int exceptionCost) { this.exceptionCost = exceptionCost; } + void setThrottlingTokenBucketExceptionCost(int throttlingExceptionCost) { + this.throttlingExceptionCost = throttlingExceptionCost; + } + void setUseClientDefaults(Boolean useClientDefaults) { this.useClientDefaults = useClientDefaults; } diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultAdaptiveRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultAdaptiveRetryStrategy.java index e5e56b602b39..c52c7859526f 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultAdaptiveRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultAdaptiveRetryStrategy.java @@ -129,6 +129,11 @@ public Builder tokenBucketExceptionCost(int exceptionCost) { return this; } + public Builder throttlingTokenBucketExceptionCost(int throttlingExceptionCost) { + setThrottlingTokenBucketExceptionCost(throttlingExceptionCost); + return this; + } + public Builder rateLimiterTokenBucketStore(RateLimiterTokenBucketStore rateLimiterTokenBucketStore) { this.rateLimiterTokenBucketStore = rateLimiterTokenBucketStore; return this; diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java index 3a6a120fa398..5a10f781ea87 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java @@ -90,6 +90,11 @@ public Builder tokenBucketExceptionCost(int exceptionCost) { return this; } + public Builder throttlingTokenBucketExceptionCost(int throttlingExceptionCost) { + setThrottlingTokenBucketExceptionCost(throttlingExceptionCost); + return this; + } + public Builder tokenBucketStore(TokenBucketStore tokenBucketStore) { setTokenBucketStore(tokenBucketStore); return this; diff --git a/core/retries/src/test/java/software/amazon/awssdk/retries/AdaptiveRetryStrategyV21ConstantsTest.java b/core/retries/src/test/java/software/amazon/awssdk/retries/AdaptiveRetryStrategyV21ConstantsTest.java new file mode 100644 index 000000000000..9cc5ce02dc22 --- /dev/null +++ b/core/retries/src/test/java/software/amazon/awssdk/retries/AdaptiveRetryStrategyV21ConstantsTest.java @@ -0,0 +1,137 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.retries; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.Duration; +import org.junit.jupiter.api.Test; +import software.amazon.awssdk.retries.api.AcquireInitialTokenResponse; +import software.amazon.awssdk.retries.api.RefreshRetryTokenRequest; +import software.amazon.awssdk.retries.api.RefreshRetryTokenResponse; +import software.amazon.awssdk.retries.api.RetryStrategy; +import software.amazon.awssdk.retries.api.RetryToken; +import software.amazon.awssdk.retries.api.internal.AcquireInitialTokenRequestImpl; +import software.amazon.awssdk.retries.internal.DefaultRetryToken; + +/** + * Tests that {@code AdaptiveRetryStrategy.builder(boolean retries2026Enabled)} selects the correct + * v2.0 or v2.1 constants for base delay, exception token cost, and throttling token cost. + */ +class AdaptiveRetryStrategyV21ConstantsTest { + + private static final int BUCKET_CAPACITY = 500; + + @Test + void v21Enabled_nonThrottlingRetry_deducts14Tokens() { + RetryStrategy strategy = AdaptiveRetryStrategy.builder(true) + .retryOnException(t -> true) + .treatAsThrottling(t -> false) + .build(); + + DefaultRetryToken token = retryOnceBeforeSuccess(strategy, new RuntimeException("transient")); + assertThat(token.capacityRemaining()).isEqualTo(BUCKET_CAPACITY - 14); + } + + @Test + void v21Enabled_throttlingRetry_deducts5Tokens() { + RetryStrategy strategy = AdaptiveRetryStrategy.builder(true) + .retryOnException(t -> true) + .treatAsThrottling(t -> true) + .build(); + + DefaultRetryToken token = retryOnceBeforeSuccess(strategy, new RuntimeException("throttled")); + assertThat(token.capacityRemaining()).isEqualTo(BUCKET_CAPACITY - 5); + } + + @Test + void v20_nonThrottlingRetry_deducts5Tokens() { + RetryStrategy strategy = AdaptiveRetryStrategy.builder(false) + .retryOnException(t -> true) + .treatAsThrottling(t -> false) + .build(); + + DefaultRetryToken token = retryOnceBeforeSuccess(strategy, new RuntimeException("transient")); + assertThat(token.capacityRemaining()).isEqualTo(BUCKET_CAPACITY - 5); + } + + @Test + void v20_throttlingRetry_deducts5Tokens() { + RetryStrategy strategy = AdaptiveRetryStrategy.builder(false) + .retryOnException(t -> true) + .treatAsThrottling(t -> true) + .build(); + + DefaultRetryToken token = retryOnceBeforeSuccess(strategy, new RuntimeException("throttled")); + assertThat(token.capacityRemaining()).isEqualTo(BUCKET_CAPACITY - 5); + } + + @Test + void v21Enabled_backoffUses50msBaseDelay() { + RetryStrategy strategy = AdaptiveRetryStrategy.builder(true) + .retryOnException(t -> true) + .build(); + + RefreshRetryTokenResponse response = refreshToken(strategy, new RuntimeException("err")); + // First retry delay should include exponential backoff component in [0, 50ms] + assertThat(response.delay()).isBetween(Duration.ZERO, Duration.ofMillis(50)); + } + + @Test + void v20_backoffUses100msBaseDelay() { + RetryStrategy strategy = AdaptiveRetryStrategy.builder(false) + .retryOnException(t -> true) + .build(); + + RefreshRetryTokenResponse response = refreshToken(strategy, new RuntimeException("err")); + // First retry delay should include exponential backoff component in [0, 100ms] + assertThat(response.delay()).isBetween(Duration.ZERO, Duration.ofMillis(100)); + } + + @Test + void noArgBuilder_usesV20Constants() { + RetryStrategy strategy = AdaptiveRetryStrategy.builder() + .retryOnException(t -> true) + .treatAsThrottling(t -> false) + .build(); + + DefaultRetryToken token = retryOnceBeforeSuccess(strategy, new RuntimeException("transient")); + // v2.0: exception cost is 5 + assertThat(token.capacityRemaining()).isEqualTo(BUCKET_CAPACITY - 5); + } + + /** + * Acquires an initial token, triggers one retry. Returns the token after the retry (before success). + */ + private DefaultRetryToken retryOnceBeforeSuccess(RetryStrategy strategy, Exception failure) { + AcquireInitialTokenResponse initial = strategy.acquireInitialToken(AcquireInitialTokenRequestImpl.create("test")); + RetryToken token = initial.token(); + + RefreshRetryTokenResponse refreshResponse = strategy.refreshRetryToken( + RefreshRetryTokenRequest.builder().token(token).failure(failure).build()); + + return (DefaultRetryToken) refreshResponse.token(); + } + + /** + * Acquires an initial token and triggers one refresh to get the backoff delay. + */ + private RefreshRetryTokenResponse refreshToken(RetryStrategy strategy, Exception failure) { + AcquireInitialTokenResponse initial = strategy.acquireInitialToken(AcquireInitialTokenRequestImpl.create("test")); + return strategy.refreshRetryToken( + RefreshRetryTokenRequest.builder().token(initial.token()).failure(failure).build()); + } +} diff --git a/core/retries/src/test/java/software/amazon/awssdk/retries/StandardRetryStrategyV21ConstantsTest.java b/core/retries/src/test/java/software/amazon/awssdk/retries/StandardRetryStrategyV21ConstantsTest.java new file mode 100644 index 000000000000..16dd17307694 --- /dev/null +++ b/core/retries/src/test/java/software/amazon/awssdk/retries/StandardRetryStrategyV21ConstantsTest.java @@ -0,0 +1,138 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.retries; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.Duration; +import org.junit.jupiter.api.Test; +import software.amazon.awssdk.retries.api.AcquireInitialTokenResponse; +import software.amazon.awssdk.retries.api.BackoffStrategy; +import software.amazon.awssdk.retries.api.RefreshRetryTokenRequest; +import software.amazon.awssdk.retries.api.RefreshRetryTokenResponse; +import software.amazon.awssdk.retries.api.RetryStrategy; +import software.amazon.awssdk.retries.api.RetryToken; +import software.amazon.awssdk.retries.api.internal.AcquireInitialTokenRequestImpl; +import software.amazon.awssdk.retries.internal.DefaultRetryToken; + +/** + * Tests that {@code StandardRetryStrategy.builder(boolean retries2026Enabled)} selects the correct + * v2.0 or v2.1 constants for base delay, exception token cost, and throttling token cost. + */ +class StandardRetryStrategyV21ConstantsTest { + + private static final int BUCKET_CAPACITY = 500; + + @Test + void v21Enabled_nonThrottlingRetry_deducts14Tokens() { + RetryStrategy strategy = StandardRetryStrategy.builder(true) + .retryOnException(t -> true) + .treatAsThrottling(t -> false) + .build(); + + DefaultRetryToken token = retryOnceBeforeSuccess(strategy, new RuntimeException("transient")); + assertThat(token.capacityRemaining()).isEqualTo(BUCKET_CAPACITY - 14); + } + + @Test + void v21Enabled_throttlingRetry_deducts5Tokens() { + RetryStrategy strategy = StandardRetryStrategy.builder(true) + .retryOnException(t -> true) + .treatAsThrottling(t -> true) + .build(); + + DefaultRetryToken token = retryOnceBeforeSuccess(strategy, new RuntimeException("throttled")); + assertThat(token.capacityRemaining()).isEqualTo(BUCKET_CAPACITY - 5); + } + + @Test + void v20_nonThrottlingRetry_deducts5Tokens() { + RetryStrategy strategy = StandardRetryStrategy.builder(false) + .retryOnException(t -> true) + .treatAsThrottling(t -> false) + .build(); + + DefaultRetryToken token = retryOnceBeforeSuccess(strategy, new RuntimeException("transient")); + assertThat(token.capacityRemaining()).isEqualTo(BUCKET_CAPACITY - 5); + } + + @Test + void v20_throttlingRetry_deducts5Tokens() { + RetryStrategy strategy = StandardRetryStrategy.builder(false) + .retryOnException(t -> true) + .treatAsThrottling(t -> true) + .build(); + + DefaultRetryToken token = retryOnceBeforeSuccess(strategy, new RuntimeException("throttled")); + assertThat(token.capacityRemaining()).isEqualTo(BUCKET_CAPACITY - 5); + } + + @Test + void v21Enabled_backoffUses50msBaseDelay() { + RetryStrategy strategy = StandardRetryStrategy.builder(true) + .retryOnException(t -> true) + .build(); + + RefreshRetryTokenResponse response = refreshToken(strategy, new RuntimeException("err")); + // First retry delay should be in [0, 50ms] (jittered) + assertThat(response.delay()).isBetween(Duration.ZERO, Duration.ofMillis(50)); + } + + @Test + void v20_backoffUses100msBaseDelay() { + RetryStrategy strategy = StandardRetryStrategy.builder(false) + .retryOnException(t -> true) + .build(); + + RefreshRetryTokenResponse response = refreshToken(strategy, new RuntimeException("err")); + // First retry delay should be in [0, 100ms] (jittered) + assertThat(response.delay()).isBetween(Duration.ZERO, Duration.ofMillis(100)); + } + + @Test + void noArgBuilder_usesV20Constants() { + RetryStrategy strategy = StandardRetryStrategy.builder() + .retryOnException(t -> true) + .treatAsThrottling(t -> false) + .build(); + + DefaultRetryToken token = retryOnceBeforeSuccess(strategy, new RuntimeException("transient")); + // v2.0: exception cost is 5 + assertThat(token.capacityRemaining()).isEqualTo(BUCKET_CAPACITY - 5); + } + + /** + * Acquires an initial token, triggers one retry. Returns the token after the retry (before success). + */ + private DefaultRetryToken retryOnceBeforeSuccess(RetryStrategy strategy, Exception failure) { + AcquireInitialTokenResponse initial = strategy.acquireInitialToken(AcquireInitialTokenRequestImpl.create("test")); + RetryToken token = initial.token(); + + RefreshRetryTokenResponse refreshResponse = strategy.refreshRetryToken( + RefreshRetryTokenRequest.builder().token(token).failure(failure).build()); + + return (DefaultRetryToken) refreshResponse.token(); + } + + /** + * Acquires an initial token and triggers one refresh to get the backoff delay. + */ + private RefreshRetryTokenResponse refreshToken(RetryStrategy strategy, Exception failure) { + AcquireInitialTokenResponse initial = strategy.acquireInitialToken(AcquireInitialTokenRequestImpl.create("test")); + return strategy.refreshRetryToken( + RefreshRetryTokenRequest.builder().token(initial.token()).failure(failure).build()); + } +} From e528aa4a4dae88d2e47d55e46c47e871536a3d0d Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Thu, 23 Apr 2026 10:34:59 -0700 Subject: [PATCH 04/18] Factor new retries option in client builder (#6887) * Factor new retries option in client builder This commit updates the retry mode resolution behavior for SDK clients: - When resolving the RetryStrategy to use, also determine whether retry 2.1 behavior should be enabled for that retry strategy. - If the `newRetries2026Default` property is set in customization.config for a service, ensure that this is treated as the default option for `AWS_NEW_RETRIES_2026` when building the client if not set anywhere else. * Fix test * Fix test --- .../customization/CustomizationConfig.java | 13 ++ .../poet/builder/BaseClientBuilderClass.java | 7 +- .../builder/BaseClientBuilderClassTest.java | 2 +- ...lient-builder-internal-defaults-class.java | 1 + .../c2j/internalconfig/customization.config | 3 +- .../builder/AwsDefaultClientBuilder.java | 9 +- .../awscore/retry/AwsRetryStrategy.java | 49 +++++- .../client/builder/InternalDefaultsTest.java | 159 ++++++++++++++++++ .../awssdk/retries/DefaultRetryStrategy.java | 44 ++++- .../amazon/awssdk/core/SdkSystemSetting.java | 2 +- .../core/client/config/SdkClientOption.java | 5 + .../retry/SdkDefaultRetryStrategy.java | 23 ++- .../core/retry/NewRetries2026Resolver.java | 56 ++++++ .../amazon/awssdk/core/retry/RetryMode.java | 14 +- .../core/SdkSystemSettingNewRetriesTest.java | 8 +- .../retry/NewRetries2026ResolverTest.java | 110 ++++++++++++ .../awssdk/core/retry/RetryModeTest.java | 93 +++++++--- 17 files changed, 551 insertions(+), 47 deletions(-) create mode 100644 core/aws-core/src/test/java/software/amazon/awssdk/awscore/client/builder/InternalDefaultsTest.java create mode 100644 core/sdk-core/src/main/java/software/amazon/awssdk/core/retry/NewRetries2026Resolver.java create mode 100644 core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/NewRetries2026ResolverTest.java diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java b/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java index c17a83c25030..d3cc24a8eeae 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java @@ -225,6 +225,11 @@ public class CustomizationConfig { private RetryMode defaultRetryMode; + /** + * Whether the client will use retry 2.1 behavior by default. + */ + private Boolean defaultNewRetries2026; + /** * Whether to generate an abstract decorator class that delegates to the async service client */ @@ -714,6 +719,14 @@ public void setDefaultRetryMode(RetryMode defaultRetryMode) { this.defaultRetryMode = defaultRetryMode; } + public Boolean getDefaultNewRetries2026() { + return defaultNewRetries2026; + } + + public void setDefaultNewRetries2026(Boolean defaultNewRetries2026) { + this.defaultNewRetries2026 = defaultNewRetries2026; + } + public ServiceConfig getServiceConfig() { return serviceConfig; } diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClass.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClass.java index 44d8ce154e72..d3c37f92a367 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClass.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClass.java @@ -328,9 +328,10 @@ private void configureEnvironmentBearerToken(MethodSpec.Builder builder) { private Optional mergeInternalDefaultsMethod() { String userAgent = model.getCustomizationConfig().getUserAgent(); RetryMode defaultRetryMode = model.getCustomizationConfig().getDefaultRetryMode(); + Boolean defaultNewRetries2026 = model.getCustomizationConfig().getDefaultNewRetries2026(); // If none of the options are customized, then we do not need to bother overriding the method - if (userAgent == null && defaultRetryMode == null) { + if (userAgent == null && defaultRetryMode == null && defaultNewRetries2026 == null) { return Optional.empty(); } @@ -348,6 +349,10 @@ private Optional mergeInternalDefaultsMethod() { builder.addCode("c.option($T.DEFAULT_RETRY_MODE, $T.$L);\n", SdkClientOption.class, RetryMode.class, defaultRetryMode.name()); } + if (defaultNewRetries2026 != null) { + builder.addCode("c.option($T.DEFAULT_NEW_RETRIES_2026, $L);\n", + SdkClientOption.class, defaultNewRetries2026); + } builder.addCode("});\n"); return Optional.of(builder.build()); } diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClassTest.java b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClassTest.java index ac11be3c716d..52b5677b2d5f 100644 --- a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClassTest.java +++ b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClassTest.java @@ -69,7 +69,7 @@ void baseClientBuilderClassWithNoAuthService_sra() { } @Test - void baseClientBuilderClassWithInternalUserAgent_sra() { + void baseClientBuilderClassWithInternalDefaults_sra() { validateBaseClientBuilderClassGeneration(internalConfigModels(), "test-client-builder-internal-defaults-class.java"); } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-client-builder-internal-defaults-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-client-builder-internal-defaults-class.java index 9b143b9ccd69..5ecb09b82593 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-client-builder-internal-defaults-class.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-client-builder-internal-defaults-class.java @@ -69,6 +69,7 @@ protected final SdkClientConfiguration mergeInternalDefaults(SdkClientConfigurat return config.merge(c -> { c.option(SdkClientOption.INTERNAL_USER_AGENT, "md/foobar"); c.option(SdkClientOption.DEFAULT_RETRY_MODE, RetryMode.STANDARD); + c.option(SdkClientOption.DEFAULT_NEW_RETRIES_2026, true); }); } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/internalconfig/customization.config b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/internalconfig/customization.config index b4e783add53d..594a4aceb54d 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/internalconfig/customization.config +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/internalconfig/customization.config @@ -3,5 +3,6 @@ "skip" : true }, "userAgent": "md/foobar", - "defaultRetryMode": "STANDARD" + "defaultRetryMode": "STANDARD", + "defaultNewRetries2026": "true" } diff --git a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/client/builder/AwsDefaultClientBuilder.java b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/client/builder/AwsDefaultClientBuilder.java index 6f392f6f7324..d97261c3c44d 100644 --- a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/client/builder/AwsDefaultClientBuilder.java +++ b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/client/builder/AwsDefaultClientBuilder.java @@ -54,6 +54,7 @@ import software.amazon.awssdk.core.interceptor.ExecutionInterceptor; import software.amazon.awssdk.core.internal.SdkInternalTestAdvancedClientOption; import software.amazon.awssdk.core.internal.retry.SdkDefaultRetryStrategy; +import software.amazon.awssdk.core.retry.NewRetries2026Resolver; import software.amazon.awssdk.core.retry.RetryMode; import software.amazon.awssdk.core.retry.RetryPolicy; import software.amazon.awssdk.http.SdkHttpClient; @@ -457,12 +458,18 @@ private void configureRetryStrategy(SdkClientConfiguration.Builder config) { } private RetryStrategy resolveAwsRetryStrategy(LazyValueSource config) { + Boolean defaultNewRetries2026 = config.get(SdkClientOption.DEFAULT_NEW_RETRIES_2026); + RetryMode retryMode = RetryMode.resolver() .profileFile(config.get(SdkClientOption.PROFILE_FILE_SUPPLIER)) .profileName(config.get(SdkClientOption.PROFILE_NAME)) .defaultRetryMode(config.get(SdkClientOption.DEFAULT_RETRY_MODE)) + .defaultNewRetries2026(defaultNewRetries2026) .resolve(); - return AwsRetryStrategy.forRetryMode(retryMode); + + NewRetries2026Resolver newRetries2026Resolver = new NewRetries2026Resolver().defaultNewRetries2026(defaultNewRetries2026); + + return AwsRetryStrategy.forRetryMode(retryMode, newRetries2026Resolver.resolve()); } @Override diff --git a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategy.java b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategy.java index 17cd00b58e08..a68b95e503ac 100644 --- a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategy.java +++ b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategy.java @@ -63,17 +63,29 @@ public static RetryStrategy defaultRetryStrategy() { } /** - * Retrieve the appropriate retry strategy for the retry mode with AWS-specific conditions added. + * Retrieve the appropriate retry strategy for the retry mode with AWS-specific conditions added. This is equivalent to + * {@code forRetryMode(mode, false)}. * * @param mode The retry mode for which we want to create a retry strategy. * @return A retry strategy for the given retry mode. */ public static RetryStrategy forRetryMode(RetryMode mode) { + return forRetryMode(mode, false); + } + + /** + * Retrieve the appropriate retry strategy for the retry mode with AWS-specific conditions added. + * + * @param mode The retry mode for which we want to create a retry strategy. + * @param newRetries2026Enabled Whether retries 2.1 behavior is enabled. + * @return A retry strategy for the given retry mode. + */ + public static RetryStrategy forRetryMode(RetryMode mode, boolean newRetries2026Enabled) { switch (mode) { case STANDARD: - return standardRetryStrategy(); + return standardRetryStrategy(newRetries2026Enabled); case ADAPTIVE_V2: - return adaptiveRetryStrategy(); + return adaptiveRetryStrategy(newRetries2026Enabled); case LEGACY: return legacyRetryStrategy(); case ADAPTIVE: @@ -83,6 +95,7 @@ public static RetryStrategy forRetryMode(RetryMode mode) { } } + /** * Update the provided {@link RetryStrategy} to add AWS-specific conditions. * @@ -105,12 +118,23 @@ public static RetryStrategy doNotRetry() { } /** - * Returns a {@link StandardRetryStrategy} with AWS-specific conditions added. + * Returns a {@link StandardRetryStrategy} with AWS-specific conditions added. This is equivalent to {@code + * standardRetryStrategy(false)}. * * @return A {@link StandardRetryStrategy} with AWS-specific conditions added. */ public static StandardRetryStrategy standardRetryStrategy() { - StandardRetryStrategy.Builder builder = SdkDefaultRetryStrategy.standardRetryStrategyBuilder(); + return standardRetryStrategy(false); + } + + /** + * Returns a {@link StandardRetryStrategy} with AWS-specific conditions added. + * + * @param newRetries2026Enabled Whether retries 2.1 behavior is enabled. + * @return A {@link StandardRetryStrategy} with AWS-specific conditions added. + */ + public static StandardRetryStrategy standardRetryStrategy(boolean newRetries2026Enabled) { + StandardRetryStrategy.Builder builder = SdkDefaultRetryStrategy.standardRetryStrategyBuilder(newRetries2026Enabled); return configure(builder).build(); } @@ -126,12 +150,23 @@ public static LegacyRetryStrategy legacyRetryStrategy() { } /** - * Returns an {@link AdaptiveRetryStrategy} with AWS-specific conditions added. + * Returns an {@link AdaptiveRetryStrategy} with AWS-specific conditions added. This is equivalent to {@code + * adaptiveRetryStrategy(false)}. * * @return An {@link AdaptiveRetryStrategy} with AWS-specific conditions added. */ public static AdaptiveRetryStrategy adaptiveRetryStrategy() { - AdaptiveRetryStrategy.Builder builder = SdkDefaultRetryStrategy.adaptiveRetryStrategyBuilder(); + return adaptiveRetryStrategy(false); + } + + /** + * Returns an {@link AdaptiveRetryStrategy} with AWS-specific conditions added. + * + * @param newRetries2026Enabled Whether retries 2.1 behavior is enabled. + * @return An {@link AdaptiveRetryStrategy} with AWS-specific conditions added. + */ + public static AdaptiveRetryStrategy adaptiveRetryStrategy(boolean newRetries2026Enabled) { + AdaptiveRetryStrategy.Builder builder = SdkDefaultRetryStrategy.adaptiveRetryStrategyBuilder(newRetries2026Enabled); return configure(builder) .build(); } diff --git a/core/aws-core/src/test/java/software/amazon/awssdk/awscore/client/builder/InternalDefaultsTest.java b/core/aws-core/src/test/java/software/amazon/awssdk/awscore/client/builder/InternalDefaultsTest.java new file mode 100644 index 000000000000..f397e0bc53a2 --- /dev/null +++ b/core/aws-core/src/test/java/software/amazon/awssdk/awscore/client/builder/InternalDefaultsTest.java @@ -0,0 +1,159 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.awscore.client.builder; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static software.amazon.awssdk.core.client.config.SdkClientOption.RETRY_STRATEGY; + +import java.util.stream.Stream; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import software.amazon.awssdk.core.SdkSystemSetting; +import software.amazon.awssdk.core.client.config.SdkClientConfiguration; +import software.amazon.awssdk.core.client.config.SdkClientOption; +import software.amazon.awssdk.http.SdkHttpClient; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.retries.LegacyRetryStrategy; +import software.amazon.awssdk.retries.StandardRetryStrategy; +import software.amazon.awssdk.testutils.EnvironmentVariableHelper; + +public class InternalDefaultsTest { + private static String newRetries2026Save; + + @BeforeAll + static void setup() { + newRetries2026Save = System.getProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()); + } + + @BeforeEach + void methodSetup() { + System.clearProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()); + } + + @AfterAll + static void teardown() { + if (newRetries2026Save != null) { + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), newRetries2026Save); + } else { + System.clearProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()); + } + } + + @ParameterizedTest(name = "system prop = {0}, env var = {1}, default cfg = {2}, expected = {3}") + @MethodSource("newRetries2026Settings") + void buildClient_precedenceIsCorrect(String systemProperty, String environmentVariable, Boolean defaultConfig, + Class retryStrategyClass) { + EnvironmentVariableHelper.run((env) -> { + if (environmentVariable != null) { + env.set(SdkSystemSetting.AWS_NEW_RETRIES_2026.environmentVariable(), environmentVariable); + } + + if (systemProperty != null) { + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), systemProperty); + } + + TestClient sync = new TestClientBuilder(true) + .newRetries2026Default(defaultConfig) + .buildClient(); + + TestClient async = new TestClientBuilder(false) + .newRetries2026Default(defaultConfig) + .buildClient(); + + assertThat(sync.clientConfiguration.option(RETRY_STRATEGY)).isInstanceOf(retryStrategyClass); + assertThat(async.clientConfiguration.option(RETRY_STRATEGY)).isInstanceOf(retryStrategyClass); + }); + } + + // system property, environment variable, default config, expected retry strategy + static Stream newRetries2026Settings() { + return Stream.of( + Arguments.of(null, null, null, LegacyRetryStrategy.class), + + Arguments.of("true", null, null, StandardRetryStrategy.class), + Arguments.of("false", null, null, LegacyRetryStrategy.class), + Arguments.of(null, "true", null, StandardRetryStrategy.class), + Arguments.of(null, "false", null, LegacyRetryStrategy.class), + Arguments.of(null, null, true, StandardRetryStrategy.class), + Arguments.of(null, null, false, LegacyRetryStrategy.class), + + Arguments.of("true", null, false, StandardRetryStrategy.class), + Arguments.of(null, "true", false, StandardRetryStrategy.class) + ); + } + + private static class TestClient { + private final SdkClientConfiguration clientConfiguration; + + public TestClient(SdkClientConfiguration clientConfiguration) { + this.clientConfiguration = clientConfiguration; + } + } + + private static class TestClientBuilder extends AwsDefaultClientBuilder { + private final boolean sync; + private Boolean newRetries2026Default; + + protected TestClientBuilder(boolean sync) { + super(mock(SdkHttpClient.Builder.class), mock(SdkAsyncHttpClient.Builder.class), null); + this.sync = sync; + } + + public TestClientBuilder newRetries2026Default(Boolean newRetries2026Default) { + this.newRetries2026Default = newRetries2026Default; + return this; + } + + @Override + protected String serviceEndpointPrefix() { + return "test-client"; + } + + @Override + protected String signingName() { + return "test-client"; + } + + @Override + protected String serviceName() { + return "test-client"; + } + + @Override + protected final SdkClientConfiguration mergeInternalDefaults(SdkClientConfiguration config) { + return config.merge(c -> { + c.option(SdkClientOption.DEFAULT_NEW_RETRIES_2026, newRetries2026Default); + }); + } + + @Override + protected TestClient buildClient() { + SdkClientConfiguration config; + if (sync) { + config = syncClientConfiguration(); + } else { + config = asyncClientConfiguration(); + } + + return new TestClient(config); + } + } +} diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/DefaultRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/DefaultRetryStrategy.java index 879ddd002d49..84540992b04c 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/DefaultRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/DefaultRetryStrategy.java @@ -38,7 +38,7 @@ public static StandardRetryStrategy doNotRetry() { } /** - * Create a new builder for a {@link StandardRetryStrategy}. + * Create a new builder for a {@link StandardRetryStrategy}. This is equivalent to {@code standardStrategyBuilder(false)}. * *

Example Usage * {@snippet @@ -50,7 +50,25 @@ public static StandardRetryStrategy doNotRetry() { * } */ public static StandardRetryStrategy.Builder standardStrategyBuilder() { - return StandardRetryStrategy.builder(); + return standardStrategyBuilder(false); + } + + /** + * Create a new builder for a {@link StandardRetryStrategy}. This is equivalent to {@code standardStrategyBuilder(false)}. + * + *

Example Usage + * {@snippet + * StandardRetryStrategy retryStrategy = + * DefaultRetryStrategy.standardStrategyBuilder(true) + * .retryOnExceptionInstanceOf(IllegalArgumentException.class) + * .retryOnExceptionInstanceOf(IllegalStateException.class) + * .build(); + * } + * + * @param retries2026Enabled Whether retries 2.1 behavior is used. + */ + public static StandardRetryStrategy.Builder standardStrategyBuilder(boolean retries2026Enabled) { + return StandardRetryStrategy.builder(retries2026Enabled); } /** @@ -70,7 +88,7 @@ public static LegacyRetryStrategy.Builder legacyStrategyBuilder() { } /** - * Create a new builder for a {@link AdaptiveRetryStrategy}. + * Create a new builder for a {@link AdaptiveRetryStrategy}. This is equivalent to {@code adaptiveStrategyBuilder(false)}. * *

Example Usage * {@snippet @@ -82,7 +100,25 @@ public static LegacyRetryStrategy.Builder legacyStrategyBuilder() { * } */ public static AdaptiveRetryStrategy.Builder adaptiveStrategyBuilder() { - return AdaptiveRetryStrategy.builder(); + return adaptiveStrategyBuilder(false); + } + + /** + * Create a new builder for a {@link AdaptiveRetryStrategy}. + * + *

Example Usage + * {@snippet + * AdaptiveRetryStrategy retryStrategy = + * DefaultRetryStrategy.adaptiveStrategyBuilder(true) + * .retryOnExceptionInstanceOf(IllegalArgumentException.class) + * .retryOnExceptionInstanceOf(IllegalStateException.class) + * .build(); + * } + * + * @param retries2026Enabled Whether retries 2.1 behavior is used. + */ + public static AdaptiveRetryStrategy.Builder adaptiveStrategyBuilder(boolean retries2026Enabled) { + return AdaptiveRetryStrategy.builder(retries2026Enabled); } static final class Standard { diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/SdkSystemSetting.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/SdkSystemSetting.java index 759ee4ad4a59..db0ee4d67f8f 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/SdkSystemSetting.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/SdkSystemSetting.java @@ -270,7 +270,7 @@ public enum SdkSystemSetting implements SystemSetting { * defaults including STANDARD as the default retry mode, reduced base backoff delays, differentiated token bucket * costs, and other v2.1 retry specification changes. When {@code false} (the default), the SDK uses v2.0 retry behavior. */ - AWS_NEW_RETRIES_2026("aws.newRetries2026", "false"); + AWS_NEW_RETRIES_2026("aws.newRetries2026", null); private final String systemProperty; private final String defaultValue; diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/client/config/SdkClientOption.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/client/config/SdkClientOption.java index 53dfcc52d6bb..0e20334e9ecd 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/client/config/SdkClientOption.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/client/config/SdkClientOption.java @@ -306,6 +306,11 @@ public final class SdkClientOption extends ClientOption { */ public static final SdkClientOption DEFAULT_RETRY_MODE = new SdkClientOption<>(RetryMode.class); + /** + * Option to specify the default for the {@code AWS_NEW_RETRIES_2026} feature gate for the SDK client. + */ + public static final SdkClientOption DEFAULT_NEW_RETRIES_2026 = new SdkClientOption<>(Boolean.class); + /** * The {@link EndpointProvider} configured on the client. */ diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/retry/SdkDefaultRetryStrategy.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/retry/SdkDefaultRetryStrategy.java index bc7685b6126c..ea4aae5e1869 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/retry/SdkDefaultRetryStrategy.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/retry/SdkDefaultRetryStrategy.java @@ -139,10 +139,20 @@ public static AdaptiveRetryStrategy adaptiveRetryStrategy() { * @return a {@link StandardRetryStrategy.Builder} with preconfigured generic SDK retry conditions. */ public static StandardRetryStrategy.Builder standardRetryStrategyBuilder() { - StandardRetryStrategy.Builder builder = DefaultRetryStrategy.standardStrategyBuilder(); + return standardRetryStrategyBuilder(false); + } + + /** + * Returns a {@link StandardRetryStrategy.Builder} with preconfigured generic SDK retry conditions. + * + * @return a {@link StandardRetryStrategy.Builder} with preconfigured generic SDK retry conditions. + */ + public static StandardRetryStrategy.Builder standardRetryStrategyBuilder(boolean newRetries2026Enabled) { + StandardRetryStrategy.Builder builder = DefaultRetryStrategy.standardStrategyBuilder(newRetries2026Enabled); return configure(builder); } + /** * Returns a {@link LegacyRetryStrategy.Builder} with preconfigured generic SDK retry conditions. * @@ -159,7 +169,16 @@ public static LegacyRetryStrategy.Builder legacyRetryStrategyBuilder() { * @return an {@link AdaptiveRetryStrategy.Builder} with preconfigured generic SDK retry conditions. */ public static AdaptiveRetryStrategy.Builder adaptiveRetryStrategyBuilder() { - AdaptiveRetryStrategy.Builder builder = DefaultRetryStrategy.adaptiveStrategyBuilder(); + return adaptiveRetryStrategyBuilder(false); + } + + /** + * Returns an {@link AdaptiveRetryStrategy.Builder} with preconfigured generic SDK retry conditions. + * + * @return an {@link AdaptiveRetryStrategy.Builder} with preconfigured generic SDK retry conditions. + */ + public static AdaptiveRetryStrategy.Builder adaptiveRetryStrategyBuilder(boolean newRetries2026Enabled) { + AdaptiveRetryStrategy.Builder builder = DefaultRetryStrategy.adaptiveStrategyBuilder(newRetries2026Enabled); return configure(builder); } diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/retry/NewRetries2026Resolver.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/retry/NewRetries2026Resolver.java new file mode 100644 index 000000000000..142583b15c2c --- /dev/null +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/retry/NewRetries2026Resolver.java @@ -0,0 +1,56 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.core.retry; + +import java.util.Optional; +import software.amazon.awssdk.annotations.SdkProtectedApi; +import software.amazon.awssdk.core.SdkSystemSetting; + +/** + * Resolver for the {@link SdkSystemSetting#AWS_NEW_RETRIES_2026} that supports setting a fallback value if not defined in the + * environment or system properties. + */ +@SdkProtectedApi +public final class NewRetries2026Resolver { + private Boolean defaultNewRetries2026; + + /** + * The default value for {@code AWS_NEW_RETRIES_2026} if not configured via {@link SdkSystemSetting#AWS_NEW_RETRIES_2026}. + * + * @return This resolver for method chaining. + */ + public NewRetries2026Resolver defaultNewRetries2026(Boolean defaultNewRetries2026) { + this.defaultNewRetries2026 = defaultNewRetries2026; + return this; + } + + /** + * Resolve whether retries v2.1 is used. + */ + public boolean resolve() { + Optional envConfig = SdkSystemSetting.AWS_NEW_RETRIES_2026.getBooleanValue(); + + if (envConfig.isPresent()) { + return envConfig.get(); + } + + if (defaultNewRetries2026 != null) { + return defaultNewRetries2026; + } + + return false; + } +} diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/retry/RetryMode.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/retry/RetryMode.java index 0f233b46326b..3d616446eafb 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/retry/RetryMode.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/retry/RetryMode.java @@ -133,6 +133,7 @@ public static class Resolver { private Supplier profileFile; private String profileName; private RetryMode defaultRetryMode; + private Boolean defaultNewRetries2026; private Resolver() { } @@ -162,6 +163,15 @@ public Resolver defaultRetryMode(RetryMode defaultRetryMode) { return this; } + /** + * Configure whether retry 2.1 behavior is enabled by default if not specified anywhere else (i.e. via + * {@link SdkSystemSetting#AWS_NEW_RETRIES_2026}). + */ + public Resolver defaultNewRetries2026(Boolean defaultNewRetries2026) { + this.defaultNewRetries2026 = defaultNewRetries2026; + return this; + } + /** * Resolve which retry mode should be used, based on the configured values. */ @@ -208,8 +218,8 @@ private RetryMode fromDefaultMode() { /** * Resolves the SDK default retry mode dynamically based on the {@code AWS_NEW_RETRIES_2026} gate. */ - private static RetryMode sdkDefaultRetryMode() { - return SdkSystemSetting.AWS_NEW_RETRIES_2026.getBooleanValue().orElse(false) ? STANDARD : LEGACY; + private RetryMode sdkDefaultRetryMode() { + return new NewRetries2026Resolver().defaultNewRetries2026(defaultNewRetries2026).resolve() ? STANDARD : LEGACY; } } } diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/SdkSystemSettingNewRetriesTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/SdkSystemSettingNewRetriesTest.java index a55bcfc324ec..0a32d18f0129 100644 --- a/core/sdk-core/src/test/java/software/amazon/awssdk/core/SdkSystemSettingNewRetriesTest.java +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/SdkSystemSettingNewRetriesTest.java @@ -34,8 +34,8 @@ void cleanup() { } @Test - void defaultsToFalse_whenUnset() { - assertThat(SdkSystemSetting.AWS_NEW_RETRIES_2026.getBooleanValue()).hasValue(false); + void defaultsToEmpty_whenUnset() { + assertThat(SdkSystemSetting.AWS_NEW_RETRIES_2026.getBooleanValue()).isEmpty(); } @ParameterizedTest(name = "systemProperty=\"{0}\" -> {1}") @@ -82,8 +82,8 @@ void systemProperty_isCorrectName() { } @Test - void defaultValue_isFalse() { + void defaultValue_isNull() { assertThat(SdkSystemSetting.AWS_NEW_RETRIES_2026.defaultValue()) - .isEqualTo("false"); + .isNull(); } } diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/NewRetries2026ResolverTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/NewRetries2026ResolverTest.java new file mode 100644 index 000000000000..573d0fff22f0 --- /dev/null +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/NewRetries2026ResolverTest.java @@ -0,0 +1,110 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.core.retry; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.stream.Stream; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import software.amazon.awssdk.core.SdkSystemSetting; +import software.amazon.awssdk.testutils.EnvironmentVariableHelper; + +public class NewRetries2026ResolverTest { + private static String newRetries2026Save; + + @BeforeAll + static void setup() { + newRetries2026Save = System.getProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()); + } + + @AfterAll + static void teardown() { + if (newRetries2026Save != null) { + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), newRetries2026Save); + } else { + System.clearProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()); + } + } + + @BeforeEach + void methodSetup() { + System.clearProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()); + } + + @ParameterizedTest + @MethodSource("params") + void resolve_behavesCorrectly(TestParams params) { + EnvironmentVariableHelper.run((env) -> { + if (params.systemProperty != null) { + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), params.systemProperty); + } + + if (params.envVar != null) { + env.set(SdkSystemSetting.AWS_NEW_RETRIES_2026.environmentVariable(), params.envVar); + } + + NewRetries2026Resolver resolver = new NewRetries2026Resolver().defaultNewRetries2026(params.defaultNewRetries2026); + + assertThat(resolver.resolve()).isEqualTo(params.expected); + }); + } + + private static Stream params() { + return Stream.of( + // default + new TestParams().expected(false), + + // precedence testing + new TestParams().systemProperty("true").defaultNewRetries2026(true).expected(true), + new TestParams().systemProperty("false").defaultNewRetries2026(true).expected(false), + new TestParams().envVar("true").defaultNewRetries2026(true).expected(true), + new TestParams().envVar("false").defaultNewRetries2026(true).expected(false), + new TestParams().defaultNewRetries2026(true).expected(true), + new TestParams().defaultNewRetries2026(false).expected(false) + ); + } + + private static class TestParams { + private String systemProperty; + private String envVar; + private Boolean defaultNewRetries2026; + private boolean expected; + + public TestParams systemProperty(String systemProperty) { + this.systemProperty = systemProperty; + return this; + } + + public TestParams envVar(String envVar) { + this.envVar = envVar; + return this; + } + + public TestParams defaultNewRetries2026(Boolean defaultNewRetries2026) { + this.defaultNewRetries2026 = defaultNewRetries2026; + return this; + } + + public TestParams expected(boolean expected) { + this.expected = expected; + return this; + } + } +} diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/RetryModeTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/RetryModeTest.java index b5fb23c37ed4..40fca37c82e3 100644 --- a/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/RetryModeTest.java +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/RetryModeTest.java @@ -44,34 +44,57 @@ public class RetryModeTest { public static Collection data() { return Arrays.asList(new Object[] { // Test defaults - new TestData(null, null, null, null, RetryMode.LEGACY), - new TestData(null, null, "PropertyNotSet", null, RetryMode.LEGACY), + new TestData(null, null, null, null, null, null, null, RetryMode.LEGACY), + new TestData(null, null, "PropertyNotSet", null, null, null, null, RetryMode.LEGACY), + + // default + new retries 2026 + new TestData(null, null, null, null, "true", null, null, RetryMode.STANDARD), + new TestData(null, null, null, null, null, "true", null, RetryMode.STANDARD), + new TestData(null, null, null, null, null, null, true, RetryMode.STANDARD), + + // new retries 2026 precedence + new TestData(null, null, null, null, "false", null, true, RetryMode.LEGACY), + new TestData(null, null, null, null, null, "false", true, RetryMode.LEGACY), // Test resolution - new TestData("legacy", null, null, null, RetryMode.LEGACY), - new TestData("standard", null, null, null, RetryMode.STANDARD), - new TestData("adaptive", null, null, null, RetryMode.ADAPTIVE_V2), - new TestData("lEgAcY", null, null, null, RetryMode.LEGACY), - new TestData("sTanDaRd", null, null, null, RetryMode.STANDARD), - new TestData("aDaPtIvE", null, null, null, RetryMode.ADAPTIVE_V2), + new TestData("legacy", null, null, null, null, null, null, RetryMode.LEGACY), + new TestData("standard", null, null, null, null, null, null, RetryMode.STANDARD), + new TestData("adaptive", null, null, null, null, null, null, RetryMode.ADAPTIVE_V2), + new TestData("lEgAcY", null, null, null, null, null, null, RetryMode.LEGACY), + new TestData("sTanDaRd", null, null, null, null, null, null, RetryMode.STANDARD), + new TestData("aDaPtIvE", null, null, null, null, null, null, RetryMode.ADAPTIVE_V2), + + // new retries 2026 does not have an effect if retry mode set explicitly + new TestData("legacy", null, null, null, "true", null, null, RetryMode.LEGACY), + new TestData("standard", null, null, null, "true", null, null, RetryMode.STANDARD), + new TestData("adaptive", null, null, null, "true", null, null, RetryMode.ADAPTIVE_V2), + new TestData("lEgAcY", null, null, null, "true", null, null, RetryMode.LEGACY), + new TestData("sTanDaRd", null, null, null, "true", null, null, RetryMode.STANDARD), + new TestData("aDaPtIvE", null, null, null, "true", null, null, RetryMode.ADAPTIVE_V2), + new TestData("legacy", null, null, null, "false", null, null, RetryMode.LEGACY), + new TestData("standard", null, null, null, "false", null, null, RetryMode.STANDARD), + new TestData("adaptive", null, null, null, "false", null, null, RetryMode.ADAPTIVE_V2), + new TestData("lEgAcY", null, null, null, "false", null, null, RetryMode.LEGACY), + new TestData("sTanDaRd", null, null, null, "false", null, null, RetryMode.STANDARD), + new TestData("aDaPtIvE", null, null, null, "false", null, null, RetryMode.ADAPTIVE_V2), // Test precedence - new TestData("standard", "legacy", "PropertySetToLegacy", RetryMode.LEGACY, RetryMode.STANDARD), - new TestData("standard", null, null, RetryMode.LEGACY, RetryMode.STANDARD), - new TestData(null, "standard", "PropertySetToLegacy", RetryMode.LEGACY, RetryMode.STANDARD), - new TestData(null, "standard", null, RetryMode.LEGACY, RetryMode.STANDARD), - new TestData(null, null, "PropertySetToStandard", RetryMode.LEGACY, RetryMode.STANDARD), - new TestData(null, null, null, RetryMode.STANDARD, RetryMode.STANDARD), + new TestData("standard", "legacy", "PropertySetToLegacy", RetryMode.LEGACY, null, null, null, RetryMode.STANDARD), + new TestData("standard", null, null, RetryMode.LEGACY, null, null, null, RetryMode.STANDARD), + new TestData(null, "standard", "PropertySetToLegacy", RetryMode.LEGACY, null, null, null, RetryMode.STANDARD), + new TestData(null, "standard", null, RetryMode.LEGACY, null, null, null, RetryMode.STANDARD), + new TestData(null, null, "PropertySetToStandard", RetryMode.LEGACY, null, null, null, RetryMode.STANDARD), + new TestData(null, null, null, RetryMode.STANDARD, null, null, null, RetryMode.STANDARD), // Test invalid values - new TestData("wrongValue", null, null, null, IllegalStateException.class), - new TestData(null, "wrongValue", null, null, IllegalStateException.class), - new TestData(null, null, "PropertySetToUnsupportedValue", null, IllegalStateException.class), + new TestData("wrongValue", null, null, null, null, null, null, IllegalStateException.class), + new TestData(null, "wrongValue", null, null, null, null, null, IllegalStateException.class), + new TestData(null, null, "PropertySetToUnsupportedValue", null, null, null, null, IllegalStateException.class), // Test capitalization standardization - new TestData("sTaNdArD", null, null, null, RetryMode.STANDARD), - new TestData(null, "sTaNdArD", null, null, RetryMode.STANDARD), - new TestData(null, null, "PropertyMixedCase", null, RetryMode.STANDARD), + new TestData("sTaNdArD", null, null, null, null, null, null, RetryMode.STANDARD), + new TestData(null, "sTaNdArD", null, null, null, null, null, RetryMode.STANDARD), + new TestData(null, null, "PropertyMixedCase", null, null, null, null, RetryMode.STANDARD), }); } @@ -82,6 +105,8 @@ public void methodSetup() { System.clearProperty(SdkSystemSetting.AWS_RETRY_MODE.property()); System.clearProperty(ProfileFileSystemSetting.AWS_PROFILE.property()); System.clearProperty(ProfileFileSystemSetting.AWS_CONFIG_FILE.property()); + + System.clearProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()); } @Test @@ -101,7 +126,18 @@ public void differentCombinationOfConfigs_shouldResolveCorrectly() throws Except System.setProperty(ProfileFileSystemSetting.AWS_CONFIG_FILE.property(), diskLocationForFile); } - Callable result = RetryMode.resolver().defaultRetryMode(testData.defaultMode)::resolve; + if (testData.newRetries2026EnvVarValue != null) { + ENVIRONMENT_VARIABLE_HELPER.set(SdkSystemSetting.AWS_NEW_RETRIES_2026.environmentVariable(), + testData.newRetries2026EnvVarValue); + } + + if (testData.newRetries2026SystemProperty != null) { + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), testData.newRetries2026SystemProperty); + } + + Callable result = RetryMode.resolver() + .defaultRetryMode(testData.defaultMode) + .defaultNewRetries2026(testData.defaultNewRetries2026)::resolve; if (testData.expected instanceof Class) { Class expectedClassType = (Class) testData.expected; assertThatThrownBy(result::call).isInstanceOf(expectedClassType); @@ -120,14 +156,25 @@ private static class TestData { private final String systemProperty; private final String configFile; private final RetryMode defaultMode; + + private final String newRetries2026SystemProperty; + private final String newRetries2026EnvVarValue; + private final Boolean defaultNewRetries2026; + + private final Object expected; - TestData(String systemProperty, String envVarValue, String configFile, RetryMode defaultMode, Object expected) { + TestData(String systemProperty, String envVarValue, String configFile, RetryMode defaultMode, + String newRetries2026SystemProperty, String newRetries2026EnvVarValue, Boolean defaultNewRetries2026, + Object expected) { this.envVarValue = envVarValue; this.systemProperty = systemProperty; this.configFile = configFile; this.defaultMode = defaultMode; + this.newRetries2026SystemProperty = newRetries2026SystemProperty; + this.newRetries2026EnvVarValue = newRetries2026EnvVarValue; + this.defaultNewRetries2026 = defaultNewRetries2026; this.expected = expected; } } -} \ No newline at end of file +} From 941e8b272c491765b2f4f05e895028be22dc0572 Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Fri, 24 Apr 2026 11:05:53 -0700 Subject: [PATCH 05/18] Support backoff for long-polling (#6899) * Support backoff for long-polling For operations that are long-polling, support backoffs in the Standard retry strategy even there is insufficient retry quota. * Review comments * Fix checkstyle --- .../retries/api/RefreshRetryTokenRequest.java | 14 + .../api/TokenAcquisitionFailedException.java | 22 ++ .../RefreshRetryTokenRequestImpl.java | 15 ++ .../awssdk/retries/StandardRetryStrategy.java | 1 + .../retries/internal/BaseRetryStrategy.java | 18 +- .../DefaultStandardRetryStrategy.java | 25 ++ .../internal/StandardRetryStrategyTest.java | 254 ++++++++++++++++++ 7 files changed, 346 insertions(+), 3 deletions(-) create mode 100644 core/retries/src/test/java/software/amazon/awssdk/retries/internal/StandardRetryStrategyTest.java diff --git a/core/retries-spi/src/main/java/software/amazon/awssdk/retries/api/RefreshRetryTokenRequest.java b/core/retries-spi/src/main/java/software/amazon/awssdk/retries/api/RefreshRetryTokenRequest.java index ce3ca4190baa..0bdb4b203ec2 100644 --- a/core/retries-spi/src/main/java/software/amazon/awssdk/retries/api/RefreshRetryTokenRequest.java +++ b/core/retries-spi/src/main/java/software/amazon/awssdk/retries/api/RefreshRetryTokenRequest.java @@ -43,6 +43,13 @@ public interface RefreshRetryTokenRequest extends ToCopyableBuilder suggestedDelay(); + /** + * Whether the operation that is being retried is a long polling operation. Returns {@code false} by default. + */ + default boolean isLongPolling() { + return false; + } + /** * The cause of the last attempt failure. */ @@ -66,6 +73,13 @@ interface Builder extends CopyableBuilder { */ Builder suggestedDelay(Duration duration); + /** + * Configures whether this refresh request is for a long polling operation. The default implementation is a no-op. + */ + default Builder isLongPolling(boolean isLongPolling) { + return this; + } + /** * Configures the latest caught exception. */ diff --git a/core/retries-spi/src/main/java/software/amazon/awssdk/retries/api/TokenAcquisitionFailedException.java b/core/retries-spi/src/main/java/software/amazon/awssdk/retries/api/TokenAcquisitionFailedException.java index 1815288bf1d6..dd788e3fcfb5 100644 --- a/core/retries-spi/src/main/java/software/amazon/awssdk/retries/api/TokenAcquisitionFailedException.java +++ b/core/retries-spi/src/main/java/software/amazon/awssdk/retries/api/TokenAcquisitionFailedException.java @@ -15,6 +15,8 @@ package software.amazon.awssdk.retries.api; +import java.time.Duration; +import java.util.Optional; import software.amazon.awssdk.annotations.SdkPublicApi; /** @@ -23,6 +25,7 @@ @SdkPublicApi public final class TokenAcquisitionFailedException extends RuntimeException { private final transient RetryToken token; + private final transient Duration delay; /** * Exception construction accepting message with no root cause. @@ -30,6 +33,7 @@ public final class TokenAcquisitionFailedException extends RuntimeException { public TokenAcquisitionFailedException(String msg) { super(msg); token = null; + delay = null; } /** @@ -38,6 +42,7 @@ public TokenAcquisitionFailedException(String msg) { public TokenAcquisitionFailedException(String msg, Throwable cause) { super(msg, cause); token = null; + delay = null; } /** @@ -46,6 +51,23 @@ public TokenAcquisitionFailedException(String msg, Throwable cause) { public TokenAcquisitionFailedException(String msg, RetryToken token, Throwable cause) { super(msg, cause); this.token = token; + this.delay = null; + } + + /** + * Exception constructor accepting message, retry token, a root cause, and delay. + */ + public TokenAcquisitionFailedException(String msg, RetryToken token, Throwable cause, Duration delay) { + super(msg, cause); + this.token = token; + this.delay = delay; + } + + /** + * The amount of time to wait before returning to the caller. + */ + public Optional delay() { + return Optional.ofNullable(delay); } /** diff --git a/core/retries-spi/src/main/java/software/amazon/awssdk/retries/api/internal/RefreshRetryTokenRequestImpl.java b/core/retries-spi/src/main/java/software/amazon/awssdk/retries/api/internal/RefreshRetryTokenRequestImpl.java index fe90983b4839..8ba16245293b 100644 --- a/core/retries-spi/src/main/java/software/amazon/awssdk/retries/api/internal/RefreshRetryTokenRequestImpl.java +++ b/core/retries-spi/src/main/java/software/amazon/awssdk/retries/api/internal/RefreshRetryTokenRequestImpl.java @@ -29,12 +29,14 @@ public final class RefreshRetryTokenRequestImpl implements RefreshRetryTokenRequest { private final RetryToken token; private final Duration suggestedDelay; + private final boolean isLongPolling; private final Throwable failure; private RefreshRetryTokenRequestImpl(Builder builder) { this.token = Validate.paramNotNull(builder.token, "token"); this.suggestedDelay = Validate.paramNotNull(builder.suggestedDelay, "suggestedDelay"); Validate.isNotNegative(this.suggestedDelay, "suggestedDelay"); + this.isLongPolling = builder.isLongPolling; this.failure = Validate.paramNotNull(builder.failure, "failure"); } @@ -48,6 +50,11 @@ public Optional suggestedDelay() { return Optional.of(suggestedDelay); } + @Override + public boolean isLongPolling() { + return isLongPolling; + } + @Override public Throwable failure() { return failure; @@ -68,11 +75,13 @@ public static Builder builder() { public static final class Builder implements RefreshRetryTokenRequest.Builder { private RetryToken token; private Duration suggestedDelay = Duration.ZERO; + private boolean isLongPolling; private Throwable failure; Builder(RefreshRetryTokenRequestImpl refreshRetryTokenRequest) { this.token = refreshRetryTokenRequest.token; this.suggestedDelay = refreshRetryTokenRequest.suggestedDelay; + this.isLongPolling = refreshRetryTokenRequest.isLongPolling; this.failure = refreshRetryTokenRequest.failure; } @@ -91,6 +100,12 @@ public Builder suggestedDelay(Duration duration) { return this; } + @Override + public RefreshRetryTokenRequest.Builder isLongPolling(boolean isLongPolling) { + this.isLongPolling = isLongPolling; + return this; + } + @Override public Builder failure(Throwable throwable) { this.failure = throwable; diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/StandardRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/StandardRetryStrategy.java index 8618a1293424..7bf0bef22db7 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/StandardRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/StandardRetryStrategy.java @@ -76,6 +76,7 @@ static Builder builder(boolean retries2026Enabled) { : exceptionCost; return DefaultStandardRetryStrategy .builder() + .retries2026Enabled(retries2026Enabled) .maxAttempts(DefaultRetryStrategy.Standard.MAX_ATTEMPTS) .tokenBucketStore(TokenBucketStore .builder() diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/BaseRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/BaseRetryStrategy.java index 293c8401f088..15656ab96e5b 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/BaseRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/BaseRetryStrategy.java @@ -158,7 +158,7 @@ public boolean useClientDefaults() { /** * Computes the backoff before the first attempt, by default {@link Duration#ZERO}. Extending classes can override this method - * to compute different a different depending on their logic. + * to compute a different duration depending on their logic. */ protected Duration computeInitialBackoff(AcquireInitialTokenRequest request) { return Duration.ZERO; @@ -166,7 +166,7 @@ protected Duration computeInitialBackoff(AcquireInitialTokenRequest request) { /** * Computes the backoff before a retry using the configured backoff strategy. Extending classes can override this method to - * compute different a different depending on their logic. + * compute a different duration depending on their logic. */ protected Duration computeBackoff(RefreshRetryTokenRequest request, DefaultRetryToken token) { Duration backoff; @@ -179,6 +179,17 @@ protected Duration computeBackoff(RefreshRetryTokenRequest request, DefaultRetry return maxOf(suggested, backoff); } + /** + * Computes the backoff before exiting the retry loop using the configured backoff strategy. Extending classes can override + * this method to compute a different duration depending on their logic. The default implementation returns + * 0 delay. + * + * @param request The refresh request that failed to acquire sufficient capacity. + */ + protected Duration computeAcquireFailureBackoff(RefreshRetryTokenRequest request) { + return Duration.ZERO; + } + /** * Called inside {@link #recordSuccess} to allow extending classes to update their internal state after a successful request. */ @@ -299,7 +310,8 @@ private void throwOnAcquisitionFailure(RefreshRetryTokenRequest request, Acquire .build(); String message = acquisitionFailedMessage(acquireResponse); log.debug(() -> message, failure); - throw new TokenAcquisitionFailedException(message, refreshedToken, failure); + Duration delay = computeAcquireFailureBackoff(request); + throw new TokenAcquisitionFailedException(message, refreshedToken, failure, delay); } } diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java index 5a10f781ea87..878cdcd380c8 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java @@ -15,10 +15,12 @@ package software.amazon.awssdk.retries.internal; +import java.time.Duration; import java.util.function.Predicate; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.retries.StandardRetryStrategy; import software.amazon.awssdk.retries.api.BackoffStrategy; +import software.amazon.awssdk.retries.api.RefreshRetryTokenRequest; import software.amazon.awssdk.retries.internal.circuitbreaker.TokenBucketStore; import software.amazon.awssdk.utils.Logger; @@ -26,9 +28,11 @@ public final class DefaultStandardRetryStrategy extends BaseRetryStrategy implements StandardRetryStrategy { private static final Logger LOG = Logger.loggerFor(DefaultStandardRetryStrategy.class); + private final boolean retries2026Enabled; DefaultStandardRetryStrategy(Builder builder) { super(LOG, builder); + this.retries2026Enabled = builder.retries2026Enabled; } @Override @@ -40,7 +44,20 @@ public static Builder builder() { return new Builder(); } + @Override + protected Duration computeAcquireFailureBackoff(RefreshRetryTokenRequest request) { + if (!retries2026Enabled || !request.isLongPolling()) { + return super.computeAcquireFailureBackoff(request); + } + + DefaultRetryToken attemptIncremented = asDefaultRetryToken(request.token()).toBuilder() + .increaseAttempt() + .build(); + return computeBackoff(request, attemptIncremented); + } + public static class Builder extends BaseRetryStrategy.Builder implements StandardRetryStrategy.Builder { + private boolean retries2026Enabled; Builder() { } @@ -106,6 +123,14 @@ public Builder useClientDefaults(boolean useClientDefaults) { return this; } + /** + * Whether retries 2.1 behavior is enabled. + */ + public Builder retries2026Enabled(boolean retries2026Enabled) { + this.retries2026Enabled = retries2026Enabled; + return this; + } + @Override public StandardRetryStrategy build() { return new DefaultStandardRetryStrategy(this); diff --git a/core/retries/src/test/java/software/amazon/awssdk/retries/internal/StandardRetryStrategyTest.java b/core/retries/src/test/java/software/amazon/awssdk/retries/internal/StandardRetryStrategyTest.java new file mode 100644 index 000000000000..9196330088a1 --- /dev/null +++ b/core/retries/src/test/java/software/amazon/awssdk/retries/internal/StandardRetryStrategyTest.java @@ -0,0 +1,254 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.retries.internal; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import software.amazon.awssdk.retries.DefaultRetryStrategy; +import software.amazon.awssdk.retries.StandardRetryStrategy; +import software.amazon.awssdk.retries.api.AcquireInitialTokenRequest; +import software.amazon.awssdk.retries.api.AcquireInitialTokenResponse; +import software.amazon.awssdk.retries.api.RefreshRetryTokenRequest; +import software.amazon.awssdk.retries.api.RetryToken; +import software.amazon.awssdk.retries.api.TokenAcquisitionFailedException; +import software.amazon.awssdk.retries.internal.circuitbreaker.TokenBucketStore; + +public class StandardRetryStrategyTest { + @ParameterizedTest + @MethodSource("longPollingScenarios") + void refreshRetryToken_v2_1_longPolling_behavesCorrectly(Scenario scenario) { + DefaultStandardRetryStrategy.Builder builder = + (DefaultStandardRetryStrategy.Builder) DefaultRetryStrategy.standardStrategyBuilder(true); + + StandardRetryStrategy strategy = builder.tokenBucketStore(TokenBucketStore.builder() + .tokenBucketMaxCapacity(0) + .build()) + .retryOnException(e -> true) + .build(); + + AcquireInitialTokenResponse initialToken = strategy.acquireInitialToken(AcquireInitialTokenRequest.create("test")); + + RetryToken token = initialToken.token(); + + Given given = scenario.given; + + for (Response response : scenario.responses) { + + Expected expected = response.expected; + + switch (expected.outcome) { + case RETRY_QUOTA_EXCEEDED: { + ScenarioTestException scenarioTestException = new ScenarioTestException(response.statusCode); + RefreshRetryTokenRequest refreshRequest = RefreshRetryTokenRequest.builder() + .failure(scenarioTestException) + .isLongPolling(given.isLongPolling) + .token(token) + .build(); + + + assertThatThrownBy(() -> strategy.refreshRetryToken(refreshRequest)) + .isInstanceOf(TokenAcquisitionFailedException.class) + .matches(e -> { + TokenAcquisitionFailedException acquireException = (TokenAcquisitionFailedException) e; + Optional delay = acquireException.delay(); + return delay.get().compareTo(expected.delay) <= 0; + }, String.format("Token acquire exception has a delay between 0 and %s (jittered)", expected.delay)); + } + break; + default: + throw new RuntimeException("unknown outcome"); + } + } + } + + @ParameterizedTest + @MethodSource("longPollingScenarios") + void refreshRetryToken_v2_0_longPolling_behavesCorrectly(Scenario scenario) { + DefaultStandardRetryStrategy.Builder builder = + (DefaultStandardRetryStrategy.Builder) DefaultRetryStrategy.standardStrategyBuilder(false); + + StandardRetryStrategy strategy = builder.tokenBucketStore(TokenBucketStore.builder() + .tokenBucketMaxCapacity(0) + .build()) + .retryOnException(e -> true) + .build(); + + AcquireInitialTokenResponse initialToken = strategy.acquireInitialToken(AcquireInitialTokenRequest.create("test")); + + RetryToken token = initialToken.token(); + + Given given = scenario.given; + + for (Response response : scenario.responses) { + + Expected expected = response.expected; + + switch (expected.outcome) { + case RETRY_QUOTA_EXCEEDED: { + ScenarioTestException scenarioTestException = new ScenarioTestException(response.statusCode); + RefreshRetryTokenRequest refreshRequest = RefreshRetryTokenRequest.builder() + .failure(scenarioTestException) + .isLongPolling(given.isLongPolling) + .token(token) + .build(); + + + assertThatThrownBy(() -> strategy.refreshRetryToken(refreshRequest)) + .isInstanceOf(TokenAcquisitionFailedException.class) + .matches(e -> { + TokenAcquisitionFailedException acquireException = (TokenAcquisitionFailedException) e; + Optional delay = acquireException.delay(); + return delay.get().isZero(); + }, "Token acquire exception has no delay"); + } + break; + default: + throw new RuntimeException("unknown outcome"); + } + } + } + + private static class ScenarioTestException extends RuntimeException { + private final int statusCode; + + public ScenarioTestException(int statusCode) { + this.statusCode = statusCode; + } + } + + private static Stream longPollingScenarios() { + return Stream.of( + aScenario("Long-Polling Backoff When Token Bucket Empty") + .given(g -> g.isLongPolling(true)) + .addResponse(r -> r.statusCode(500) + .expected(e -> e.retryQuota(0) + .delay(Duration.ofMillis(50)) + .outcome(Outcome.RETRY_QUOTA_EXCEEDED))), + aScenario("Not Long-Polling, Does Not Backoff When Token Bucket Empty") + .given(g -> g.isLongPolling(false)) + .addResponse(r -> r.statusCode(500) + .expected(e -> e.retryQuota(0) + .delay(Duration.ZERO) + .outcome(Outcome.RETRY_QUOTA_EXCEEDED))) + ); + } + + private static Scenario aScenario(String description) { + return new Scenario(description); + } + + private static class Given { + private int maxAttempts; + private boolean isLongPolling; + private Duration maxBackoff; + + public Given maxAttempts(int maxAttempts) { + this.maxAttempts = maxAttempts; + return this; + } + + public Given isLongPolling(boolean isLongPolling) { + this.isLongPolling = isLongPolling; + return this; + } + + public Given maxBackoff(Duration maxBackoff) { + this.maxBackoff = maxBackoff; + return this; + } + } + + private static class Response { + private int statusCode; + private Expected expected; + + public Response statusCode(int statusCode) { + this.statusCode = statusCode; + return this; + } + + + public Response expected(Consumer acceptor) { + this.expected = new Expected(); + acceptor.accept(this.expected); + return this; + } + } + + private static class Expected { + private Outcome outcome; + private int retryQuota; + private Duration delay; + + public Expected outcome(Outcome outcome) { + this.outcome = outcome; + return this; + } + + public Expected retryQuota(int retryQuota) { + this.retryQuota = retryQuota; + return this; + } + + public Expected delay(Duration delay) { + this.delay = delay; + return this; + } + } + + private enum Outcome { + RETRY_REQUEST, + RETRY_QUOTA_EXCEEDED, + MAX_ATTEMPTS_EXCEEDED, + SUCCESS + } + + private static class Scenario { + private String description; + private Given given; + private List responses = new ArrayList<>(); + + public Scenario(String description) { + this.description = description; + } + + public Scenario given(Consumer acceptor) { + this.given = new Given(); + acceptor.accept(this.given); + return this; + } + + public Scenario addResponse(Consumer acceptor) { + Response response = new Response(); + acceptor.accept(response); + responses.add(response); + return this; + } + + @Override + public String toString() { + return description; + } + } +} From 1e0e470c52232bffa59317e5a02cd3ebb86c161f Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Fri, 24 Apr 2026 15:13:09 -0700 Subject: [PATCH 06/18] Add longPolling exec param and use in retries (#6902) This commit - Adds an isLongPolling() property to ClientExecutionParams - Adds SdkInternalExecutionAttribute.IS_LONG_POLLING that reflects the value from ClientExecutionParams during execution - Sets the longPolling() property on teh RefreshRetryTokenRequest when refreshing, based on the value of the IS_LONG_POLLING exec attribute --- .../internal/AwsExecutionContextBuilder.java | 1 + .../AwsExecutionContextBuilderTest.java | 10 ++ .../client/handler/ClientExecutionParams.java | 14 +++ .../SdkInternalExecutionAttribute.java | 5 + .../stages/utils/RetryableStageHelper.java | 10 ++ .../utils/RetryableStageHelperTest.java | 112 ++++++++++++++++++ 6 files changed, 152 insertions(+) create mode 100644 core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelperTest.java diff --git a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilder.java b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilder.java index 1fa59e119cef..0bf89b3754e1 100644 --- a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilder.java +++ b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilder.java @@ -103,6 +103,7 @@ private AwsExecutionContextBuilder() { .putAttribute(AwsExecutionAttribute.ENDPOINT_PREFIX, clientConfig.option(AwsClientOption.ENDPOINT_PREFIX)) .putAttribute(AwsSignerExecutionAttribute.SIGNING_REGION, clientConfig.option(AwsClientOption.SIGNING_REGION)) .putAttribute(SdkInternalExecutionAttribute.IS_FULL_DUPLEX, executionParams.isFullDuplex()) + .putAttribute(SdkInternalExecutionAttribute.IS_LONG_POLLING, executionParams.isLongPolling()) .putAttribute(SdkInternalExecutionAttribute.HAS_INITIAL_REQUEST_EVENT, executionParams.hasInitialRequestEvent()) .putAttribute(SdkExecutionAttribute.CLIENT_TYPE, clientConfig.option(SdkClientOption.CLIENT_TYPE)) .putAttribute(SdkExecutionAttribute.SERVICE_NAME, clientConfig.option(SdkClientOption.SERVICE_NAME)) diff --git a/core/aws-core/src/test/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilderTest.java b/core/aws-core/src/test/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilderTest.java index 75ee9b0f462b..f59310eaeacb 100644 --- a/core/aws-core/src/test/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilderTest.java +++ b/core/aws-core/src/test/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilderTest.java @@ -557,6 +557,16 @@ public void invokeInterceptorsAndCreateExecutionContext_withExplicitHttpClientFa assertThat(businessMetrics.recordedMetrics()).contains("AL"); } + @Test + public void invokeInterceptorsAndCreateExecutionContext_withLongPollingOperation_setsCorrectAttributeValue() { + SdkClientConfiguration clientConfig = testClientConfiguration().build(); + ClientExecutionParams executionParams = clientExecutionParams().withLongPolling(true); + ExecutionContext executionContext = + AwsExecutionContextBuilder.invokeInterceptorsAndCreateExecutionContext(executionParams, clientConfig); + + assertThat(executionContext.executionAttributes().getAttribute(SdkInternalExecutionAttribute.IS_LONG_POLLING)).isTrue(); + } + private ClientExecutionParams clientExecutionParams() { return clientExecutionParams(sdkRequest); } diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/client/handler/ClientExecutionParams.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/client/handler/ClientExecutionParams.java index e307f5857ce7..ef31aba69ecb 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/client/handler/ClientExecutionParams.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/client/handler/ClientExecutionParams.java @@ -55,6 +55,7 @@ public final class ClientExecutionParams { private AsyncResponseTransformer asyncResponseTransformer; private boolean fullDuplex; private boolean hasInitialRequestEvent; + private boolean longPolling; private String hostPrefixExpression; private String operationName; private SdkProtocolMetadata protocolMetadata; @@ -168,6 +169,19 @@ public ClientExecutionParams withFullDuplex(boolean fullDuplex) return this; } + /** + * Whether this is a long polling operation, i.e. a request where the service can wait extended period of time before + * sending a response back to the client. + */ + public boolean isLongPolling() { + return longPolling; + } + + public ClientExecutionParams withLongPolling(boolean longPolling) { + this.longPolling = longPolling; + return this; + } + public boolean hasInitialRequestEvent() { return hasInitialRequestEvent; } diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/interceptor/SdkInternalExecutionAttribute.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/interceptor/SdkInternalExecutionAttribute.java index 3fe0f69d3ab8..910c66594106 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/interceptor/SdkInternalExecutionAttribute.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/interceptor/SdkInternalExecutionAttribute.java @@ -212,6 +212,11 @@ public final class SdkInternalExecutionAttribute extends SdkExecutionAttribute { public static final ExecutionAttribute CHECKSUM_STORE = new ExecutionAttribute<>("ChecksumStore"); + /** + * Indicates whether this is a long polling operation. + */ + public static final ExecutionAttribute IS_LONG_POLLING = new ExecutionAttribute<>("IsLongPolling"); + /** * The backing attribute for RESOLVED_CHECKSUM_SPECS. * This holds the real ChecksumSpecs value, and is used to map to the ChecksumAlgorithm signer property diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelper.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelper.java index b73dd34e112b..07132d6a5ba3 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelper.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelper.java @@ -31,6 +31,7 @@ import software.amazon.awssdk.core.exception.SdkClientException; import software.amazon.awssdk.core.exception.SdkException; import software.amazon.awssdk.core.interceptor.ExecutionAttribute; +import software.amazon.awssdk.core.interceptor.SdkInternalExecutionAttribute; import software.amazon.awssdk.core.internal.http.HttpClientDependencies; import software.amazon.awssdk.core.internal.http.RequestExecutionContext; import software.amazon.awssdk.core.internal.retry.ClockSkewAdjuster; @@ -60,6 +61,7 @@ public final class RetryableStageHelper { new ExecutionAttribute<>("LastBackoffDuration"); private final SdkHttpFullRequest request; + private final boolean isLongPollingOperation; private final RequestExecutionContext context; private RetryPolicyAdapter retryPolicyAdapter; private final RetryStrategy retryStrategy; @@ -74,6 +76,7 @@ public RetryableStageHelper(SdkHttpFullRequest request, HttpClientDependencies dependencies) { this.request = request; this.context = context; + this.isLongPollingOperation = isLongPollingOperation(this.context); RetryPolicy retryPolicy = dependencies.clientConfiguration().option(SdkClientOption.RETRY_POLICY); RetryStrategy retryStrategy = dependencies.clientConfiguration().option(SdkClientOption.RETRY_STRATEGY); if (retryPolicy != null) { @@ -139,6 +142,7 @@ public Optional tryRefreshToken(Duration suggestedDelay) { RefreshRetryTokenRequest refreshRequest = RefreshRetryTokenRequest.builder() .failure(this.lastException) .token(retryToken) + .isLongPolling(isLongPollingOperation) .suggestedDelay(suggestedDelay) .build(); refreshResponse = retryStrategy().refreshRetryToken(refreshRequest); @@ -296,4 +300,10 @@ private RetryPolicyContext retryPolicyContext() { .httpStatusCode(lastResponse == null ? null : lastResponse.statusCode()) .build(); } + + private boolean isLongPollingOperation(RequestExecutionContext context) { + return context.executionAttributes() + .getOptionalAttribute(SdkInternalExecutionAttribute.IS_LONG_POLLING) + .orElse(false); + } } \ No newline at end of file diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelperTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelperTest.java new file mode 100644 index 000000000000..09bc2035d924 --- /dev/null +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelperTest.java @@ -0,0 +1,112 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.core.internal.http.pipeline.stages.utils; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.net.URI; +import java.time.Duration; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.ArgumentCaptor; +import software.amazon.awssdk.core.SdkRequest; +import software.amazon.awssdk.core.client.config.SdkClientConfiguration; +import software.amazon.awssdk.core.client.config.SdkClientOption; +import software.amazon.awssdk.core.http.ExecutionContext; +import software.amazon.awssdk.core.interceptor.ExecutionAttributes; +import software.amazon.awssdk.core.interceptor.SdkInternalExecutionAttribute; +import software.amazon.awssdk.core.internal.http.HttpClientDependencies; +import software.amazon.awssdk.core.internal.http.RequestExecutionContext; +import software.amazon.awssdk.http.SdkHttpFullRequest; +import software.amazon.awssdk.http.SdkHttpMethod; +import software.amazon.awssdk.retries.api.AcquireInitialTokenResponse; +import software.amazon.awssdk.retries.api.RefreshRetryTokenRequest; +import software.amazon.awssdk.retries.api.RefreshRetryTokenResponse; +import software.amazon.awssdk.retries.api.RetryStrategy; +import software.amazon.awssdk.retries.api.RetryToken; + +public class RetryableStageHelperTest { + + @ParameterizedTest(name = "IS_LONG_POLLING = {0}, expected = {1}") + @MethodSource("longPollingValueTestParams") + void tryRefreshToken_forwardsLongPollingAttrValue(Boolean attribute, boolean expected) { + SdkHttpFullRequest httpRequest = SdkHttpFullRequest.builder() + .method(SdkHttpMethod.GET) + .uri(URI.create("https://my-service.amazonaws.com")) + .build(); + + ExecutionAttributes.Builder attributes = ExecutionAttributes.builder(); + if (attribute != null) { + attributes.put(SdkInternalExecutionAttribute.IS_LONG_POLLING, attribute); + } + + ExecutionContext executionContext = ExecutionContext.builder().executionAttributes(attributes.build()).build(); + + RequestExecutionContext requestExecutionContext = RequestExecutionContext.builder() + .originalRequest(mock(SdkRequest.class)) + .executionContext(executionContext) + .build(); + + RetryStrategy retryStrategy = mock(RetryStrategy.class); + + SdkClientConfiguration clientConfig = SdkClientConfiguration.builder() + .option(SdkClientOption.RETRY_STRATEGY, retryStrategy) + .build(); + + HttpClientDependencies dependencies = HttpClientDependencies.builder() + .clientConfiguration(clientConfig) + .build(); + + RetryableStageHelper helper = new RetryableStageHelper(httpRequest, + requestExecutionContext, + dependencies); + + AcquireInitialTokenResponse mockAcquireResponse = mock(AcquireInitialTokenResponse.class); + RetryToken token = mock(RetryToken.class); + when(mockAcquireResponse.token()).thenReturn(token); + when(retryStrategy.acquireInitialToken(any())).thenReturn(mockAcquireResponse); + + RefreshRetryTokenResponse mockRefreshResponse = mock(RefreshRetryTokenResponse.class); + when(mockRefreshResponse.delay()).thenReturn(Duration.ZERO); + ArgumentCaptor refreshRequestCaptor = ArgumentCaptor.forClass(RefreshRetryTokenRequest.class); + + when(retryStrategy.refreshRetryToken(any())).thenReturn(mockRefreshResponse); + + helper.acquireInitialToken(); + + helper.setLastException(new RuntimeException()); + helper.tryRefreshToken(Duration.ZERO); + + verify(retryStrategy).refreshRetryToken(refreshRequestCaptor.capture()); + + assertThat(refreshRequestCaptor.getValue().isLongPolling()).isEqualTo(expected); + } + + private static Stream longPollingValueTestParams() { + return Stream.of( + // Absent should default to false + Arguments.of(null, false), + Arguments.of(true, true), + Arguments.of(false, false) + ); + } +} From 33a6bcecb875059d0ee95c64dadbe9bc745ec0d2 Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:43:04 -0700 Subject: [PATCH 07/18] Set longPoll ops for SQS,SWF,SFN (#6905) * Set longPoll ops for SQS,SWF,SFN Add a customization to set the long polling trait for the following service operations: - SQS#ReceiveMessage - SFN#GetActivityTask - SWF#PollForActivityTask - SWF#PollForDecisionTask * Checkstyle fix * Review comments * Fix checkstyle --- .../DefaultCustomizationProcessor.java | 3 +- .../LongPollingOperationProcessor.java | 94 +++++++++++++++++++ .../model/intermediate/OperationModel.java | 14 ++- .../poet/client/specs/JsonProtocolSpec.java | 3 + .../poet/client/traits/LongPollTrait.java | 35 +++++++ .../LongPollingOperationProcessTest.java | 70 ++++++++++++++ 6 files changed, 217 insertions(+), 2 deletions(-) create mode 100644 codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/LongPollingOperationProcessor.java create mode 100644 codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/traits/LongPollTrait.java create mode 100644 codegen/src/test/java/software/amazon/awssdk/codegen/customization/processors/LongPollingOperationProcessTest.java diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/DefaultCustomizationProcessor.java b/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/DefaultCustomizationProcessor.java index 225cd61d2dea..1511bf6be282 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/DefaultCustomizationProcessor.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/DefaultCustomizationProcessor.java @@ -42,7 +42,8 @@ public static CodegenCustomizationProcessor getProcessorFor( new S3RemoveBucketFromUriProcessor(), new S3ControlRemoveAccountIdHostPrefixProcessor(), new ExplicitStringPayloadQueryProtocolProcessor(), - new LowercaseShapeValidatorProcessor() + new LowercaseShapeValidatorProcessor(), + new LongPollingOperationProcessor() ); } } diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/LongPollingOperationProcessor.java b/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/LongPollingOperationProcessor.java new file mode 100644 index 000000000000..e5debd935b18 --- /dev/null +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/customization/processors/LongPollingOperationProcessor.java @@ -0,0 +1,94 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.codegen.customization.processors; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.annotations.SdkTestInternalApi; +import software.amazon.awssdk.codegen.customization.CodegenCustomizationProcessor; +import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; +import software.amazon.awssdk.codegen.model.intermediate.OperationModel; +import software.amazon.awssdk.codegen.model.intermediate.Protocol; +import software.amazon.awssdk.codegen.model.service.ServiceModel; + +// TODO: Remove this when the long polling trait is formalized as a c2j trait. + +/** + * Marks specific service operations as having the long polling trait. + */ +public class LongPollingOperationProcessor implements CodegenCustomizationProcessor { + private static final Logger log = LoggerFactory.getLogger(LongPollingOperationProcessor.class); + + // Note: static mapping instead of exposed via CustomizationConfig to avoid exposing it for wider use unless necessary. + private static final Map> SERVICE_ID_TO_OPERATIONS_MAP; + + static { + Map> serviceIdToOperationsMap = new HashMap<>(); + + serviceIdToOperationsMap.put("SQS", Collections.singletonList("ReceiveMessage")); + serviceIdToOperationsMap.put("SFN", Collections.singletonList("GetActivityTask")); + serviceIdToOperationsMap.put("SWF", Collections.unmodifiableList(Arrays.asList("PollForActivityTask", + "PollForDecisionTask"))); + + SERVICE_ID_TO_OPERATIONS_MAP = Collections.unmodifiableMap(serviceIdToOperationsMap); + } + + private final Map> serviceIdToOperations; + + public LongPollingOperationProcessor() { + this(SERVICE_ID_TO_OPERATIONS_MAP); + } + + @SdkTestInternalApi + LongPollingOperationProcessor(Map> serviceIdToOperations) { + this.serviceIdToOperations = serviceIdToOperations; + } + + @Override + public void preprocess(ServiceModel serviceModel) { + // no-op + } + + @Override + public void postprocess(IntermediateModel intermediateModel) { + String serviceId = intermediateModel.getMetadata().getServiceId(); + + if (!serviceIdToOperations.containsKey(serviceId)) { + return; + } + + if (intermediateModel.getMetadata().getProtocol() != Protocol.AWS_JSON) { + throw new IllegalArgumentException("Currently only AWS-JSON services can use the longPoll trait"); + } + + List longPollingOperations = serviceIdToOperations.getOrDefault(serviceId, Collections.emptyList()); + + for (String longPollingOperation : longPollingOperations) { + OperationModel opModel = intermediateModel.getOperation(longPollingOperation); + if (opModel != null) { + log.info("Setting the longPoll trait for {}#{}", serviceId, longPollingOperation); + opModel.setLongPolling(true); + } else { + throw new RuntimeException("Operation " + longPollingOperation + " not found for service " + serviceId); + } + } + } +} diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/model/intermediate/OperationModel.java b/codegen/src/main/java/software/amazon/awssdk/codegen/model/intermediate/OperationModel.java index 6b192644da1d..e69c6f2ab883 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/model/intermediate/OperationModel.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/model/intermediate/OperationModel.java @@ -90,6 +90,8 @@ public class OperationModel extends DocumentationModel { private boolean unsignedPayload; + private boolean longPolling; + public String getOperationName() { return operationName; } @@ -381,6 +383,14 @@ public void setUnsignedPayload(boolean unsignedPayload) { this.unsignedPayload = unsignedPayload; } + public boolean isLongPolling() { + return longPolling; + } + + public void setLongPolling(boolean longPolling) { + this.longPolling = longPolling; + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { @@ -395,7 +405,8 @@ public boolean equals(Object o) { && hasStringMemberAsPayload == that.hasStringMemberAsPayload && isAuthenticated == that.isAuthenticated && isPaginated == that.isPaginated && endpointOperation == that.endpointOperation && endpointCacheRequired == that.endpointCacheRequired && httpChecksumRequired == that.httpChecksumRequired - && unsignedPayload == that.unsignedPayload && Objects.equals(operationName, that.operationName) + && unsignedPayload == that.unsignedPayload && longPolling == that.longPolling + && Objects.equals(operationName, that.operationName) && Objects.equals(serviceProtocol, that.serviceProtocol) && Objects.equals(deprecatedMessage, that.deprecatedMessage) && Objects.equals(input, that.input) && Objects.equals(returnType, that.returnType) && Objects.equals(exceptions, that.exceptions) @@ -437,6 +448,7 @@ public int hashCode() { result = 31 * result + Objects.hashCode(staticContextParams); result = 31 * result + Objects.hashCode(operationContextParams); result = 31 * result + Boolean.hashCode(unsignedPayload); + result = 31 * result + Boolean.hashCode(longPolling); return result; } } diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/specs/JsonProtocolSpec.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/specs/JsonProtocolSpec.java index b9b69d9bd8a0..894055c2db7c 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/specs/JsonProtocolSpec.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/specs/JsonProtocolSpec.java @@ -43,6 +43,7 @@ import software.amazon.awssdk.codegen.poet.PoetExtension; import software.amazon.awssdk.codegen.poet.client.traits.HttpChecksumRequiredTrait; import software.amazon.awssdk.codegen.poet.client.traits.HttpChecksumTrait; +import software.amazon.awssdk.codegen.poet.client.traits.LongPollTrait; import software.amazon.awssdk.codegen.poet.client.traits.RequestCompressionTrait; import software.amazon.awssdk.codegen.poet.eventstream.EventStreamUtils; import software.amazon.awssdk.codegen.poet.model.EventStreamSpecHelper; @@ -219,6 +220,7 @@ public CodeBlock executionHandler(OperationModel opModel) { .add(hostPrefixExpression(opModel)) .add(discoveredEndpoint(opModel)) .add(credentialType(opModel, model)) + .add(LongPollTrait.executionParamSetter(opModel)) .add(".withRequestConfiguration(clientConfiguration)") .add(".withInput($L)\n", opModel.getInput().getVariableName()) .add(".withMetricCollector(apiCallMetricCollector)") @@ -290,6 +292,7 @@ public CodeBlock asyncExecutionHandler(IntermediateModel intermediateModel, Oper .add(".withMarshaller($L)\n", asyncMarshaller(model, opModel, marshaller, protocolFactory)) .add(asyncRequestBody(opModel)) .add(fullDuplex(opModel)) + .add(LongPollTrait.executionParamSetter(opModel)) .add(hasInitialRequestEvent(opModel, isRestJson)) .add(".withResponseHandler($L)\n", responseHandlerName(opModel, isRestJson)) .add(".withErrorResponseHandler(errorResponseHandler)\n") diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/traits/LongPollTrait.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/traits/LongPollTrait.java new file mode 100644 index 000000000000..e12adb13e6cb --- /dev/null +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/traits/LongPollTrait.java @@ -0,0 +1,35 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.codegen.poet.client.traits; + +import com.squareup.javapoet.CodeBlock; +import software.amazon.awssdk.codegen.model.intermediate.OperationModel; + +/** + * Helper methods for working with the long poll trait for operations. + */ +public final class LongPollTrait { + private LongPollTrait() { + } + + public static CodeBlock executionParamSetter(OperationModel operationModel) { + if (operationModel.isLongPolling()) { + return CodeBlock.of(".withLongPolling(true)"); + } + return CodeBlock.of(""); + } + +} diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/customization/processors/LongPollingOperationProcessTest.java b/codegen/src/test/java/software/amazon/awssdk/codegen/customization/processors/LongPollingOperationProcessTest.java new file mode 100644 index 000000000000..3951be476d81 --- /dev/null +++ b/codegen/src/test/java/software/amazon/awssdk/codegen/customization/processors/LongPollingOperationProcessTest.java @@ -0,0 +1,70 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.codegen.customization.processors; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import software.amazon.awssdk.codegen.C2jModels; +import software.amazon.awssdk.codegen.IntermediateModelBuilder; +import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; +import software.amazon.awssdk.codegen.model.intermediate.Protocol; +import software.amazon.awssdk.codegen.model.service.ServiceMetadata; +import software.amazon.awssdk.codegen.poet.ClientTestModels; + +public class LongPollingOperationProcessTest { + + @ParameterizedTest + @MethodSource("nonJsonProtocols") + void postprocess_serviceInMap_serviceNotJson_throws(Protocol protocol) { + C2jModels c2jModels = ClientTestModels.awsJsonServiceC2jModels(); + + ServiceMetadata metadata = c2jModels.serviceModel().getMetadata(); + metadata.setProtocols(Collections.singletonList(protocol.getValue())); + + IntermediateModel intermediateModel = new IntermediateModelBuilder(c2jModels).build(); + + Map> serviceToOperations = new HashMap<>(); + serviceToOperations.put(metadata.getServiceId(), Collections.emptyList()); + LongPollingOperationProcessor processor = new LongPollingOperationProcessor(serviceToOperations); + + assertThatThrownBy(() -> processor.postprocess(intermediateModel)) + .hasMessage("Currently only AWS-JSON services can use the longPoll trait"); + } + + @Test + void postprocess_operationNotFound_throws() { + IntermediateModel intermediateModel = ClientTestModels.awsJsonServiceModels(); + + Map> serviceToOperations = new HashMap<>(); + serviceToOperations.put(intermediateModel.getMetadata().getServiceId(), Collections.singletonList("SomeOperation")); + LongPollingOperationProcessor processor = new LongPollingOperationProcessor(serviceToOperations); + + assertThatThrownBy(() -> processor.postprocess(intermediateModel)) + .hasMessage("Operation SomeOperation not found for service Json Service"); + } + + private static Stream nonJsonProtocols() { + return Stream.of(Protocol.values()).filter(p -> p != Protocol.AWS_JSON); + } +} From 9fc53b9755f1c635947779aca1aeea3cd703550c Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Mon, 27 Apr 2026 14:31:47 -0700 Subject: [PATCH 08/18] Add test cases for Standard (#6911) This commit adds the test cases defined in the retries spec for Standard. There are two sets, for v2.0 and v2.1. All of the v2.0 test cases are present, but v2.1 tests don't currently have the x-amz-retry-after header tests (yet). --- .../internal/StandardRetryStrategyTest.java | 704 ++++++++++++++++-- 1 file changed, 627 insertions(+), 77 deletions(-) diff --git a/core/retries/src/test/java/software/amazon/awssdk/retries/internal/StandardRetryStrategyTest.java b/core/retries/src/test/java/software/amazon/awssdk/retries/internal/StandardRetryStrategyTest.java index 9196330088a1..c182a0ed6377 100644 --- a/core/retries/src/test/java/software/amazon/awssdk/retries/internal/StandardRetryStrategyTest.java +++ b/core/retries/src/test/java/software/amazon/awssdk/retries/internal/StandardRetryStrategyTest.java @@ -15,12 +15,13 @@ package software.amazon.awssdk.retries.internal; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.time.Duration; import java.util.ArrayList; import java.util.List; -import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.stream.Stream; import org.junit.jupiter.params.ParameterizedTest; @@ -29,128 +30,650 @@ import software.amazon.awssdk.retries.StandardRetryStrategy; import software.amazon.awssdk.retries.api.AcquireInitialTokenRequest; import software.amazon.awssdk.retries.api.AcquireInitialTokenResponse; +import software.amazon.awssdk.retries.api.BackoffStrategy; +import software.amazon.awssdk.retries.api.RecordSuccessRequest; +import software.amazon.awssdk.retries.api.RecordSuccessResponse; import software.amazon.awssdk.retries.api.RefreshRetryTokenRequest; +import software.amazon.awssdk.retries.api.RefreshRetryTokenResponse; import software.amazon.awssdk.retries.api.RetryToken; import software.amazon.awssdk.retries.api.TokenAcquisitionFailedException; import software.amazon.awssdk.retries.internal.circuitbreaker.TokenBucketStore; public class StandardRetryStrategyTest { + private static final Duration BASE_DELAY_V21_THROTTLING = Duration.ofMillis(1000); + private static final Duration BASE_DELAY_V21_NON_THROTTLING = Duration.ofMillis(50); + private static final Duration BASE_DELAY_V20 = Duration.ofMillis(1000); + @ParameterizedTest - @MethodSource("longPollingScenarios") - void refreshRetryToken_v2_1_longPolling_behavesCorrectly(Scenario scenario) { + @MethodSource("retriesV20Tests") + void refreshRetryToken_v2_0_behavesCorrectly(Scenario scenario) { + verifyScenario(scenario); + } + + @ParameterizedTest + @MethodSource("retriesV21Tests") + void refreshRetryToken_v2_1_behavesCorrectly(Scenario scenario) { + verifyScenario(scenario); + } + + void verifyScenario(Scenario scenario) { DefaultStandardRetryStrategy.Builder builder = - (DefaultStandardRetryStrategy.Builder) DefaultRetryStrategy.standardStrategyBuilder(true); + (DefaultStandardRetryStrategy.Builder) DefaultRetryStrategy.standardStrategyBuilder(scenario.newRetries2026); + + Given given = scenario.given; + + if (given.maxAttempts != null) { + builder.maxAttempts(given.maxAttempts); + } - StandardRetryStrategy strategy = builder.tokenBucketStore(TokenBucketStore.builder() - .tokenBucketMaxCapacity(0) - .build()) - .retryOnException(e -> true) + if (given.initialRetryTokens != null) { + builder.tokenBucketStore(TokenBucketStore.builder() + .tokenBucketMaxCapacity(given.initialRetryTokens) + .build()); + } + + Duration maxBackoff; + if (given.maxBackoff != null) { + maxBackoff = given.maxBackoff; + } else { + maxBackoff = Duration.ofSeconds(20); + } + + builder.backoffStrategy(BackoffStrategy.exponentialDelayWithoutJitter( + scenario.newRetries2026 ? BASE_DELAY_V21_NON_THROTTLING : BASE_DELAY_V20, + maxBackoff)); + + builder.throttlingBackoffStrategy(BackoffStrategy.exponentialDelayWithoutJitter( + scenario.newRetries2026 ? BASE_DELAY_V21_THROTTLING : BASE_DELAY_V20, + maxBackoff + )); + + StandardRetryStrategy strategy = builder.retryOnException(e -> true) + .treatAsThrottling(e -> ((ScenarioTestException) e).throttling) .build(); AcquireInitialTokenResponse initialToken = strategy.acquireInitialToken(AcquireInitialTokenRequest.create("test")); - RetryToken token = initialToken.token(); - - Given given = scenario.given; + AtomicReference token = new AtomicReference<>(initialToken.token()); for (Response response : scenario.responses) { - Expected expected = response.expected; - switch (expected.outcome) { + Outcome outcome = expected.outcome; + switch (outcome) { + case RETRY_REQUEST: { + ScenarioTestException scenarioTestException = new ScenarioTestException(response.statusCode, + response.throttling); + RefreshRetryTokenRequest refreshRequest = RefreshRetryTokenRequest.builder() + .failure(scenarioTestException) + .isLongPolling(given.isLongPolling) + .token(token.get()) + .build(); + RefreshRetryTokenResponse refreshResponse = strategy.refreshRetryToken(refreshRequest); + DefaultRetryToken refreshedToken = (DefaultRetryToken) refreshResponse.token(); + token.set(refreshedToken); + + assertThat(refreshResponse.delay()).isEqualTo(expected.delay); + assertThat(refreshedToken.capacityRemaining()).isEqualTo(expected.retryQuota); + } + break; case RETRY_QUOTA_EXCEEDED: { - ScenarioTestException scenarioTestException = new ScenarioTestException(response.statusCode); + ScenarioTestException scenarioTestException = new ScenarioTestException(response.statusCode, + response.throttling); RefreshRetryTokenRequest refreshRequest = RefreshRetryTokenRequest.builder() .failure(scenarioTestException) .isLongPolling(given.isLongPolling) - .token(token) + .token(token.get()) .build(); assertThatThrownBy(() -> strategy.refreshRetryToken(refreshRequest)) .isInstanceOf(TokenAcquisitionFailedException.class) .matches(e -> { - TokenAcquisitionFailedException acquireException = (TokenAcquisitionFailedException) e; - Optional delay = acquireException.delay(); - return delay.get().compareTo(expected.delay) <= 0; - }, String.format("Token acquire exception has a delay between 0 and %s (jittered)", expected.delay)); + TokenAcquisitionFailedException acquireException = (TokenAcquisitionFailedException) e; + DefaultRetryToken acquireToken = (DefaultRetryToken) acquireException.token(); + token.set(acquireToken); + + Duration acquireDelay = acquireException.delay().orElse(Duration.ZERO); + Duration expectedDelay = expected.delay == null ? Duration.ZERO : expected.delay; + + return acquireToken.state() == DefaultRetryToken.TokenState.TOKEN_ACQUISITION_FAILED + && acquireToken.capacityRemaining() == expected.retryQuota + && acquireDelay.equals(expectedDelay); + }, + "Token has TOKEN_ACQUISITION_FAILED state and capacity of " + + expected.retryQuota + + " and delay of " + expected.delay); } break; - default: - throw new RuntimeException("unknown outcome"); - } - } - } - - @ParameterizedTest - @MethodSource("longPollingScenarios") - void refreshRetryToken_v2_0_longPolling_behavesCorrectly(Scenario scenario) { - DefaultStandardRetryStrategy.Builder builder = - (DefaultStandardRetryStrategy.Builder) DefaultRetryStrategy.standardStrategyBuilder(false); - - StandardRetryStrategy strategy = builder.tokenBucketStore(TokenBucketStore.builder() - .tokenBucketMaxCapacity(0) - .build()) - .retryOnException(e -> true) - .build(); - - AcquireInitialTokenResponse initialToken = strategy.acquireInitialToken(AcquireInitialTokenRequest.create("test")); - - RetryToken token = initialToken.token(); - - Given given = scenario.given; - - for (Response response : scenario.responses) { - - Expected expected = response.expected; - - switch (expected.outcome) { - case RETRY_QUOTA_EXCEEDED: { - ScenarioTestException scenarioTestException = new ScenarioTestException(response.statusCode); + case MAX_ATTEMPTS_EXCEEDED: { + ScenarioTestException scenarioTestException = new ScenarioTestException(response.statusCode, + response.throttling); RefreshRetryTokenRequest refreshRequest = RefreshRetryTokenRequest.builder() .failure(scenarioTestException) .isLongPolling(given.isLongPolling) - .token(token) + .token(token.get()) .build(); - - assertThatThrownBy(() -> strategy.refreshRetryToken(refreshRequest)) .isInstanceOf(TokenAcquisitionFailedException.class) .matches(e -> { TokenAcquisitionFailedException acquireException = (TokenAcquisitionFailedException) e; - Optional delay = acquireException.delay(); - return delay.get().isZero(); - }, "Token acquire exception has no delay"); + DefaultRetryToken acquireToken = (DefaultRetryToken) acquireException.token(); + token.set(acquireToken); + + Duration acquireDelay = acquireException.delay().orElse(Duration.ZERO); + Duration expectedDelay = expected.delay == null ? Duration.ZERO : expected.delay; + + return acquireToken.state() == DefaultRetryToken.TokenState.MAX_RETRIES_REACHED + && acquireToken.capacityRemaining() == expected.retryQuota + && acquireDelay.equals(expectedDelay); + }, "Token has MAX_RETRIES_REACHED state and has expected retry quota " + + expected.retryQuota + + " and delay of " + expected.delay); + } + break; + case SUCCESS: { + RecordSuccessRequest recordRequest = RecordSuccessRequest.create(token.get()); + RecordSuccessResponse recordResponse = strategy.recordSuccess(recordRequest); + + DefaultRetryToken successToken = (DefaultRetryToken) recordResponse.token(); + token.set(successToken); + assertThat(successToken.capacityRemaining()).isEqualTo(expected.retryQuota); } break; default: throw new RuntimeException("unknown outcome"); } + + // If the last outcome was a terminal state, get a new token so that state is consistent with a new request + if (outcome == Outcome.SUCCESS + || outcome == Outcome.MAX_ATTEMPTS_EXCEEDED + || outcome == Outcome.RETRY_QUOTA_EXCEEDED) { + AcquireInitialTokenRequest acquireInitialTokenRequest = AcquireInitialTokenRequest.create("test"); + token.set(strategy.acquireInitialToken(acquireInitialTokenRequest).token()); + } } } - private static class ScenarioTestException extends RuntimeException { - private final int statusCode; - - public ScenarioTestException(int statusCode) { - this.statusCode = statusCode; - } + private static Stream retriesV20Tests() { + return Stream.of( + aScenario("Retry eventually succeeds.") + .given(g -> + g.maxAttempts(3).initialRetryTokens(500).maxBackoff(Duration.ofSeconds(20))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(495) + .delay(Duration.ofSeconds(1)))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(490) + .delay(Duration.ofSeconds(2)))) + .addResponse(r -> + r.statusCode(200) + .expected(e -> + e.outcome(Outcome.SUCCESS) + .retryQuota(495))), + + aScenario("Fail due to max attempts reached.") + .given(g -> + g.maxAttempts(3) + .initialRetryTokens(500) + .maxBackoff(Duration.ofSeconds(20))) + .addResponse(r -> + r.statusCode(502) + .expected( + e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(495) + .delay(Duration.ofSeconds(1)))) + .addResponse(r -> + r.statusCode(502) + .expected( + e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(490) + .delay(Duration.ofSeconds(2)))) + .addResponse(r -> + r.statusCode(502) + .expected( + e -> + e.outcome(Outcome.MAX_ATTEMPTS_EXCEEDED) + .retryQuota(490))), + + aScenario("Retry Quota reached after a single retry.") + .given(g -> + g.maxAttempts(3) + .initialRetryTokens(5) + .maxBackoff(Duration.ofSeconds(20))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofSeconds(1)) + .retryQuota(0))) + .addResponse(r -> + r.statusCode(502) + .expected(e -> + e.outcome(Outcome.RETRY_QUOTA_EXCEEDED) + .retryQuota(0))), + + aScenario("No retries at all if retry quota is 0.") + .given(g -> + g.maxAttempts(3) + .initialRetryTokens(0) + .maxBackoff(Duration.ofSeconds(20))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_QUOTA_EXCEEDED) + .retryQuota(0))), + + aScenario("Verifying exponential backoff timing.") + .given(g -> + g.maxAttempts(5) + .initialRetryTokens(500) + .maxBackoff(Duration.ofSeconds(20))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(495) + .delay(Duration.ofSeconds(1)))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(490) + .delay(Duration.ofSeconds(2)))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(485) + .delay(Duration.ofSeconds(4)))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(480) + .delay(Duration.ofSeconds(8)))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.MAX_ATTEMPTS_EXCEEDED) + .retryQuota(480))), + + aScenario("Verify max backoff time.") + .given(g -> + g.maxAttempts(5) + .initialRetryTokens(500) + .maxBackoff(Duration.ofSeconds(3))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(495) + .delay(Duration.ofSeconds(1)))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(490) + .delay(Duration.ofSeconds(2)))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(485) + .delay(Duration.ofSeconds(3)))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(480) + .delay(Duration.ofSeconds(3)))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.MAX_ATTEMPTS_EXCEEDED) + .retryQuota(480))), + + aScenario("Retry Stops After Retry Quota Exhaustion") + .given(g -> + g.maxAttempts(5) + .initialRetryTokens(10) + .maxBackoff(Duration.ofSeconds(20))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(5) + .delay(Duration.ofSeconds(1)))) + .addResponse(r -> + r.statusCode(502) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(0) + .delay(Duration.ofSeconds(2)))) + .addResponse(r -> + r.statusCode(503) + .expected(e -> + e.outcome(Outcome.RETRY_QUOTA_EXCEEDED) + .retryQuota(0))), + + aScenario("Retry quota Recovery After Successful Responses") + .given(g -> + g.maxAttempts(5) + .initialRetryTokens(15) + .maxBackoff(Duration.ofSeconds(20))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(10) + .delay(Duration.ofSeconds(1)))) + .addResponse(r -> + r.statusCode(502) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(5) + .delay(Duration.ofSeconds(2)))) + .addResponse(r -> + r.statusCode(200) + .expected(e -> + e.outcome(Outcome.SUCCESS) + .retryQuota(10))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(5) + .delay(Duration.ofSeconds(1)))) + .addResponse(r -> + r.statusCode(200) + .expected(e -> + e.outcome(Outcome.SUCCESS) + .retryQuota(10) + .delay(Duration.ofSeconds(1)))), + + // taken from v2.1 tests, adjusted with all 0 delay for acquire failures + aScenario("Long-Polling Backoff After Transient Error When Token Bucket Empty") + .given(g -> g.isLongPolling(true) + .initialRetryTokens(0)) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_QUOTA_EXCEEDED) + .delay(Duration.ZERO) + .retryQuota(0))), + + aScenario("Long-Polling Backoff After Throttling Error When Token Bucket Empty") + .given(g -> g.isLongPolling(true) + .initialRetryTokens(0)) + .addResponse(r -> + r.statusCode(400) + .isThrottling(true) + .expected(e -> + e.outcome(Outcome.RETRY_QUOTA_EXCEEDED) + .delay(Duration.ZERO) + .retryQuota(0))), + + aScenario("Long-Polling Max Attempts Exceeded Must NOT Delay") + .given(g -> + g.isLongPolling(true) + .maxAttempts(2)) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofSeconds(1)) + .retryQuota(495))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.MAX_ATTEMPTS_EXCEEDED) + .delay(Duration.ZERO) + .retryQuota(495))) + ); } - private static Stream longPollingScenarios() { + private static Stream retriesV21Tests() { return Stream.of( - aScenario("Long-Polling Backoff When Token Bucket Empty") - .given(g -> g.isLongPolling(true)) - .addResponse(r -> r.statusCode(500) - .expected(e -> e.retryQuota(0) - .delay(Duration.ofMillis(50)) - .outcome(Outcome.RETRY_QUOTA_EXCEEDED))), - aScenario("Not Long-Polling, Does Not Backoff When Token Bucket Empty") - .given(g -> g.isLongPolling(false)) - .addResponse(r -> r.statusCode(500) - .expected(e -> e.retryQuota(0) - .delay(Duration.ZERO) - .outcome(Outcome.RETRY_QUOTA_EXCEEDED))) + aScenario("Retry eventually succeeds.") + .given(g -> { + }) + .newRetries2026(true) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(486) + .delay(Duration.ofMillis(50)))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(472) + .delay(Duration.ofMillis(100)))) + .addResponse(r -> + r.statusCode(200) + .expected(e -> + e.outcome(Outcome.SUCCESS) + .retryQuota(486))), + + aScenario("Fail due to max attempts reached.") + .newRetries2026(true) + .addResponse(r -> + r.statusCode(502) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(486) + .delay(Duration.ofMillis(50)))) + .addResponse(r -> + r.statusCode(502) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(472) + .delay(Duration.ofMillis(100)))) + .addResponse(r -> + r.statusCode(502) + .expected(e -> + e.outcome(Outcome.MAX_ATTEMPTS_EXCEEDED) + .retryQuota(472))), + aScenario("Retry Quota reached after a single retry.") + .newRetries2026(true) + .given(g -> g.initialRetryTokens(14)) + .addResponse(r -> + r.statusCode(502) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .retryQuota(0) + .delay(Duration.ofMillis(50)))) + .addResponse(r -> + r.statusCode(502) + .expected(e -> + e.outcome(Outcome.RETRY_QUOTA_EXCEEDED) + .retryQuota(0))), + aScenario("No retries at all if retry quota is 0.") + .newRetries2026(true) + .given(g -> g.initialRetryTokens(0)) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_QUOTA_EXCEEDED) + .retryQuota(0))), + aScenario("Verifying exponential backoff timing.") + .newRetries2026(true) + .given(g -> g.maxAttempts(5)) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(50)) + .retryQuota(486))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(100)) + .retryQuota(472))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(200)) + .retryQuota(458))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(400)) + .retryQuota(444))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.MAX_ATTEMPTS_EXCEEDED) + .retryQuota(444))), + + aScenario("Verify max backoff time.") + .newRetries2026(true) + .given(g -> g.maxAttempts(5).maxBackoff(Duration.ofMillis(200))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(50)) + .retryQuota(486))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(100)) + .retryQuota(472))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(200)) + .retryQuota(458))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(200)) + .retryQuota(444))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.MAX_ATTEMPTS_EXCEEDED) + .retryQuota(444))), + + aScenario("Retry Stops After Retry Quota Exhaustion") + .newRetries2026(true) + .given(g -> g.maxAttempts(5).initialRetryTokens(20)) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(50)) + .retryQuota(6))) + .addResponse(r -> + r.statusCode(502) + .expected(e -> + e.outcome(Outcome.RETRY_QUOTA_EXCEEDED) + .retryQuota(6))), + + aScenario("Retry quota Recovery After Successful Responses") + .newRetries2026(true) + .given(g -> g.maxAttempts(5).initialRetryTokens(30)) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(50)) + .retryQuota(16))) + .addResponse(r -> + r.statusCode(502) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(100)) + .retryQuota(2))) + .addResponse(r -> + r.statusCode(200) + .expected(e -> + e.outcome(Outcome.SUCCESS) + .retryQuota(16))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(50)) + .retryQuota(2))) + .addResponse(r -> + r.statusCode(200) + .expected(e -> + e.outcome(Outcome.SUCCESS) + .retryQuota(16))), + + aScenario("Throttling Error Token Bucket Drain (5 tokens) and Backoff Duration (1000ms)") + .newRetries2026(true) + .addResponse(r -> + r.statusCode(400) + .isThrottling(true) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(1000)) + .retryQuota(495))) + .addResponse(r -> + r.statusCode(200) + .expected(e -> + e.outcome(Outcome.SUCCESS) + .retryQuota(500))), + + aScenario("Long-Polling Backoff After Transient Error When Token Bucket Empty") + .newRetries2026(true) + .given(g -> g.isLongPolling(true) + .initialRetryTokens(0)) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_QUOTA_EXCEEDED) + .delay(Duration.ofMillis(50)) + .retryQuota(0))), + + aScenario("Long-Polling Backoff After Throttling Error When Token Bucket Empty") + .newRetries2026(true) + .given(g -> g.isLongPolling(true) + .initialRetryTokens(0)) + .addResponse(r -> + r.statusCode(400) + .isThrottling(true) + .expected(e -> + e.outcome(Outcome.RETRY_QUOTA_EXCEEDED) + .delay(Duration.ofMillis(1000)) + .retryQuota(0))), + + aScenario("Long-Polling Max Attempts Exceeded Must NOT Delay") + .newRetries2026(true) + .given(g -> + g.isLongPolling(true) + .maxAttempts(2)) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(50)) + .retryQuota(486))) + .addResponse(r -> + r.statusCode(500) + .expected(e -> + e.outcome(Outcome.MAX_ATTEMPTS_EXCEEDED) + .delay(Duration.ZERO) + .retryQuota(486))) ); } @@ -158,8 +681,19 @@ private static Scenario aScenario(String description) { return new Scenario(description); } + private static class ScenarioTestException extends RuntimeException { + private final int statusCode; + private final boolean throttling; + + public ScenarioTestException(int statusCode, boolean throttling) { + this.statusCode = statusCode; + this.throttling = throttling; + } + } + private static class Given { - private int maxAttempts; + private Integer maxAttempts; + private Integer initialRetryTokens; private boolean isLongPolling; private Duration maxBackoff; @@ -168,6 +702,11 @@ public Given maxAttempts(int maxAttempts) { return this; } + public Given initialRetryTokens(int initialRetryTokens) { + this.initialRetryTokens = initialRetryTokens; + return this; + } + public Given isLongPolling(boolean isLongPolling) { this.isLongPolling = isLongPolling; return this; @@ -181,6 +720,7 @@ public Given maxBackoff(Duration maxBackoff) { private static class Response { private int statusCode; + private boolean throttling; private Expected expected; public Response statusCode(int statusCode) { @@ -188,6 +728,10 @@ public Response statusCode(int statusCode) { return this; } + public Response isThrottling(boolean throttling) { + this.throttling = throttling; + return this; + } public Response expected(Consumer acceptor) { this.expected = new Expected(); @@ -226,13 +770,19 @@ private enum Outcome { private static class Scenario { private String description; - private Given given; + private boolean newRetries2026; + private Given given = new Given(); private List responses = new ArrayList<>(); public Scenario(String description) { this.description = description; } + public Scenario newRetries2026(boolean newRetries2026) { + this.newRetries2026 = newRetries2026; + return this; + } + public Scenario given(Consumer acceptor) { this.given = new Given(); acceptor.accept(this.given); From 270414ed5ea81bf0fb72fe74d0289bd1f6599f0c Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Tue, 28 Apr 2026 08:53:11 -0700 Subject: [PATCH 09/18] Support backoff on refresh failure (#6912) Retry strategies can optionally return a backoff even when token refresh fails. Add support for this in the sync and async retry stages. In RetryableStage and AsyncRetryableStage, check the value of TokenAcquisitionFailedException#delay() backoff if given. --- .../pipeline/stages/AsyncRetryableStage.java | 25 ++- .../http/pipeline/stages/RetryableStage.java | 14 +- .../stages/utils/RetryableStageHelper.java | 34 ++- .../stages/AsyncRetryableStageTest.java | 195 ++++++++++++++++++ .../pipeline/stages/RetryableStageTest.java | 170 +++++++++++++++ .../utils/RetryableStageHelperTest.java | 67 ++++++ 6 files changed, 486 insertions(+), 19 deletions(-) create mode 100644 core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStageTest.java create mode 100644 core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStageTest.java diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStage.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStage.java index 3e3d79a68524..7a6147bc4781 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStage.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStage.java @@ -34,6 +34,7 @@ import software.amazon.awssdk.core.internal.http.pipeline.stages.utils.RetryableStageHelper; import software.amazon.awssdk.http.SdkHttpFullRequest; import software.amazon.awssdk.utils.CompletableFutureUtils; +import software.amazon.awssdk.utils.Either; /** * Wrapper around the pipeline for a single request to provide retry, clockskew and request throttling functionality. @@ -134,9 +135,20 @@ private void attemptExecute(CompletableFuture> future) { } public void maybeAttemptExecute(CompletableFuture> future) { - Optional delay = retryableStageHelper.tryRefreshToken(Duration.ZERO); - if (!delay.isPresent()) { - future.completeExceptionally(retryableStageHelper.retryPolicyDisallowedRetryException()); + Either backoffDelay = retryableStageHelper.tryRefreshToken(Duration.ZERO); + + Optional acquireFailureDelay = backoffDelay.right(); + if (acquireFailureDelay.isPresent()) { + Duration delay = acquireFailureDelay.get(); + retryableStageHelper.logAcquireFailureBackingOff(delay); + SdkException disallowedException = retryableStageHelper.retryPolicyDisallowedRetryException(); + // Avoid needless scheduling if we won't wait + if (delay.isZero()) { + future.completeExceptionally(disallowedException); + } else { + scheduledExecutor.schedule(() -> future.completeExceptionally(disallowedException), + delay.toMillis(), MILLISECONDS); + } return; } // We failed the last attempt, but will retry. The response handler wants to know when that happens. @@ -145,9 +157,10 @@ public void maybeAttemptExecute(CompletableFuture> future) { // Reset the request provider to the original one before retries, in case it was modified downstream. context.requestProvider(originalRequestBody); - Duration backoffDelay = delay.get(); - retryableStageHelper.logBackingOff(backoffDelay); - long totalDelayMillis = backoffDelay.toMillis(); + // get() is safe, Either requires left OR right to be present + Duration successDelay = backoffDelay.left().get(); + retryableStageHelper.logBackingOff(successDelay); + long totalDelayMillis = successDelay.toMillis(); scheduledExecutor.schedule(() -> attemptExecute(future), totalDelayMillis, MILLISECONDS); } diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStage.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStage.java index a545cb4b088e..6b04e688ff77 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStage.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStage.java @@ -29,6 +29,7 @@ import software.amazon.awssdk.core.internal.http.pipeline.stages.utils.RetryableStageHelper; import software.amazon.awssdk.http.SdkHttpFullRequest; import software.amazon.awssdk.http.SdkHttpFullResponse; +import software.amazon.awssdk.utils.Either; /** * Wrapper around the pipeline for a single request to provide retry, clock-skew and request throttling functionality. @@ -64,12 +65,19 @@ public Response execute(SdkHttpFullRequest request, RequestExecutionCon } retryableStageHelper.setLastException(throwable); Duration suggestedDelay = suggestedDelay(e); - Optional backoffDelay = retryableStageHelper.tryRefreshToken(suggestedDelay); - if (backoffDelay.isPresent()) { - Duration delay = backoffDelay.get(); + Either backoffDelay = retryableStageHelper.tryRefreshToken(suggestedDelay); + Optional successDelay = backoffDelay.left(); + if (successDelay.isPresent()) { + Duration delay = successDelay.get(); retryableStageHelper.logBackingOff(delay); TimeUnit.MILLISECONDS.sleep(delay.toMillis()); } else { + Optional failureDelay = backoffDelay.right(); + if (failureDelay.isPresent()) { + Duration delay = failureDelay.get(); + retryableStageHelper.logAcquireFailureBackingOff(delay); + TimeUnit.MILLISECONDS.sleep(delay.toMillis()); + } throw retryableStageHelper.retryPolicyDisallowedRetryException(); } } diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelper.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelper.java index 07132d6a5ba3..b78d1a2fba96 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelper.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelper.java @@ -49,6 +49,7 @@ import software.amazon.awssdk.retries.api.RetryStrategy; import software.amazon.awssdk.retries.api.RetryToken; import software.amazon.awssdk.retries.api.TokenAcquisitionFailedException; +import software.amazon.awssdk.utils.Either; /** * Contains the logic shared by {@link RetryableStage} and {@link AsyncRetryableStage} when querying and interacting with a @@ -126,16 +127,17 @@ public void recordAttemptSucceeded() { } /** - * Invoked after a failed attempt and before retrying. The returned optional will be non-empty if the client can retry or - * empty if the retry-strategy disallows the retry. The calling code is expected to wait the delay represented in the duration - * if present before retrying the request. + * Invoked after a failed attempt and before retrying. The returned {@link Either} will have its left be populated + * if the refresh is successful. The right is populated if the refresh is unsuccessful. In either case, the calling + * code is expected to wait the delay represented in the duration before retrying the request or exiting the retry loop. * * @param suggestedDelay A suggested delay, presumably coming from the server response. The response when present will be at * least this amount. - * @return An optional time to wait. If the value is not present the retry strategy disallowed the retry and the calling code - * should not retry. + * @return An optional time to wait, regardless of whether the refresh is successful. If the left value is present, the + * retry strategy allowed the retry. If the right value is present the retry strategy disallowed the retry and the calling + * code should not retry. */ - public Optional tryRefreshToken(Duration suggestedDelay) { + public Either tryRefreshToken(Duration suggestedDelay) { RetryToken retryToken = context.executionAttributes().getAttribute(RETRY_TOKEN); RefreshRetryTokenResponse refreshResponse; try { @@ -148,12 +150,18 @@ public Optional tryRefreshToken(Duration suggestedDelay) { refreshResponse = retryStrategy().refreshRetryToken(refreshRequest); } catch (TokenAcquisitionFailedException e) { context.executionAttributes().putAttribute(RETRY_TOKEN, e.token()); - return Optional.empty(); + Optional acquireFailureDelay = e.delay(); + if (acquireFailureDelay.isPresent()) { + Duration acquireDelay = acquireFailureDelay.get(); + context.executionAttributes().putAttribute(LAST_BACKOFF_DELAY_DURATION, acquireDelay); + return Either.right(acquireDelay); + } + return Either.right(Duration.ZERO); } - Duration delay = refreshResponse.delay(); + Duration acquireSuccessDelay = refreshResponse.delay(); context.executionAttributes().putAttribute(RETRY_TOKEN, refreshResponse.token()); - context.executionAttributes().putAttribute(LAST_BACKOFF_DELAY_DURATION, delay); - return Optional.of(delay); + context.executionAttributes().putAttribute(LAST_BACKOFF_DELAY_DURATION, acquireSuccessDelay); + return Either.left(acquireSuccessDelay); } /** @@ -185,6 +193,12 @@ public void logBackingOff(Duration backoffDelay) { attemptNumber, lastException); } + public void logAcquireFailureBackingOff(Duration acquireFailureBackoffDelay) { + SdkStandardLogger.REQUEST_LOGGER.debug(() -> "Unable to acquire sufficient retry quota to retry. Will cease retrying in " + + acquireFailureBackoffDelay.toMillis() + "ms. Request attempt number " + + attemptNumber, lastException); + } + /** * Retrieve the request to send to the service, including any detailed retry information headers. */ diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStageTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStageTest.java new file mode 100644 index 000000000000..862c14465016 --- /dev/null +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStageTest.java @@ -0,0 +1,195 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.core.internal.http.pipeline.stages; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.net.URI; +import java.time.Duration; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Stream; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import software.amazon.awssdk.core.Response; +import software.amazon.awssdk.core.SdkRequest; +import software.amazon.awssdk.core.SdkResponse; +import software.amazon.awssdk.core.client.config.SdkClientConfiguration; +import software.amazon.awssdk.core.client.config.SdkClientOption; +import software.amazon.awssdk.core.exception.SdkException; +import software.amazon.awssdk.core.http.ExecutionContext; +import software.amazon.awssdk.core.interceptor.ExecutionAttributes; +import software.amazon.awssdk.core.internal.http.HttpClientDependencies; +import software.amazon.awssdk.core.internal.http.RequestExecutionContext; +import software.amazon.awssdk.core.internal.http.TransformingAsyncResponseHandler; +import software.amazon.awssdk.core.internal.http.pipeline.RequestPipeline; +import software.amazon.awssdk.http.SdkHttpFullRequest; +import software.amazon.awssdk.http.SdkHttpFullResponse; +import software.amazon.awssdk.http.SdkHttpMethod; +import software.amazon.awssdk.metrics.NoOpMetricCollector; +import software.amazon.awssdk.retries.api.AcquireInitialTokenResponse; +import software.amazon.awssdk.retries.api.RefreshRetryTokenResponse; +import software.amazon.awssdk.retries.api.RetryStrategy; +import software.amazon.awssdk.retries.api.RetryToken; +import software.amazon.awssdk.retries.api.TokenAcquisitionFailedException; + +public class AsyncRetryableStageTest { + private RetryStrategy mockRetryStrategy; + private AcquireInitialTokenResponse mockAcquireInitialTokenResponse; + private RetryToken mockRetryToken; + + private RequestPipeline>> mockDelegatePipeline; + + private static ScheduledExecutorService executorService; + + @BeforeAll + static void setup() { + executorService = Executors.newScheduledThreadPool(1); + } + + @AfterAll + static void teardown() { + executorService.shutdownNow(); + } + + @BeforeEach + void methodSetup() { + mockRetryStrategy = mock(RetryStrategy.class); + mockAcquireInitialTokenResponse = mock(AcquireInitialTokenResponse.class); + mockRetryToken = mock(RetryToken.class); + + when(mockAcquireInitialTokenResponse.token()).thenReturn(mockRetryToken); + when(mockAcquireInitialTokenResponse.delay()).thenReturn(Duration.ZERO); + + when(mockRetryStrategy.acquireInitialToken(any())).thenReturn(mockAcquireInitialTokenResponse); + + mockDelegatePipeline = mock(RequestPipeline.class); + } + + @ParameterizedTest + @MethodSource("acquireDelayTestCases") + void execute_acquireDelay_behavesCorrectly(AcquireDelayTestCase testCase) throws Exception { + SdkClientConfiguration clientConfig = SdkClientConfiguration.builder() + .option(SdkClientOption.RETRY_STRATEGY, mockRetryStrategy) + .option(SdkClientOption.SCHEDULED_EXECUTOR_SERVICE, + executorService) + .build(); + + HttpClientDependencies deps = HttpClientDependencies.builder() + .clientConfiguration(clientConfig) + .build(); + + AsyncRetryableStage retryableStage = new AsyncRetryableStage<>(mock(TransformingAsyncResponseHandler.class), + deps, mockDelegatePipeline); + + SdkHttpFullRequest httpRequest = SdkHttpFullRequest.builder() + .method(SdkHttpMethod.GET) + .uri(URI.create("https://my-service.amazonaws.com")) + .build(); + + ExecutionAttributes execAttrs = ExecutionAttributes.builder() + .build(); + + ExecutionContext execCtx = ExecutionContext.builder() + .metricCollector(NoOpMetricCollector.create()) + .executionAttributes(execAttrs) + .build(); + + RequestExecutionContext ctx = RequestExecutionContext.builder() + .originalRequest(mock(SdkRequest.class)) + .executionContext(execCtx) + .build(); + + SdkHttpFullResponse.Builder httpResponse = SdkHttpFullResponse.builder() + .statusCode(502); + + Response response = Response.builder() + .httpResponse(httpResponse.build()) + .isSuccess(false) + .exception(SdkException.builder().build()) + .build(); + + when(mockDelegatePipeline.execute(any(), any())).thenReturn(CompletableFuture.completedFuture(response)); + + if (testCase.failure) { + when(mockRetryStrategy.refreshRetryToken(any())).thenThrow( + new TokenAcquisitionFailedException("Acquire failed", mockRetryToken, null, testCase.failureDelay) + ); + } else { + // only retry once, otherwise we'll get into an infinite loop + AtomicBoolean first = new AtomicBoolean(); + when(mockRetryStrategy.refreshRetryToken(any())).thenAnswer(i -> { + if (first.compareAndSet(false, true)) { + return RefreshRetryTokenResponse.create(mockRetryToken, testCase.successDelay); + } + throw new TokenAcquisitionFailedException("Acquire failed", mockRetryToken, null, Duration.ZERO); + }); + } + + long start = System.nanoTime(); + CompletableFuture> execute = retryableStage.execute(httpRequest, ctx); + // exception thrown doesn't matter, just results in exception because we mock just enough... + assertThatThrownBy(execute::join); + long end = System.nanoTime(); + + Duration lowerBound = testCase.expectedDelay(); + assertThat(Duration.ofNanos(end - start)).isBetween(lowerBound, lowerBound.plusMillis(250)); + } + + private static Stream acquireDelayTestCases() { + return Stream.of( + new AcquireDelayTestCase(true, Duration.ofDays(1), Duration.ZERO), + new AcquireDelayTestCase(true, Duration.ofDays(1), Duration.ofMillis(100)), + + + new AcquireDelayTestCase(false, Duration.ZERO, Duration.ofDays(1)), + new AcquireDelayTestCase(false, Duration.ofMillis(100), Duration.ofDays(1)) + ); + } + + private static class AcquireDelayTestCase { + private boolean failure; + private Duration successDelay; + private Duration failureDelay; + + public AcquireDelayTestCase(boolean failure, Duration successDelay, Duration failureDelay) { + this.failure = failure; + this.successDelay = successDelay; + this.failureDelay = failureDelay; + } + + public Duration expectedDelay() { + if (failure) { + return failureDelay; + } + return successDelay; + } + + @Override + public String toString() { + return (failure ? "Failure" : "Success") + " with delay " + expectedDelay(); + } + } +} diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStageTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStageTest.java new file mode 100644 index 000000000000..e645f34ea1ac --- /dev/null +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStageTest.java @@ -0,0 +1,170 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.core.internal.http.pipeline.stages; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.net.URI; +import java.time.Duration; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Stream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import software.amazon.awssdk.core.Response; +import software.amazon.awssdk.core.SdkRequest; +import software.amazon.awssdk.core.SdkResponse; +import software.amazon.awssdk.core.client.config.SdkClientConfiguration; +import software.amazon.awssdk.core.client.config.SdkClientOption; +import software.amazon.awssdk.core.exception.SdkException; +import software.amazon.awssdk.core.http.ExecutionContext; +import software.amazon.awssdk.core.interceptor.ExecutionAttributes; +import software.amazon.awssdk.core.internal.http.HttpClientDependencies; +import software.amazon.awssdk.core.internal.http.RequestExecutionContext; +import software.amazon.awssdk.core.internal.http.pipeline.RequestPipeline; +import software.amazon.awssdk.http.SdkHttpFullRequest; +import software.amazon.awssdk.http.SdkHttpFullResponse; +import software.amazon.awssdk.http.SdkHttpMethod; +import software.amazon.awssdk.retries.api.AcquireInitialTokenResponse; +import software.amazon.awssdk.retries.api.RefreshRetryTokenResponse; +import software.amazon.awssdk.retries.api.RetryStrategy; +import software.amazon.awssdk.retries.api.RetryToken; +import software.amazon.awssdk.retries.api.TokenAcquisitionFailedException; + +public class RetryableStageTest { + private RetryStrategy mockRetryStrategy; + private AcquireInitialTokenResponse mockAcquireInitialTokenResponse; + private RetryToken mockRetryToken; + + private RequestPipeline> mockDelegatePipeline; + + @BeforeEach + void setup() { + mockRetryStrategy = mock(RetryStrategy.class); + mockAcquireInitialTokenResponse = mock(AcquireInitialTokenResponse.class); + mockRetryToken = mock(RetryToken.class); + + when(mockAcquireInitialTokenResponse.token()).thenReturn(mockRetryToken); + when(mockAcquireInitialTokenResponse.delay()).thenReturn(Duration.ZERO); + + when(mockRetryStrategy.acquireInitialToken(any())).thenReturn(mockAcquireInitialTokenResponse); + + mockDelegatePipeline = mock(RequestPipeline.class); + } + + @ParameterizedTest + @MethodSource("acquireDelayTestCases") + void execute_acquireDelay_behavesCorrectly(AcquireDelayTestCase testCase) throws Exception { + SdkClientConfiguration clientConfig = SdkClientConfiguration.builder() + .option(SdkClientOption.RETRY_STRATEGY, mockRetryStrategy) + .build(); + + HttpClientDependencies deps = HttpClientDependencies.builder() + .clientConfiguration(clientConfig) + .build(); + + RetryableStage retryableStage = new RetryableStage<>(deps, mockDelegatePipeline); + + SdkHttpFullRequest httpRequest = SdkHttpFullRequest.builder() + .method(SdkHttpMethod.GET) + .uri(URI.create("https://my-service.amazonaws.com")) + .build(); + + ExecutionAttributes execAttrs = ExecutionAttributes.builder() + .build(); + + ExecutionContext execCtx = ExecutionContext.builder() + .executionAttributes(execAttrs) + .build(); + + RequestExecutionContext ctx = RequestExecutionContext.builder() + .originalRequest(mock(SdkRequest.class)) + .executionContext(execCtx) + .build(); + + SdkHttpFullResponse.Builder httpResponse = SdkHttpFullResponse.builder() + .statusCode(502); + + Response response = Response.builder() + .httpResponse(httpResponse.build()) + .isSuccess(false) + .exception(SdkException.builder().build()) + .build(); + + when(mockDelegatePipeline.execute(any(), any())).thenReturn(response); + + if (testCase.failure) { + when(mockRetryStrategy.refreshRetryToken(any())).thenThrow( + new TokenAcquisitionFailedException("Acquire failed", mockRetryToken, null, testCase.failureDelay)); + } else { + // only retry once, otherwise we'll get into an infinite loop + AtomicBoolean first = new AtomicBoolean(); + when(mockRetryStrategy.refreshRetryToken(any())).thenAnswer(i -> { + if (first.compareAndSet(false, true)) { + return RefreshRetryTokenResponse.create(mockRetryToken, testCase.successDelay); + } + throw new TokenAcquisitionFailedException("Acquire failed", mockRetryToken, null, Duration.ZERO); + }); + } + + long start = System.nanoTime(); + // exception thrown doesn't matter, just results in exception because we mock just enough... + assertThatThrownBy(() -> retryableStage.execute(httpRequest, ctx)); + long end = System.nanoTime(); + + Duration lowerBound = testCase.expectedDelay(); + assertThat(Duration.ofNanos(end - start)).isBetween(lowerBound, lowerBound.plusMillis(250)); + } + + private static Stream acquireDelayTestCases() { + return Stream.of( + new AcquireDelayTestCase(true, Duration.ofDays(1), Duration.ZERO), + new AcquireDelayTestCase(true, Duration.ofDays(1), Duration.ofMillis(100)), + + + new AcquireDelayTestCase(false, Duration.ZERO, Duration.ofDays(1)), + new AcquireDelayTestCase(false, Duration.ofMillis(100), Duration.ofDays(1)) + ); + } + + private static class AcquireDelayTestCase { + private boolean failure; + private Duration successDelay; + private Duration failureDelay; + + public AcquireDelayTestCase(boolean failure, Duration successDelay, Duration failureDelay) { + this.failure = failure; + this.successDelay = successDelay; + this.failureDelay = failureDelay; + } + + public Duration expectedDelay() { + if (failure) { + return failureDelay; + } + return successDelay; + } + + @Override + public String toString() { + return (failure ? "Failure" : "Success") + " with delay " + expectedDelay(); + } + } +} diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelperTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelperTest.java index 09bc2035d924..1febd989ebd3 100644 --- a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelperTest.java +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelperTest.java @@ -43,6 +43,8 @@ import software.amazon.awssdk.retries.api.RefreshRetryTokenResponse; import software.amazon.awssdk.retries.api.RetryStrategy; import software.amazon.awssdk.retries.api.RetryToken; +import software.amazon.awssdk.retries.api.TokenAcquisitionFailedException; +import software.amazon.awssdk.utils.Either; public class RetryableStageHelperTest { @@ -101,6 +103,64 @@ void tryRefreshToken_forwardsLongPollingAttrValue(Boolean attribute, boolean exp assertThat(refreshRequestCaptor.getValue().isLongPolling()).isEqualTo(expected); } + @ParameterizedTest(name = "delay on successful refresh = {0}, delay on failed refresh = {1}") + @MethodSource("refreshBackoffTestParams") + void tryRefreshToken_returnsCorrectBackoff(Duration successDelay, Duration failureDelay) { + SdkHttpFullRequest httpRequest = SdkHttpFullRequest.builder() + .method(SdkHttpMethod.GET) + .uri(URI.create("https://my-service.amazonaws.com")) + .build(); + + ExecutionAttributes.Builder attributes = ExecutionAttributes.builder(); + + ExecutionContext executionContext = ExecutionContext.builder().executionAttributes(attributes.build()).build(); + + RequestExecutionContext requestExecutionContext = RequestExecutionContext.builder() + .originalRequest(mock(SdkRequest.class)) + .executionContext(executionContext) + .build(); + + RetryStrategy retryStrategy = mock(RetryStrategy.class); + + SdkClientConfiguration clientConfig = SdkClientConfiguration.builder() + .option(SdkClientOption.RETRY_STRATEGY, retryStrategy) + .build(); + + HttpClientDependencies dependencies = HttpClientDependencies.builder() + .clientConfiguration(clientConfig) + .build(); + + RetryableStageHelper helper = new RetryableStageHelper(httpRequest, + requestExecutionContext, + dependencies); + + AcquireInitialTokenResponse mockAcquireResponse = mock(AcquireInitialTokenResponse.class); + RetryToken token = mock(RetryToken.class); + when(mockAcquireResponse.token()).thenReturn(token); + when(retryStrategy.acquireInitialToken(any())).thenReturn(mockAcquireResponse); + + if (successDelay != null) { + RefreshRetryTokenResponse mockRefreshResponse = mock(RefreshRetryTokenResponse.class); + when(mockRefreshResponse.delay()).thenReturn(successDelay); + when(retryStrategy.refreshRetryToken(any())).thenReturn(mockRefreshResponse); + } else { + when(retryStrategy.refreshRetryToken(any())).thenThrow( + new TokenAcquisitionFailedException("failed", token, null, failureDelay) + ); + } + + helper.acquireInitialToken(); + + helper.setLastException(new RuntimeException()); + Either backoff = helper.tryRefreshToken(Duration.ZERO); + + if (successDelay != null) { + assertThat(backoff.left().get()).isEqualTo(successDelay); + } else { + assertThat(backoff.right().get()).isEqualTo(failureDelay); + } + } + private static Stream longPollingValueTestParams() { return Stream.of( // Absent should default to false @@ -109,4 +169,11 @@ private static Stream longPollingValueTestParams() { Arguments.of(false, false) ); } + + private static Stream refreshBackoffTestParams() { + return Stream.of( + Arguments.of(null, Duration.ofSeconds(1)), + Arguments.of(Duration.ofSeconds(1), null) + ); + } } From 4de251e3d5c690a19cabf263551ce05e10b47bb8 Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Tue, 28 Apr 2026 21:09:00 -0700 Subject: [PATCH 10/18] Use x-amz-retry-after for suggested delay (#6914) * Use x-amz-retry-after for suggested delay In retries 2.1, 'x-amz-retry-after' must be parsed from the last response and if present, should be used as the suggested delay (i.e. suggested backoff) when attempting another retry. This changes makes updates to RetryableStage and AsyncRetryableStage to parse the header and pass it to the RetryStrategy. As part of this change, we also need to plumb whether retries 2.1 is enabled from the SDK client. * Review comments --- .../builder/AwsDefaultClientBuilder.java | 12 +- .../internal/AwsExecutionContextBuilder.java | 2 + .../client/builder/InternalDefaultsTest.java | 24 ++- .../AwsExecutionContextBuilderTest.java | 13 ++ .../core/client/config/SdkClientOption.java | 5 + .../SdkInternalExecutionAttribute.java | 5 + .../pipeline/stages/AsyncRetryableStage.java | 39 +++- .../http/pipeline/stages/RetryableStage.java | 74 +++++-- .../stages/utils/RetryableStageHelper.java | 4 + .../stages/AsyncRetryableStageTest.java | 101 ++++++--- .../stages/BaseRetryableStageTest.java | 193 ++++++++++++++++++ .../pipeline/stages/RetryableStageTest.java | 92 ++++++--- 12 files changed, 470 insertions(+), 94 deletions(-) create mode 100644 core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/BaseRetryableStageTest.java diff --git a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/client/builder/AwsDefaultClientBuilder.java b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/client/builder/AwsDefaultClientBuilder.java index d97261c3c44d..cf74d712bc26 100644 --- a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/client/builder/AwsDefaultClientBuilder.java +++ b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/client/builder/AwsDefaultClientBuilder.java @@ -437,7 +437,13 @@ private void configureRetryPolicy(SdkClientConfiguration.Builder config) { private void configureRetryStrategy(SdkClientConfiguration.Builder config) { RetryStrategy strategy = config.option(SdkClientOption.RETRY_STRATEGY); if (strategy == null) { - config.lazyOption(SdkClientOption.RETRY_STRATEGY, this::resolveAwsRetryStrategy); + Boolean defaultNewRetries2026 = config.option(SdkClientOption.DEFAULT_NEW_RETRIES_2026); + + config.lazyOption(SdkClientOption.RETRY_STRATEGY, src -> resolveAwsRetryStrategy(src, defaultNewRetries2026)); + + config.option(SdkClientOption.NEW_RETRIES_2026_ENABLED, + new NewRetries2026Resolver().defaultNewRetries2026(defaultNewRetries2026).resolve()); + return; } @@ -457,9 +463,7 @@ private void configureRetryStrategy(SdkClientConfiguration.Builder config) { } - private RetryStrategy resolveAwsRetryStrategy(LazyValueSource config) { - Boolean defaultNewRetries2026 = config.get(SdkClientOption.DEFAULT_NEW_RETRIES_2026); - + private RetryStrategy resolveAwsRetryStrategy(LazyValueSource config, Boolean defaultNewRetries2026) { RetryMode retryMode = RetryMode.resolver() .profileFile(config.get(SdkClientOption.PROFILE_FILE_SUPPLIER)) .profileName(config.get(SdkClientOption.PROFILE_NAME)) diff --git a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilder.java b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilder.java index 0bf89b3754e1..2a7f417a72ae 100644 --- a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilder.java +++ b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilder.java @@ -17,6 +17,7 @@ import static software.amazon.awssdk.auth.signer.internal.util.SignerMethodResolver.resolveSigningMethodUsed; import static software.amazon.awssdk.awscore.internal.AwsServiceProtocol.SMITHY_RPC_V2_CBOR; +import static software.amazon.awssdk.core.client.config.SdkClientOption.NEW_RETRIES_2026_ENABLED; import static software.amazon.awssdk.core.client.config.SdkClientOption.RETRY_POLICY; import static software.amazon.awssdk.core.client.config.SdkClientOption.RETRY_STRATEGY; import static software.amazon.awssdk.core.interceptor.SdkExecutionAttribute.RESOLVED_CHECKSUM_SPECS; @@ -104,6 +105,7 @@ private AwsExecutionContextBuilder() { .putAttribute(AwsSignerExecutionAttribute.SIGNING_REGION, clientConfig.option(AwsClientOption.SIGNING_REGION)) .putAttribute(SdkInternalExecutionAttribute.IS_FULL_DUPLEX, executionParams.isFullDuplex()) .putAttribute(SdkInternalExecutionAttribute.IS_LONG_POLLING, executionParams.isLongPolling()) + .putAttribute(SdkInternalExecutionAttribute.NEW_RETRIES_2026_ENABLED, clientConfig.option(NEW_RETRIES_2026_ENABLED)) .putAttribute(SdkInternalExecutionAttribute.HAS_INITIAL_REQUEST_EVENT, executionParams.hasInitialRequestEvent()) .putAttribute(SdkExecutionAttribute.CLIENT_TYPE, clientConfig.option(SdkClientOption.CLIENT_TYPE)) .putAttribute(SdkExecutionAttribute.SERVICE_NAME, clientConfig.option(SdkClientOption.SERVICE_NAME)) diff --git a/core/aws-core/src/test/java/software/amazon/awssdk/awscore/client/builder/InternalDefaultsTest.java b/core/aws-core/src/test/java/software/amazon/awssdk/awscore/client/builder/InternalDefaultsTest.java index f397e0bc53a2..5c411276e923 100644 --- a/core/aws-core/src/test/java/software/amazon/awssdk/awscore/client/builder/InternalDefaultsTest.java +++ b/core/aws-core/src/test/java/software/amazon/awssdk/awscore/client/builder/InternalDefaultsTest.java @@ -17,6 +17,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; +import static software.amazon.awssdk.core.client.config.SdkClientOption.NEW_RETRIES_2026_ENABLED; import static software.amazon.awssdk.core.client.config.SdkClientOption.RETRY_STRATEGY; import java.util.stream.Stream; @@ -60,7 +61,7 @@ static void teardown() { @ParameterizedTest(name = "system prop = {0}, env var = {1}, default cfg = {2}, expected = {3}") @MethodSource("newRetries2026Settings") void buildClient_precedenceIsCorrect(String systemProperty, String environmentVariable, Boolean defaultConfig, - Class retryStrategyClass) { + Class retryStrategyClass, boolean newRetries2026Enabled) { EnvironmentVariableHelper.run((env) -> { if (environmentVariable != null) { env.set(SdkSystemSetting.AWS_NEW_RETRIES_2026.environmentVariable(), environmentVariable); @@ -80,23 +81,26 @@ void buildClient_precedenceIsCorrect(String systemProperty, String environmentVa assertThat(sync.clientConfiguration.option(RETRY_STRATEGY)).isInstanceOf(retryStrategyClass); assertThat(async.clientConfiguration.option(RETRY_STRATEGY)).isInstanceOf(retryStrategyClass); + + assertThat(sync.clientConfiguration.option(NEW_RETRIES_2026_ENABLED)).isEqualTo(newRetries2026Enabled); + assertThat(async.clientConfiguration.option(NEW_RETRIES_2026_ENABLED)).isEqualTo(newRetries2026Enabled); }); } // system property, environment variable, default config, expected retry strategy static Stream newRetries2026Settings() { return Stream.of( - Arguments.of(null, null, null, LegacyRetryStrategy.class), + Arguments.of(null, null, null, LegacyRetryStrategy.class, false), - Arguments.of("true", null, null, StandardRetryStrategy.class), - Arguments.of("false", null, null, LegacyRetryStrategy.class), - Arguments.of(null, "true", null, StandardRetryStrategy.class), - Arguments.of(null, "false", null, LegacyRetryStrategy.class), - Arguments.of(null, null, true, StandardRetryStrategy.class), - Arguments.of(null, null, false, LegacyRetryStrategy.class), + Arguments.of("true", null, null, StandardRetryStrategy.class, true), + Arguments.of("false", null, null, LegacyRetryStrategy.class, false), + Arguments.of(null, "true", null, StandardRetryStrategy.class, true), + Arguments.of(null, "false", null, LegacyRetryStrategy.class, false), + Arguments.of(null, null, true, StandardRetryStrategy.class, true), + Arguments.of(null, null, false, LegacyRetryStrategy.class, false), - Arguments.of("true", null, false, StandardRetryStrategy.class), - Arguments.of(null, "true", false, StandardRetryStrategy.class) + Arguments.of("true", null, false, StandardRetryStrategy.class, true), + Arguments.of(null, "true", false, StandardRetryStrategy.class, true) ); } diff --git a/core/aws-core/src/test/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilderTest.java b/core/aws-core/src/test/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilderTest.java index f59310eaeacb..65a568289a07 100644 --- a/core/aws-core/src/test/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilderTest.java +++ b/core/aws-core/src/test/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilderTest.java @@ -567,6 +567,19 @@ public void invokeInterceptorsAndCreateExecutionContext_withLongPollingOperation assertThat(executionContext.executionAttributes().getAttribute(SdkInternalExecutionAttribute.IS_LONG_POLLING)).isTrue(); } + @Test + public void invokeInterceptorsAndCreateExecutionContext_newRetries2026EnabledConfig_setsCorrectAttributeValue() { + SdkClientConfiguration clientConfig = testClientConfiguration() + .option(SdkClientOption.NEW_RETRIES_2026_ENABLED, true) + .build(); + ClientExecutionParams executionParams = clientExecutionParams(); + ExecutionContext executionContext = + AwsExecutionContextBuilder.invokeInterceptorsAndCreateExecutionContext(executionParams, clientConfig); + + assertThat(executionContext.executionAttributes() + .getAttribute(SdkInternalExecutionAttribute.NEW_RETRIES_2026_ENABLED)).isTrue(); + } + private ClientExecutionParams clientExecutionParams() { return clientExecutionParams(sdkRequest); } diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/client/config/SdkClientOption.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/client/config/SdkClientOption.java index 0e20334e9ecd..20ea0d01c3b9 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/client/config/SdkClientOption.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/client/config/SdkClientOption.java @@ -311,6 +311,11 @@ public final class SdkClientOption extends ClientOption { */ public static final SdkClientOption DEFAULT_NEW_RETRIES_2026 = new SdkClientOption<>(Boolean.class); + /** + * Whether retries 2.1 behavior is enabled. + */ + public static final SdkClientOption NEW_RETRIES_2026_ENABLED = new SdkClientOption<>(Boolean.class); + /** * The {@link EndpointProvider} configured on the client. */ diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/interceptor/SdkInternalExecutionAttribute.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/interceptor/SdkInternalExecutionAttribute.java index 910c66594106..529e129e18cd 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/interceptor/SdkInternalExecutionAttribute.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/interceptor/SdkInternalExecutionAttribute.java @@ -217,6 +217,11 @@ public final class SdkInternalExecutionAttribute extends SdkExecutionAttribute { */ public static final ExecutionAttribute IS_LONG_POLLING = new ExecutionAttribute<>("IsLongPolling"); + /** + * Indicates whether retries v2.1 is enabled. + */ + public static final ExecutionAttribute NEW_RETRIES_2026_ENABLED = new ExecutionAttribute<>("NewRetries2026Enabled"); + /** * The backing attribute for RESOLVED_CHECKSUM_SPECS. * This holds the real ChecksumSpecs value, and is used to map to the ChecksumAlgorithm signer property diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStage.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStage.java index 7a6147bc4781..20d94a006663 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStage.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStage.java @@ -27,14 +27,17 @@ import software.amazon.awssdk.core.async.AsyncRequestBody; import software.amazon.awssdk.core.client.config.SdkClientOption; import software.amazon.awssdk.core.exception.SdkException; +import software.amazon.awssdk.core.interceptor.SdkInternalExecutionAttribute; import software.amazon.awssdk.core.internal.http.HttpClientDependencies; import software.amazon.awssdk.core.internal.http.RequestExecutionContext; import software.amazon.awssdk.core.internal.http.TransformingAsyncResponseHandler; import software.amazon.awssdk.core.internal.http.pipeline.RequestPipeline; import software.amazon.awssdk.core.internal.http.pipeline.stages.utils.RetryableStageHelper; import software.amazon.awssdk.http.SdkHttpFullRequest; +import software.amazon.awssdk.http.SdkHttpResponse; import software.amazon.awssdk.utils.CompletableFutureUtils; import software.amazon.awssdk.utils.Either; +import software.amazon.awssdk.utils.Logger; /** * Wrapper around the pipeline for a single request to provide retry, clockskew and request throttling functionality. @@ -42,6 +45,8 @@ @SdkInternalApi public final class AsyncRetryableStage implements RequestPipeline>> { + private static final String X_AMZ_RETRY_AFTER_HEADER = "x-amz-retry-after"; + private static final Logger LOG = Logger.loggerFor(AsyncRetryableStage.class); private final TransformingAsyncResponseHandler> responseHandler; private final RequestPipeline>> requestPipeline; @@ -135,7 +140,7 @@ private void attemptExecute(CompletableFuture> future) { } public void maybeAttemptExecute(CompletableFuture> future) { - Either backoffDelay = retryableStageHelper.tryRefreshToken(Duration.ZERO); + Either backoffDelay = retryableStageHelper.tryRefreshToken(suggestedDelay()); Optional acquireFailureDelay = backoffDelay.right(); if (acquireFailureDelay.isPresent()) { @@ -172,5 +177,37 @@ private void maybeRetryExecute(CompletableFuture> future, Exce future.completeExceptionally(t); } } + + private Duration suggestedDelay() { + if (newRetries2026Enabled(context)) { + return xAmzRetryAfter(retryableStageHelper.getLastResponse()).orElse(Duration.ZERO); + } + // Unlike in the sync RetryableStage, we never used 'Retry-After' for suggested delay in async + // https://github.com/aws/aws-sdk-java-v2/blob/1483d30d071716ead3dc1fa6571441658013d5c1/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStage.java#L137 + return Duration.ZERO; + } + } + + /** + * Returns the suggested backoff delay based on the 'x-amz-retry-after' header value in the response. + */ + private Optional xAmzRetryAfter(SdkHttpResponse response) { + Optional optionalXAmzRetryAfter = response.firstMatchingHeader(X_AMZ_RETRY_AFTER_HEADER); + return optionalXAmzRetryAfter.map(xAmzRetryAfter -> { + try { + return Duration.ofMillis(Integer.parseInt(xAmzRetryAfter)); + } catch (NumberFormatException e) { + // Ignore and fallback to returning empty. + LOG.debug(() -> String.format("Unable to parse header '%s' value '%s' as integer", + X_AMZ_RETRY_AFTER_HEADER, xAmzRetryAfter), e); + return null; + } + }); + } + + private boolean newRetries2026Enabled(RequestExecutionContext executionContext) { + return executionContext.executionAttributes() + .getOptionalAttribute(SdkInternalExecutionAttribute.NEW_RETRIES_2026_ENABLED) + .orElse(false); } } diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStage.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStage.java index 6b04e688ff77..3407429f7455 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStage.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStage.java @@ -22,6 +22,7 @@ import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.core.Response; import software.amazon.awssdk.core.exception.SdkException; +import software.amazon.awssdk.core.interceptor.SdkInternalExecutionAttribute; import software.amazon.awssdk.core.internal.http.HttpClientDependencies; import software.amazon.awssdk.core.internal.http.RequestExecutionContext; import software.amazon.awssdk.core.internal.http.pipeline.RequestPipeline; @@ -30,6 +31,7 @@ import software.amazon.awssdk.http.SdkHttpFullRequest; import software.amazon.awssdk.http.SdkHttpFullResponse; import software.amazon.awssdk.utils.Either; +import software.amazon.awssdk.utils.Logger; /** * Wrapper around the pipeline for a single request to provide retry, clock-skew and request throttling functionality. @@ -37,6 +39,9 @@ @SdkInternalApi public final class RetryableStage implements RequestToResponsePipeline { private static final String RETRY_AFTER_HEADER = "Retry-After"; + private static final String X_AMZ_RETRY_AFTER_HEADER = "x-amz-retry-after"; + private static final Logger LOG = Logger.loggerFor(RetryableStage.class); + private final RequestPipeline> requestPipeline; private final HttpClientDependencies dependencies; @@ -87,7 +92,7 @@ public Response execute(SdkHttpFullRequest request, RequestExecutionCon private Duration suggestedDelay(Exception e) { if (e instanceof SdkExceptionWithRetryAfterHint) { SdkExceptionWithRetryAfterHint except = (SdkExceptionWithRetryAfterHint) e; - return Duration.ofSeconds(except.retryAfter()); + return except.retryAfter(); } return Duration.ZERO; } @@ -102,52 +107,83 @@ private Response executeRequest(RetryableStageHelper retryableStageHelp retryableStageHelper.setLastResponse(response.httpResponse()); if (!response.isSuccess()) { retryableStageHelper.adjustClockIfClockSkew(response); - throw responseException(response); + throw responseException(response, context); } return response; } - private RuntimeException responseException(Response response) { - Optional optionalRetryAfter = retryAfter(response.httpResponse()); + private RuntimeException responseException(Response response, RequestExecutionContext context) { + Optional optionalRetryAfter; + if (newRetries2026Enabled(context)) { + optionalRetryAfter = xAmzRetryAfter(response.httpResponse()); + } else { + optionalRetryAfter = retryAfter(response.httpResponse()); + } + if (optionalRetryAfter.isPresent()) { return new SdkExceptionWithRetryAfterHint(optionalRetryAfter.get(), response.exception()); } return response.exception(); } - private Optional retryAfter(SdkHttpFullResponse response) { + /** + * Returns the suggested backoff delay based on the 'x-amz-retry-after' header value in the response. + */ + private Optional xAmzRetryAfter(SdkHttpFullResponse response) { + Optional optionalXAmzRetryAfter = response.firstMatchingHeader(X_AMZ_RETRY_AFTER_HEADER); + return optionalXAmzRetryAfter.map(xAmzRetryAfter -> { + try { + return Duration.ofMillis(Integer.parseInt(xAmzRetryAfter)); + } catch (NumberFormatException e) { + // Ignore and fallback to returning empty. + logIntParseException(X_AMZ_RETRY_AFTER_HEADER, xAmzRetryAfter, e); + return null; + } + }); + } + + /** + * Returns the suggested backoff delay based on the 'Retry-After' header value in the response. + */ + private Optional retryAfter(SdkHttpFullResponse response) { Optional optionalRetryAfterHeader = response.firstMatchingHeader(RETRY_AFTER_HEADER); - if (optionalRetryAfterHeader.isPresent()) { - String retryAfterHeader = optionalRetryAfterHeader.get(); + return optionalRetryAfterHeader.map(retryAfterHeader -> { try { - return Optional.of(Integer.parseInt(retryAfterHeader)); + return Duration.ofSeconds(Integer.parseInt(retryAfterHeader)); } catch (NumberFormatException e) { // Ignore and fallback to returning empty. + logIntParseException(RETRY_AFTER_HEADER, retryAfterHeader, e); + return null; } - } - return Optional.empty(); + }); + } + + private boolean newRetries2026Enabled(RequestExecutionContext executionContext) { + return executionContext.executionAttributes() + .getOptionalAttribute(SdkInternalExecutionAttribute.NEW_RETRIES_2026_ENABLED) + .orElse(false); + } + + private static void logIntParseException(String headerName, String headerValue, Throwable t) { + LOG.debug(() -> String.format("Unable to parse header '%s' value '%s' as integer", headerName, headerValue), t); } // This probably should go directly into SdkException static class SdkExceptionWithRetryAfterHint extends RuntimeException { private final SdkException cause; - private final int seconds; + private final Duration delay; - SdkExceptionWithRetryAfterHint(int seconds, SdkException cause) { - this.seconds = seconds; + SdkExceptionWithRetryAfterHint(Duration delay, SdkException cause) { + this.delay = delay; this.cause = cause; } - public int retryAfter() { - return seconds; + public Duration retryAfter() { + return delay; } public SdkException cause() { return cause; } - - public int seconds() { - return seconds; - } } } diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelper.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelper.java index b78d1a2fba96..840df78367fd 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelper.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/utils/RetryableStageHelper.java @@ -259,6 +259,10 @@ public void setLastResponse(SdkHttpResponse lastResponse) { this.lastResponse = lastResponse; } + public SdkHttpResponse getLastResponse() { + return lastResponse; + } + /** * Returns true if this is the first attempt. */ diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStageTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStageTest.java index 862c14465016..5f0b03ac346f 100644 --- a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStageTest.java +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/AsyncRetryableStageTest.java @@ -19,6 +19,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.net.URI; @@ -27,12 +28,13 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Stream; +import org.junit.Assume; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.ArgumentCaptor; import software.amazon.awssdk.core.Response; import software.amazon.awssdk.core.SdkRequest; import software.amazon.awssdk.core.SdkResponse; @@ -41,6 +43,7 @@ import software.amazon.awssdk.core.exception.SdkException; import software.amazon.awssdk.core.http.ExecutionContext; import software.amazon.awssdk.core.interceptor.ExecutionAttributes; +import software.amazon.awssdk.core.interceptor.SdkInternalExecutionAttribute; import software.amazon.awssdk.core.internal.http.HttpClientDependencies; import software.amazon.awssdk.core.internal.http.RequestExecutionContext; import software.amazon.awssdk.core.internal.http.TransformingAsyncResponseHandler; @@ -50,12 +53,13 @@ import software.amazon.awssdk.http.SdkHttpMethod; import software.amazon.awssdk.metrics.NoOpMetricCollector; import software.amazon.awssdk.retries.api.AcquireInitialTokenResponse; +import software.amazon.awssdk.retries.api.RefreshRetryTokenRequest; import software.amazon.awssdk.retries.api.RefreshRetryTokenResponse; import software.amazon.awssdk.retries.api.RetryStrategy; import software.amazon.awssdk.retries.api.RetryToken; import software.amazon.awssdk.retries.api.TokenAcquisitionFailedException; -public class AsyncRetryableStageTest { +public class AsyncRetryableStageTest extends BaseRetryableStageTest { private RetryStrategy mockRetryStrategy; private AcquireInitialTokenResponse mockAcquireInitialTokenResponse; private RetryToken mockRetryToken; @@ -110,6 +114,7 @@ void execute_acquireDelay_behavesCorrectly(AcquireDelayTestCase testCase) throws .build(); ExecutionAttributes execAttrs = ExecutionAttributes.builder() + .put(SdkInternalExecutionAttribute.NEW_RETRIES_2026_ENABLED, true) .build(); ExecutionContext execCtx = ExecutionContext.builder() @@ -133,16 +138,16 @@ void execute_acquireDelay_behavesCorrectly(AcquireDelayTestCase testCase) throws when(mockDelegatePipeline.execute(any(), any())).thenReturn(CompletableFuture.completedFuture(response)); - if (testCase.failure) { + if (testCase.isFailure()) { when(mockRetryStrategy.refreshRetryToken(any())).thenThrow( - new TokenAcquisitionFailedException("Acquire failed", mockRetryToken, null, testCase.failureDelay) + new TokenAcquisitionFailedException("Acquire failed", mockRetryToken, null, testCase.failureDelay()) ); } else { // only retry once, otherwise we'll get into an infinite loop AtomicBoolean first = new AtomicBoolean(); when(mockRetryStrategy.refreshRetryToken(any())).thenAnswer(i -> { if (first.compareAndSet(false, true)) { - return RefreshRetryTokenResponse.create(mockRetryToken, testCase.successDelay); + return RefreshRetryTokenResponse.create(mockRetryToken, testCase.successDelay()); } throw new TokenAcquisitionFailedException("Acquire failed", mockRetryToken, null, Duration.ZERO); }); @@ -158,38 +163,74 @@ void execute_acquireDelay_behavesCorrectly(AcquireDelayTestCase testCase) throws assertThat(Duration.ofNanos(end - start)).isBetween(lowerBound, lowerBound.plusMillis(250)); } - private static Stream acquireDelayTestCases() { - return Stream.of( - new AcquireDelayTestCase(true, Duration.ofDays(1), Duration.ZERO), - new AcquireDelayTestCase(true, Duration.ofDays(1), Duration.ofMillis(100)), + @ParameterizedTest + @MethodSource("retryAfterTestCases") + void execute_retryableException_treatsRetryAfterCorrectly(RetryAfterTestCase testCase) throws Exception { + Assume.assumeTrue("Async v2.0 behavior doesn't look at Retry-After", testCase.isNewRetries2026Enabled()); - new AcquireDelayTestCase(false, Duration.ZERO, Duration.ofDays(1)), - new AcquireDelayTestCase(false, Duration.ofMillis(100), Duration.ofDays(1)) - ); - } + SdkClientConfiguration clientConfig = SdkClientConfiguration.builder() + .option(SdkClientOption.RETRY_STRATEGY, mockRetryStrategy) + .option(SdkClientOption.SCHEDULED_EXECUTOR_SERVICE, + executorService) + .build(); - private static class AcquireDelayTestCase { - private boolean failure; - private Duration successDelay; - private Duration failureDelay; + HttpClientDependencies deps = HttpClientDependencies.builder() + .clientConfiguration(clientConfig) + .build(); - public AcquireDelayTestCase(boolean failure, Duration successDelay, Duration failureDelay) { - this.failure = failure; - this.successDelay = successDelay; - this.failureDelay = failureDelay; - } + AsyncRetryableStage retryableStage = new AsyncRetryableStage<>(mock(TransformingAsyncResponseHandler.class), + deps, mockDelegatePipeline); + + SdkHttpFullRequest httpRequest = SdkHttpFullRequest.builder() + .method(SdkHttpMethod.GET) + .uri(URI.create("https://my-service.amazonaws.com")) + .build(); + + ExecutionAttributes execAttrs = ExecutionAttributes.builder() + .put(SdkInternalExecutionAttribute.NEW_RETRIES_2026_ENABLED, + testCase.isNewRetries2026Enabled()) + .build(); + + ExecutionContext execCtx = ExecutionContext.builder() + .metricCollector(NoOpMetricCollector.create()) + .executionAttributes(execAttrs) + .build(); - public Duration expectedDelay() { - if (failure) { - return failureDelay; - } - return successDelay; + RequestExecutionContext ctx = RequestExecutionContext.builder() + .originalRequest(mock(SdkRequest.class)) + .executionContext(execCtx) + .build(); + + SdkHttpFullResponse.Builder httpResponse = SdkHttpFullResponse.builder() + .statusCode(502); + + if (testCase.retryAfter() != null) { + httpResponse.putHeader(RETRY_AFTER_HEADER, testCase.retryAfter()); } - @Override - public String toString() { - return (failure ? "Failure" : "Success") + " with delay " + expectedDelay(); + if (testCase.xAmzRetryAfter() != null) { + httpResponse.putHeader(X_AMZ_RETRY_AFTER_HEADER, testCase.xAmzRetryAfter()); } + + Response response = Response.builder() + .httpResponse(httpResponse.build()) + .isSuccess(false) + .exception(SdkException.builder().build()) + .build(); + + when(mockDelegatePipeline.execute(any(), any())).thenReturn(CompletableFuture.completedFuture(response)); + + CompletableFuture> execute = retryableStage.execute(httpRequest, ctx); + // exception thrown doesn't matter, just results in exception because we mock just enough... + assertThatThrownBy(execute::join); + + ArgumentCaptor refreshRequestCaptor = ArgumentCaptor.forClass(RefreshRetryTokenRequest.class); + + verify(mockRetryStrategy).refreshRetryToken(refreshRequestCaptor.capture()); + + RefreshRetryTokenRequest refreshRequest = refreshRequestCaptor.getValue(); + + assertThat(refreshRequest.suggestedDelay().get()).isEqualTo(testCase.expectedDelay()); } } diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/BaseRetryableStageTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/BaseRetryableStageTest.java new file mode 100644 index 000000000000..fcc84e0377fe --- /dev/null +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/BaseRetryableStageTest.java @@ -0,0 +1,193 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.core.internal.http.pipeline.stages; + +import java.time.Duration; +import java.util.stream.Stream; + +class BaseRetryableStageTest { + // note: values are in seconds + protected static final String RETRY_AFTER_HEADER = "Retry-After"; + // note: values are in ms + protected static final String X_AMZ_RETRY_AFTER_HEADER = "x-amz-retry-after"; + + + protected static Stream acquireDelayTestCases() { + return Stream.of( + new AcquireDelayTestCase(true, Duration.ofDays(1), Duration.ZERO), + new AcquireDelayTestCase(true, Duration.ofDays(1), Duration.ofMillis(100)), + + new AcquireDelayTestCase(false, Duration.ZERO, Duration.ofDays(1)), + new AcquireDelayTestCase(false, Duration.ofMillis(100), Duration.ofDays(1)) + ); + } + + protected static Stream retryAfterTestCases() { + return Stream.of( + // v2.0 + new RetryAfterTestCase() + .description("Parses Retry-After correctly") + .retryAfter("1") + .expectedDelay(Duration.ofSeconds(1)), + + new RetryAfterTestCase() + .description("Ignores format error") + .retryAfter("one second") + .expectedDelay(Duration.ZERO), + + new RetryAfterTestCase() + .description("Ignores int overflow") + .retryAfter(Long.toString(Long.MAX_VALUE)) + .expectedDelay(Duration.ZERO), + + new RetryAfterTestCase() + .description("Ignores x-amz-retry-after") + .retryAfter("1") + .xAmzRetryAfter("50") + .expectedDelay(Duration.ofSeconds(1)), + + new RetryAfterTestCase() + .description("No header, no delay") + .expectedDelay(Duration.ZERO), + + // v2.1 + new RetryAfterTestCase() + .newRetries2026Enabled(true) + .description("Parses x-amz-retry-after correctly") + .xAmzRetryAfter("1") + .expectedDelay(Duration.ofMillis(1)), + + new RetryAfterTestCase() + .newRetries2026Enabled(true) + .description("Ignores format error") + .xAmzRetryAfter("one second") + .expectedDelay(Duration.ZERO), + + new RetryAfterTestCase() + .newRetries2026Enabled(true) + .description("Ignores int overflow") + .xAmzRetryAfter(Long.toString(Long.MAX_VALUE)) + .expectedDelay(Duration.ZERO), + + new RetryAfterTestCase() + .newRetries2026Enabled(true) + .description("Ignores Retry-After") + .retryAfter("1") + .xAmzRetryAfter("50") + .expectedDelay(Duration.ofMillis(50)), + + new RetryAfterTestCase() + .newRetries2026Enabled(true) + .description("No header, no delay") + .expectedDelay(Duration.ZERO) + ); + } + + + protected static class AcquireDelayTestCase { + private boolean failure; + private Duration successDelay; + private Duration failureDelay; + + public AcquireDelayTestCase(boolean failure, Duration successDelay, Duration failureDelay) { + this.failure = failure; + this.successDelay = successDelay; + this.failureDelay = failureDelay; + } + + public boolean isFailure() { + return failure; + } + + public Duration failureDelay() { + return failureDelay; + } + + public Duration successDelay() { + return successDelay; + } + + public Duration expectedDelay() { + if (failure) { + return failureDelay; + } + return successDelay; + } + + @Override + public String toString() { + return (failure ? "Failure" : "Success") + " with delay " + expectedDelay(); + } + } + + + protected static class RetryAfterTestCase { + private String description; + private String retryAfter; + private String xAmzRetryAfter; + private boolean newRetries2026Enabled; + private Duration expectedDelay; + + public RetryAfterTestCase description(String description) { + this.description = description; + return this; + } + + public RetryAfterTestCase retryAfter(String retryAfter) { + this.retryAfter = retryAfter; + return this; + } + + public String retryAfter() { + return retryAfter; + } + + public RetryAfterTestCase xAmzRetryAfter(String xAmzRetryAfter) { + this.xAmzRetryAfter = xAmzRetryAfter; + return this; + } + + public String xAmzRetryAfter() { + return xAmzRetryAfter; + } + + public RetryAfterTestCase newRetries2026Enabled(boolean newRetries2026Enabled) { + this.newRetries2026Enabled = newRetries2026Enabled; + return this; + } + + public boolean isNewRetries2026Enabled() { + return newRetries2026Enabled; + } + + public RetryAfterTestCase expectedDelay(Duration expectedDelay) { + this.expectedDelay = expectedDelay; + return this; + } + + public Duration expectedDelay() { + return expectedDelay; + } + + @Override + public String toString() { + if (newRetries2026Enabled) { + return "[v2.1] " + description; + } + return description; + } + } +} diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStageTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStageTest.java index e645f34ea1ac..d5dff64c4746 100644 --- a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStageTest.java +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/pipeline/stages/RetryableStageTest.java @@ -19,15 +19,16 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.net.URI; import java.time.Duration; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.ArgumentCaptor; import software.amazon.awssdk.core.Response; import software.amazon.awssdk.core.SdkRequest; import software.amazon.awssdk.core.SdkResponse; @@ -36,6 +37,7 @@ import software.amazon.awssdk.core.exception.SdkException; import software.amazon.awssdk.core.http.ExecutionContext; import software.amazon.awssdk.core.interceptor.ExecutionAttributes; +import software.amazon.awssdk.core.interceptor.SdkInternalExecutionAttribute; import software.amazon.awssdk.core.internal.http.HttpClientDependencies; import software.amazon.awssdk.core.internal.http.RequestExecutionContext; import software.amazon.awssdk.core.internal.http.pipeline.RequestPipeline; @@ -43,12 +45,13 @@ import software.amazon.awssdk.http.SdkHttpFullResponse; import software.amazon.awssdk.http.SdkHttpMethod; import software.amazon.awssdk.retries.api.AcquireInitialTokenResponse; +import software.amazon.awssdk.retries.api.RefreshRetryTokenRequest; import software.amazon.awssdk.retries.api.RefreshRetryTokenResponse; import software.amazon.awssdk.retries.api.RetryStrategy; import software.amazon.awssdk.retries.api.RetryToken; import software.amazon.awssdk.retries.api.TokenAcquisitionFailedException; -public class RetryableStageTest { +public class RetryableStageTest extends BaseRetryableStageTest { private RetryStrategy mockRetryStrategy; private AcquireInitialTokenResponse mockAcquireInitialTokenResponse; private RetryToken mockRetryToken; @@ -88,6 +91,7 @@ void execute_acquireDelay_behavesCorrectly(AcquireDelayTestCase testCase) throws .build(); ExecutionAttributes execAttrs = ExecutionAttributes.builder() + .put(SdkInternalExecutionAttribute.NEW_RETRIES_2026_ENABLED, true) .build(); ExecutionContext execCtx = ExecutionContext.builder() @@ -110,15 +114,15 @@ void execute_acquireDelay_behavesCorrectly(AcquireDelayTestCase testCase) throws when(mockDelegatePipeline.execute(any(), any())).thenReturn(response); - if (testCase.failure) { + if (testCase.isFailure()) { when(mockRetryStrategy.refreshRetryToken(any())).thenThrow( - new TokenAcquisitionFailedException("Acquire failed", mockRetryToken, null, testCase.failureDelay)); + new TokenAcquisitionFailedException("Acquire failed", mockRetryToken, null, testCase.failureDelay())); } else { // only retry once, otherwise we'll get into an infinite loop AtomicBoolean first = new AtomicBoolean(); when(mockRetryStrategy.refreshRetryToken(any())).thenAnswer(i -> { if (first.compareAndSet(false, true)) { - return RefreshRetryTokenResponse.create(mockRetryToken, testCase.successDelay); + return RefreshRetryTokenResponse.create(mockRetryToken, testCase.successDelay()); } throw new TokenAcquisitionFailedException("Acquire failed", mockRetryToken, null, Duration.ZERO); }); @@ -133,38 +137,66 @@ void execute_acquireDelay_behavesCorrectly(AcquireDelayTestCase testCase) throws assertThat(Duration.ofNanos(end - start)).isBetween(lowerBound, lowerBound.plusMillis(250)); } - private static Stream acquireDelayTestCases() { - return Stream.of( - new AcquireDelayTestCase(true, Duration.ofDays(1), Duration.ZERO), - new AcquireDelayTestCase(true, Duration.ofDays(1), Duration.ofMillis(100)), + @ParameterizedTest + @MethodSource("retryAfterTestCases") + void execute_retryableException_treatsRetryAfterCorrectly(RetryAfterTestCase testCase) throws Exception { + SdkClientConfiguration clientConfig = SdkClientConfiguration.builder() + .option(SdkClientOption.RETRY_STRATEGY, mockRetryStrategy) + .build(); + HttpClientDependencies deps = HttpClientDependencies.builder() + .clientConfiguration(clientConfig) + .build(); - new AcquireDelayTestCase(false, Duration.ZERO, Duration.ofDays(1)), - new AcquireDelayTestCase(false, Duration.ofMillis(100), Duration.ofDays(1)) - ); - } + RetryableStage retryableStage = new RetryableStage<>(deps, mockDelegatePipeline); + + SdkHttpFullRequest httpRequest = SdkHttpFullRequest.builder() + .method(SdkHttpMethod.GET) + .uri(URI.create("https://my-service.amazonaws.com")) + .build(); - private static class AcquireDelayTestCase { - private boolean failure; - private Duration successDelay; - private Duration failureDelay; + ExecutionAttributes execAttrs = ExecutionAttributes.builder() + .put(SdkInternalExecutionAttribute.NEW_RETRIES_2026_ENABLED, + testCase.isNewRetries2026Enabled()) + .build(); - public AcquireDelayTestCase(boolean failure, Duration successDelay, Duration failureDelay) { - this.failure = failure; - this.successDelay = successDelay; - this.failureDelay = failureDelay; - } + ExecutionContext execCtx = ExecutionContext.builder() + .executionAttributes(execAttrs) + .build(); - public Duration expectedDelay() { - if (failure) { - return failureDelay; - } - return successDelay; + RequestExecutionContext ctx = RequestExecutionContext.builder() + .originalRequest(mock(SdkRequest.class)) + .executionContext(execCtx) + .build(); + + SdkHttpFullResponse.Builder httpResponse = SdkHttpFullResponse.builder() + .statusCode(502); + + if (testCase.retryAfter() != null) { + httpResponse.putHeader(RETRY_AFTER_HEADER, testCase.retryAfter()); } - @Override - public String toString() { - return (failure ? "Failure" : "Success") + " with delay " + expectedDelay(); + if (testCase.xAmzRetryAfter() != null) { + httpResponse.putHeader(X_AMZ_RETRY_AFTER_HEADER, testCase.xAmzRetryAfter()); } + + Response response = Response.builder() + .httpResponse(httpResponse.build()) + .isSuccess(false) + .exception(SdkException.builder().build()) + .build(); + + when(mockDelegatePipeline.execute(any(), any())).thenReturn(response); + + // exception thrown doesn't matter, just results in exception because we mock just enough... + assertThatThrownBy(() -> retryableStage.execute(httpRequest, ctx)); + + ArgumentCaptor refreshRequestCaptor = ArgumentCaptor.forClass(RefreshRetryTokenRequest.class); + + verify(mockRetryStrategy).refreshRetryToken(refreshRequestCaptor.capture()); + + RefreshRetryTokenRequest refreshRequest = refreshRequestCaptor.getValue(); + + assertThat(refreshRequest.suggestedDelay().get()).isEqualTo(testCase.expectedDelay()); } } From 3eb8f81b4e2a6ea335dbaff3c35477c43d36d8d3 Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Wed, 29 Apr 2026 16:22:37 -0700 Subject: [PATCH 11/18] Retries fixes (#6920) This commit fixes two issues with the original retries implementation: - Honor the 'max_retries' property in the profile file if present - Treat 'LimitExceededException' as a throttling exception --- .../awscore/retry/AwsRetryStrategy.java | 40 +++++++- .../awscore/retry/AwsRetryStrategyTest.java | 98 +++++++++++++++++++ .../awssdk/profiles/ProfileProperty.java | 6 ++ .../internal/retry/MaxAttemptsResolver.java | 73 ++++++++++++++ .../retry/SdkDefaultRetryStrategy.java | 34 ++++++- .../retry/RetryStrategyMaxRetriesTest.java | 67 ++++++++++++- 6 files changed, 310 insertions(+), 8 deletions(-) create mode 100644 core/aws-core/src/test/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategyTest.java create mode 100644 core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/retry/MaxAttemptsResolver.java diff --git a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategy.java b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategy.java index a68b95e503ac..93f9aec6bbc5 100644 --- a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategy.java +++ b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategy.java @@ -18,9 +18,11 @@ import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.awscore.exception.AwsServiceException; import software.amazon.awssdk.awscore.internal.AwsErrorCode; +import software.amazon.awssdk.core.exception.SdkException; import software.amazon.awssdk.core.internal.retry.RetryPolicyAdapter; import software.amazon.awssdk.core.internal.retry.SdkDefaultRetryStrategy; import software.amazon.awssdk.core.retry.RetryMode; +import software.amazon.awssdk.core.retry.RetryUtils; import software.amazon.awssdk.retries.AdaptiveRetryStrategy; import software.amazon.awssdk.retries.DefaultRetryStrategy; import software.amazon.awssdk.retries.LegacyRetryStrategy; @@ -135,7 +137,7 @@ public static StandardRetryStrategy standardRetryStrategy() { */ public static StandardRetryStrategy standardRetryStrategy(boolean newRetries2026Enabled) { StandardRetryStrategy.Builder builder = SdkDefaultRetryStrategy.standardRetryStrategyBuilder(newRetries2026Enabled); - return configure(builder).build(); + return configure(builder, newRetries2026Enabled).build(); } /** @@ -167,7 +169,7 @@ public static AdaptiveRetryStrategy adaptiveRetryStrategy() { */ public static AdaptiveRetryStrategy adaptiveRetryStrategy(boolean newRetries2026Enabled) { AdaptiveRetryStrategy.Builder builder = SdkDefaultRetryStrategy.adaptiveRetryStrategyBuilder(newRetries2026Enabled); - return configure(builder) + return configure(builder, newRetries2026Enabled) .build(); } @@ -179,7 +181,22 @@ public static AdaptiveRetryStrategy adaptiveRetryStrategy(boolean newRetries2026 * @return The given builder */ public static > T configure(T builder) { + return configure(builder, false); + } + + /** + * Configures a retry strategy using its builder to add AWS-specific retry exceptions. + * + * @param builder The builder to add the AWS-specific retry exceptions + * @param The type of the builder extending {@link RetryStrategy.Builder} + * @return The given builder + */ + private static > T configure(T builder, boolean newRetries2026Enabled) { builder.retryOnException(AwsRetryStrategy::retryOnAwsRetryableErrors); + if (newRetries2026Enabled) { + builder.retryOnException(AwsRetryStrategy::isLimitExceededErrorCode); + builder.treatAsThrottling(AwsRetryStrategy::treatAsThrottlingV21); + } markDefaultsAdded(builder); return builder; } @@ -205,6 +222,25 @@ private static boolean retryOnAwsRetryableErrors(Throwable ex) { return false; } + /** + * Additionally, check for LimitExceededException as it was not previously treated as a throttling exception. + */ + private static boolean treatAsThrottlingV21(Throwable ex) { + if (!(ex instanceof SdkException)) { + return false; + } + + SdkException sdkException = (SdkException) ex; + + return RetryUtils.isThrottlingException(sdkException) + || isLimitExceededErrorCode(sdkException); + } + + private static boolean isLimitExceededErrorCode(Throwable ex) { + return ex instanceof AwsServiceException + && "LimitExceededException".equals(((AwsServiceException) ex).awsErrorDetails().errorCode()); + } + /** * Returns a {@link RetryStrategy} that implements the legacy {@link RetryMode#ADAPTIVE} mode. * diff --git a/core/aws-core/src/test/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategyTest.java b/core/aws-core/src/test/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategyTest.java new file mode 100644 index 000000000000..12e4f86020e5 --- /dev/null +++ b/core/aws-core/src/test/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategyTest.java @@ -0,0 +1,98 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.awscore.retry; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.google.common.base.Supplier; +import java.time.Duration; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import software.amazon.awssdk.awscore.exception.AwsErrorDetails; +import software.amazon.awssdk.awscore.exception.AwsServiceException; +import software.amazon.awssdk.retries.StandardRetryStrategy; +import software.amazon.awssdk.retries.api.AcquireInitialTokenRequest; +import software.amazon.awssdk.retries.api.RefreshRetryTokenRequest; +import software.amazon.awssdk.retries.api.RetryToken; +import software.amazon.awssdk.retries.api.TokenAcquisitionFailedException; +import software.amazon.awssdk.retries.internal.DefaultRetryToken; + +public class AwsRetryStrategyTest { + + @ParameterizedTest + @CsvSource({"true", "false"}) + void standardRetryStrategy_limitExceededException_retryBehaviorCorrect(boolean newRetries2026Enabled) { + StandardRetryStrategy strategy = AwsRetryStrategy.standardRetryStrategy(newRetries2026Enabled); + + RetryToken token = strategy.acquireInitialToken(AcquireInitialTokenRequest.create("test")).token(); + RefreshRetryTokenRequest refresh = RefreshRetryTokenRequest.builder() + .failure(createTestException("LimitExceededException")) + .token(token) + .build(); + + if (newRetries2026Enabled) { + assertThat(strategy.refreshRetryToken(refresh).delay()).isGreaterThanOrEqualTo(Duration.ZERO); + } else { + assertThatThrownBy(() -> strategy.refreshRetryToken(refresh)) + .isInstanceOf(TokenAcquisitionFailedException.class) + .matches(e -> { + TokenAcquisitionFailedException acquireException = (TokenAcquisitionFailedException) e; + DefaultRetryToken exceptionToken = (DefaultRetryToken) acquireException.token(); + return exceptionToken.state() == DefaultRetryToken.TokenState.NON_RETRYABLE_EXCEPTION; + }); + } + } + + @ParameterizedTest + @CsvSource({"Throttling", + "ThrottlingException", + "ThrottledException", + "RequestThrottledException", + "TooManyRequestsException", + "ProvisionedThroughputExceededException", + "TransactionInProgressException", + "RequestLimitExceeded", + "BandwidthLimitExceeded", + "LimitExceededException", + "RequestThrottled", + "SlowDown", + "PriorRequestNotComplete", + "EC2ThrottledException"}) + void standardRetryStrategy_retry21_throttlingBehaviorCorrect(String errorCode) { + AwsServiceException exception = createTestException(errorCode); + + for (int i = 0; i < 128; ++i) { + StandardRetryStrategy strategy = AwsRetryStrategy.standardRetryStrategy(true); + + RetryToken token = strategy.acquireInitialToken(AcquireInitialTokenRequest.create("test")).token(); + RefreshRetryTokenRequest refresh = RefreshRetryTokenRequest.builder() + .token(token) + .failure(exception) + .build(); + Duration delay = strategy.refreshRetryToken(refresh).delay(); + + assertThat(delay).isBetween(Duration.ZERO, Duration.ofMillis(1000)); + } + } + + private static AwsServiceException createTestException(String errorCode) { + AwsErrorDetails details = AwsErrorDetails.builder() + .errorCode(errorCode) + .build(); + return AwsServiceException.builder().awsErrorDetails(details).build(); + } +} diff --git a/core/profiles/src/main/java/software/amazon/awssdk/profiles/ProfileProperty.java b/core/profiles/src/main/java/software/amazon/awssdk/profiles/ProfileProperty.java index fc1fbc32fe3f..069359c37567 100644 --- a/core/profiles/src/main/java/software/amazon/awssdk/profiles/ProfileProperty.java +++ b/core/profiles/src/main/java/software/amazon/awssdk/profiles/ProfileProperty.java @@ -111,6 +111,12 @@ public final class ProfileProperty { */ public static final String RETRY_MODE = "retry_mode"; + /** + * How many HTTP requests an SDK should make for a single SDK operation invocation before giving up. See the JavaDocs for + * {@code SdkSystemSetting.AWS_MAX_ATTEMPTS} and {@code RetryStrategy.maxAttempts()} for more information. + */ + public static final String MAX_ATTEMPTS = "max_attempts"; + /** * The "defaults mode" to be used for clients created using the currently-configured profile. Defaults mode determins how SDK * default configuration should be resolved. See the {@code DefaultsMode} class JavaDoc for more diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/retry/MaxAttemptsResolver.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/retry/MaxAttemptsResolver.java new file mode 100644 index 000000000000..accb4192b995 --- /dev/null +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/retry/MaxAttemptsResolver.java @@ -0,0 +1,73 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.core.internal.retry; + +import java.util.Optional; +import java.util.function.Supplier; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.core.SdkSystemSetting; +import software.amazon.awssdk.profiles.ProfileFile; +import software.amazon.awssdk.profiles.ProfileFileSystemSetting; +import software.amazon.awssdk.profiles.ProfileProperty; +import software.amazon.awssdk.utils.OptionalUtils; + +/** + * Resolves the retry max attempts from {@link SdkSystemSetting#AWS_MAX_ATTEMPTS} and {@link ProfileProperty#MAX_ATTEMPTS}. + */ +@SdkInternalApi +public class MaxAttemptsResolver { + private Supplier profileFile; + private String profileName; + + /** + * Configure the profile file that should be used when determining the max attempts. The supplier is only consulted + * if a higher-priority determinant (e.g. environment variables) does not find the setting. + */ + public MaxAttemptsResolver profileFile(Supplier profileFile) { + this.profileFile = profileFile; + return this; + } + + /** + * Configure the profile file name should be used when determining the max attempts. + */ + public MaxAttemptsResolver profileName(String profileName) { + this.profileName = profileName; + return this; + } + + /** + * Resolve the max attempts based on the configured values. If not configured, returns {@code null}. + */ + public Integer resolve() { + return OptionalUtils.firstPresent(fromSystemSettings(), () -> fromProfileFile(profileFile, profileName)) + .orElse(null); + } + + + private static Optional fromSystemSettings() { + return SdkSystemSetting.AWS_MAX_ATTEMPTS.getIntegerValue(); + } + + private static Optional fromProfileFile(Supplier profileFile, String profileName) { + profileFile = profileFile != null ? profileFile : ProfileFile::defaultProfileFile; + profileName = profileName != null ? profileName : ProfileFileSystemSetting.AWS_PROFILE.getStringValueOrThrow(); + return profileFile.get() + .profile(profileName) + .flatMap(p -> p.property(ProfileProperty.MAX_ATTEMPTS)) + .map(Integer::parseInt); + } +} diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/retry/SdkDefaultRetryStrategy.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/retry/SdkDefaultRetryStrategy.java index ea4aae5e1869..c31de0a7d4db 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/retry/SdkDefaultRetryStrategy.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/retry/SdkDefaultRetryStrategy.java @@ -70,9 +70,19 @@ public static RetryStrategy defaultRetryStrategy() { * @return the appropriate retry strategy for the retry mode with AWS-specific conditions added. */ public static RetryStrategy forRetryMode(RetryMode mode) { + return forRetryMode(mode, false); + } + + /** + * Retrieve the appropriate retry strategy for the retry mode with AWS-specific conditions added. + * + * @param mode The retry mode for which we want the retry strategy + * @return the appropriate retry strategy for the retry mode with AWS-specific conditions added. + */ + public static RetryStrategy forRetryMode(RetryMode mode, boolean newRetries2026Enabled) { switch (mode) { case STANDARD: - return standardRetryStrategy(); + return standardRetryStrategy(newRetries2026Enabled); case ADAPTIVE: return legacyAdaptiveRetryStrategy(); case ADAPTIVE_V2: @@ -115,6 +125,10 @@ public static StandardRetryStrategy standardRetryStrategy() { return standardRetryStrategyBuilder().build(); } + public static StandardRetryStrategy standardRetryStrategy(boolean newRetries2026Enabled) { + return standardRetryStrategyBuilder(newRetries2026Enabled).build(); + } + /** * Returns a {@link LegacyRetryStrategy} with generic SDK retry conditions. * @@ -149,7 +163,7 @@ public static StandardRetryStrategy.Builder standardRetryStrategyBuilder() { */ public static StandardRetryStrategy.Builder standardRetryStrategyBuilder(boolean newRetries2026Enabled) { StandardRetryStrategy.Builder builder = DefaultRetryStrategy.standardStrategyBuilder(newRetries2026Enabled); - return configure(builder); + return configure(builder, newRetries2026Enabled); } @@ -179,7 +193,7 @@ public static AdaptiveRetryStrategy.Builder adaptiveRetryStrategyBuilder() { */ public static AdaptiveRetryStrategy.Builder adaptiveRetryStrategyBuilder(boolean newRetries2026Enabled) { AdaptiveRetryStrategy.Builder builder = DefaultRetryStrategy.adaptiveStrategyBuilder(newRetries2026Enabled); - return configure(builder); + return configure(builder, newRetries2026Enabled); } /** @@ -190,13 +204,17 @@ public static AdaptiveRetryStrategy.Builder adaptiveRetryStrategyBuilder(boolean * @return The given builder */ public static > T configure(T builder) { + return configure(builder, false); + } + + private static > T configure(T builder, boolean newRetries2026Enabled) { builder.retryOnException(SdkDefaultRetryStrategy::retryOnRetryableException) .retryOnException(SdkDefaultRetryStrategy::retryOnStatusCodes) .retryOnException(SdkDefaultRetryStrategy::retryOnClockSkewException) .retryOnException(SdkDefaultRetryStrategy::retryOnThrottlingCondition); SdkDefaultRetrySetting.RETRYABLE_EXCEPTIONS.forEach(builder::retryOnExceptionOrCauseInstanceOf); builder.treatAsThrottling(SdkDefaultRetryStrategy::treatAsThrottling); - Integer maxAttempts = SdkSystemSetting.AWS_MAX_ATTEMPTS.getIntegerValue().orElse(null); + Integer maxAttempts = resolveMaxAttempts(newRetries2026Enabled); if (maxAttempts != null) { builder.maxAttempts(maxAttempts); } @@ -281,5 +299,13 @@ private static void markDefaultsAdded(RetryStrategy.Builder builder) { } } + static Integer resolveMaxAttempts(boolean newRetries2026Enabled) { + if (newRetries2026Enabled) { + return new MaxAttemptsResolver().resolve(); + } + + // pre 2.1 changes, we never looked at the profile file + return SdkSystemSetting.AWS_MAX_ATTEMPTS.getIntegerValue().orElse(null); + } } diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/RetryStrategyMaxRetriesTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/RetryStrategyMaxRetriesTest.java index b712a9ce4c4c..bc07c151bc76 100644 --- a/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/RetryStrategyMaxRetriesTest.java +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/RetryStrategyMaxRetriesTest.java @@ -18,6 +18,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import com.google.common.base.Supplier; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; @@ -31,6 +32,7 @@ import software.amazon.awssdk.core.SdkSystemSetting; import software.amazon.awssdk.core.internal.retry.SdkDefaultRetryStrategy; import software.amazon.awssdk.profiles.ProfileFileSystemSetting; +import software.amazon.awssdk.retries.api.RetryStrategy; import software.amazon.awssdk.testutils.EnvironmentVariableHelper; import software.amazon.awssdk.utils.Validate; @@ -49,6 +51,7 @@ public static Collection data() { new TestData(null, null, null, null, null, 4), new TestData(null, null, null, null, "PropertyNotSet", 4), + // Test precedence new TestData("9", "2", "standard", "standard", "PropertySetToStandard", 9), @@ -60,6 +63,9 @@ public static Collection data() { "PropertySetToStandard", 3), new TestData(null, null, null, null, "PropertySetToStandard", 3), + // pre v2.1, we didn't look at the max_attempts profile file property + new TestData(null, null, null, null, + "PropertySetMaxAttempts10", 4), // Test invalid values new TestData("wrongValue", null, null, null, null, null), @@ -68,6 +74,31 @@ public static Collection data() { new TestData(null, null, null, "wrongValue", null, null), new TestData(null, null, null, null, "PropertySetToUnsupportedValue", null), + + // v2.1 + + // defaults + new TestData(true, null, null, null, null, null, 3), + new TestData(true, null, null, null, null, "PropertyNotSet", 3), + + // precedence + new TestData(true, "9", null, null, null, + "PropertySetMaxAttempts10", 9), + new TestData(true, null, "8", null, null, + "PropertySetMaxAttempts10", 8), + new TestData(true, "9", "8", null, null, + "PropertySetMaxAttempts10", 9), + new TestData(true, null, null, null, null, + "PropertySetMaxAttempts10", 10), + + // invalid values + new TestData(true, "wrongValue", null, null, null, null, null), + new TestData(true, null, "wrongValue", null, null, null, null), + new TestData(true, null, null, "wrongValue", null, null, null), + new TestData(true, null, null, null, "wrongValue", null, null), + new TestData(true, null, null, null, null, + "PropertySetToUnsupportedValue", null), + }); } @@ -85,10 +116,15 @@ public void methodSetup() { System.clearProperty(SdkSystemSetting.AWS_RETRY_MODE.property()); System.clearProperty(ProfileFileSystemSetting.AWS_PROFILE.property()); System.clearProperty(ProfileFileSystemSetting.AWS_CONFIG_FILE.property()); + System.clearProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()); } @Test public void differentCombinationOfConfigs_shouldResolveCorrectly() { + if (testData.newRetries2026Enabled != null) { + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), testData.newRetries2026Enabled.toString()); + } + if (testData.attemptCountEnvVarValue != null) { ENVIRONMENT_VARIABLE_HELPER.set(SdkSystemSetting.AWS_MAX_ATTEMPTS.environmentVariable(), testData.attemptCountEnvVarValue); @@ -113,10 +149,19 @@ public void differentCombinationOfConfigs_shouldResolveCorrectly() { System.setProperty(ProfileFileSystemSetting.AWS_CONFIG_FILE.property(), diskLocationForFile); } + Supplier retryStrategySupplier; + + if (testData.newRetries2026Enabled != null) { + retryStrategySupplier = () -> SdkDefaultRetryStrategy.forRetryMode(RetryMode.defaultRetryMode(), + testData.newRetries2026Enabled); + } else { + retryStrategySupplier = () -> SdkDefaultRetryStrategy.forRetryMode(RetryMode.defaultRetryMode()); + } + if (testData.expected == null) { - assertThatThrownBy(() -> SdkDefaultRetryStrategy.forRetryMode(RetryMode.defaultRetryMode())).isInstanceOf(RuntimeException.class); + assertThatThrownBy(retryStrategySupplier::get).isInstanceOf(RuntimeException.class); } else { - assertThat(SdkDefaultRetryStrategy.forRetryMode(RetryMode.defaultRetryMode()).maxAttempts()).isEqualTo(testData.expected); + assertThat(retryStrategySupplier.get().maxAttempts()).isEqualTo(testData.expected); } } @@ -125,6 +170,7 @@ private String diskLocationForConfig(String configFileName) { } private static class TestData { + private final Boolean newRetries2026Enabled; private final String attemptCountSystemProperty; private final String attemptCountEnvVarValue; private final String envVarValue; @@ -138,6 +184,23 @@ private static class TestData { String retryModeEnvVarValue, String configFile, Integer expected) { + this(null, + attemptCountSystemProperty, + attemptCountEnvVarValue, + retryModeSystemProperty, + retryModeEnvVarValue, + configFile, + expected); + } + + TestData(Boolean newRetries2026Enabled, + String attemptCountSystemProperty, + String attemptCountEnvVarValue, + String retryModeSystemProperty, + String retryModeEnvVarValue, + String configFile, + Integer expected) { + this.newRetries2026Enabled = newRetries2026Enabled; this.attemptCountSystemProperty = attemptCountSystemProperty; this.attemptCountEnvVarValue = attemptCountEnvVarValue; this.envVarValue = retryModeEnvVarValue; From 07c0c616ac480a3f055586e457a7297c74f9613c Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Wed, 29 Apr 2026 20:45:18 -0700 Subject: [PATCH 12/18] Update DDB retry policy with v2.1 constants (#6917) In 2.1: - base delay : 25ms (existing) - max attempts: 4 (down from 9) --- ...StandardRetryStrategyV21ConstantsTest.java | 45 ++++++++++++++----- services/dynamodb/pom.xml | 6 +++ .../dynamodb/DynamoDbRetryPolicy.java | 25 ++++++++--- .../dynamodb/DynamoDbRetryPolicyTest.java | 20 +++++++++ 4 files changed, 79 insertions(+), 17 deletions(-) diff --git a/core/retries/src/test/java/software/amazon/awssdk/retries/StandardRetryStrategyV21ConstantsTest.java b/core/retries/src/test/java/software/amazon/awssdk/retries/StandardRetryStrategyV21ConstantsTest.java index 16dd17307694..cd772869e307 100644 --- a/core/retries/src/test/java/software/amazon/awssdk/retries/StandardRetryStrategyV21ConstantsTest.java +++ b/core/retries/src/test/java/software/amazon/awssdk/retries/StandardRetryStrategyV21ConstantsTest.java @@ -18,6 +18,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.time.Duration; +import java.util.function.Supplier; import org.junit.jupiter.api.Test; import software.amazon.awssdk.retries.api.AcquireInitialTokenResponse; import software.amazon.awssdk.retries.api.BackoffStrategy; @@ -82,24 +83,33 @@ void v20_throttlingRetry_deducts5Tokens() { @Test void v21Enabled_backoffUses50msBaseDelay() { - RetryStrategy strategy = StandardRetryStrategy.builder(true) - .retryOnException(t -> true) - .build(); - RefreshRetryTokenResponse response = refreshToken(strategy, new RuntimeException("err")); - // First retry delay should be in [0, 50ms] (jittered) - assertThat(response.delay()).isBetween(Duration.ZERO, Duration.ofMillis(50)); + Supplier stratSupplier = () -> StandardRetryStrategy.builder(true) + .retryOnException(t -> true) + .build(); + + probabilisticAssertDelayBetween(stratSupplier, new RuntimeException("err"), Duration.ZERO, Duration.ofMillis(50)); + } + + @Test + void v21Enabled_throttlingBackoffUses1000msBaseDelay() { + + Supplier stratSupplier = () -> StandardRetryStrategy.builder(true) + .retryOnException(t -> true) + .treatAsThrottling(t -> true) + .build(); + + probabilisticAssertDelayBetween(stratSupplier, new RuntimeException("err"), Duration.ZERO, Duration.ofMillis(1000)); } @Test void v20_backoffUses100msBaseDelay() { - RetryStrategy strategy = StandardRetryStrategy.builder(false) - .retryOnException(t -> true) - .build(); + Supplier stratSupplier = () -> StandardRetryStrategy.builder(false) + .retryOnException(t -> true) + .build(); + + probabilisticAssertDelayBetween(stratSupplier, new RuntimeException("err"), Duration.ZERO, Duration.ofMillis(100)); - RefreshRetryTokenResponse response = refreshToken(strategy, new RuntimeException("err")); - // First retry delay should be in [0, 100ms] (jittered) - assertThat(response.delay()).isBetween(Duration.ZERO, Duration.ofMillis(100)); } @Test @@ -135,4 +145,15 @@ private RefreshRetryTokenResponse refreshToken(RetryStrategy strategy, Exception return strategy.refreshRetryToken( RefreshRetryTokenRequest.builder().token(initial.token()).failure(failure).build()); } + + // Backoffs are jittered, so verify it by testing it many times + private void probabilisticAssertDelayBetween(Supplier strategy, + Exception failure, + Duration min, + Duration max) { + for (int i = 0; i < 128; ++i) { + RefreshRetryTokenResponse response = refreshToken(strategy.get(), failure); + assertThat(response.delay()).isBetween(min, max); + } + } } diff --git a/services/dynamodb/pom.xml b/services/dynamodb/pom.xml index d5f3a2e7fc6f..ebcbcf07ab46 100644 --- a/services/dynamodb/pom.xml +++ b/services/dynamodb/pom.xml @@ -78,5 +78,11 @@ http-auth-aws ${awsjavasdk.version} + + software.amazon.awssdk + retries + ${awsjavasdk.version} + test + diff --git a/services/dynamodb/src/main/java/software/amazon/awssdk/services/dynamodb/DynamoDbRetryPolicy.java b/services/dynamodb/src/main/java/software/amazon/awssdk/services/dynamodb/DynamoDbRetryPolicy.java index 56f812528749..c9f30849a926 100644 --- a/services/dynamodb/src/main/java/software/amazon/awssdk/services/dynamodb/DynamoDbRetryPolicy.java +++ b/services/dynamodb/src/main/java/software/amazon/awssdk/services/dynamodb/DynamoDbRetryPolicy.java @@ -25,6 +25,7 @@ import software.amazon.awssdk.core.client.config.SdkClientOption; import software.amazon.awssdk.core.internal.retry.RetryPolicyAdapter; import software.amazon.awssdk.core.internal.retry.SdkDefaultRetrySetting; +import software.amazon.awssdk.core.retry.NewRetries2026Resolver; import software.amazon.awssdk.core.retry.RetryMode; import software.amazon.awssdk.core.retry.RetryPolicy; import software.amazon.awssdk.core.retry.backoff.BackoffStrategy; @@ -41,12 +42,17 @@ final class DynamoDbRetryPolicy { /** * Default max retry count for DynamoDB client, regardless of retry mode. **/ - private static final int MAX_ERROR_RETRY = 8; + private static final int MAX_ERROR_RETRY_V20 = 8; /** * Default attempts count for DynamoDB client, regardless of retry mode. **/ - private static final int MAX_ATTEMPTS = MAX_ERROR_RETRY + 1; + private static final int MAX_ATTEMPTS_V20 = MAX_ERROR_RETRY_V20 + 1; + + /** + * Default attempts count for DynamoDB client, regardless of retry mode. (v2.1) + **/ + private static final int MAX_ATTEMPTS_V21 = 4; /** * Default base sleep time for DynamoDB, regardless of retry mode. @@ -95,9 +101,12 @@ public static RetryStrategy resolveRetryStrategy(SdkClientConfiguration config) .build(); } - return AwsRetryStrategy.forRetryMode(retryMode) + boolean newRetries2026Enabled = isNewRetries2026Enabled(config); + int maxAttempts = newRetries2026Enabled ? MAX_ATTEMPTS_V21 : MAX_ATTEMPTS_V20; + + return AwsRetryStrategy.forRetryMode(retryMode, newRetries2026Enabled) .toBuilder() - .maxAttempts(MAX_ATTEMPTS) + .maxAttempts(maxAttempts) .backoffStrategy(exponentialDelay(BASE_DELAY, SdkDefaultRetrySetting.MAX_BACKOFF)) .build(); } @@ -106,7 +115,7 @@ private static RetryPolicy retryPolicyFor(RetryMode retryMode) { return AwsRetryPolicy.forRetryMode(retryMode) .toBuilder() .additionalRetryConditionsAllowed(false) - .numRetries(MAX_ERROR_RETRY) + .numRetries(MAX_ERROR_RETRY_V20) .backoffStrategy(BACKOFF_STRATEGY) .build(); } @@ -116,6 +125,12 @@ private static RetryMode resolveRetryMode(SdkClientConfiguration config) { .profileFile(config.option(SdkClientOption.PROFILE_FILE_SUPPLIER)) .profileName(config.option(SdkClientOption.PROFILE_NAME)) .defaultRetryMode(config.option(SdkClientOption.DEFAULT_RETRY_MODE)) + .defaultNewRetries2026(config.option(SdkClientOption.DEFAULT_NEW_RETRIES_2026)) .resolve(); } + + private static boolean isNewRetries2026Enabled(SdkClientConfiguration config) { + Boolean defaultNewRetries2026 = config.option(SdkClientOption.DEFAULT_NEW_RETRIES_2026); + return new NewRetries2026Resolver().defaultNewRetries2026(defaultNewRetries2026).resolve(); + } } diff --git a/services/dynamodb/src/test/java/software/amazon/awssdk/services/dynamodb/DynamoDbRetryPolicyTest.java b/services/dynamodb/src/test/java/software/amazon/awssdk/services/dynamodb/DynamoDbRetryPolicyTest.java index bcb25c2504d6..cb489a6a30b6 100644 --- a/services/dynamodb/src/test/java/software/amazon/awssdk/services/dynamodb/DynamoDbRetryPolicyTest.java +++ b/services/dynamodb/src/test/java/software/amazon/awssdk/services/dynamodb/DynamoDbRetryPolicyTest.java @@ -5,12 +5,16 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import software.amazon.awssdk.core.SdkSystemSetting; import software.amazon.awssdk.core.client.config.SdkClientConfiguration; import software.amazon.awssdk.core.client.config.SdkClientOption; import software.amazon.awssdk.core.internal.retry.SdkDefaultRetryStrategy; import software.amazon.awssdk.core.retry.RetryMode; import software.amazon.awssdk.profiles.ProfileFile; +import software.amazon.awssdk.retries.LegacyRetryStrategy; +import software.amazon.awssdk.retries.StandardRetryStrategy; import software.amazon.awssdk.retries.api.RetryStrategy; import software.amazon.awssdk.testutils.EnvironmentVariableHelper; import software.amazon.awssdk.utils.StringInputStream; @@ -126,4 +130,20 @@ void resolve_retryModeNotSetWithEnvNorSupplier_resolvesFromSdkDefault() { assertThat(retryMode).isEqualTo(RetryMode.LEGACY); } + @ParameterizedTest(name = "V2.1 retries = {0}, max attempts = {1}") + @CsvSource({ + "false,9", + "true,4" + }) + void resolve_maxAttemptsAndStrategyCompliantWithRetriesVersion(boolean retries21, int expectedMaxAttempts) { + SdkClientConfiguration cfg = SdkClientConfiguration.builder() + .option(SdkClientOption.DEFAULT_NEW_RETRIES_2026, retries21) + .build(); + RetryStrategy strategy = DynamoDbRetryPolicy.resolveRetryStrategy(cfg); + + Class expectedStrategy = retries21 ? StandardRetryStrategy.class : LegacyRetryStrategy.class; + + assertThat(strategy).isInstanceOf(expectedStrategy); + assertThat(strategy.maxAttempts()).isEqualTo(expectedMaxAttempts); + } } From 1612dd440c1ff2a3ccb0e4a456abd9adcf8d5fa1 Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Thu, 30 Apr 2026 10:45:14 -0700 Subject: [PATCH 13/18] Retries 2.1 std suggested delay computation (#6915) For standard 2.1, there is additional treatment of the service suggested backoff so it's at least as long as the strategy computed value, and not longer than 5s more than the strategy computed value. --- .../retries/internal/BaseRetryStrategy.java | 7 ++ .../DefaultStandardRetryStrategy.java | 34 ++++++ .../internal/StandardRetryStrategyTest.java | 102 ++++++++++++++---- 3 files changed, 125 insertions(+), 18 deletions(-) diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/BaseRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/BaseRetryStrategy.java index 15656ab96e5b..dfda06093ab3 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/BaseRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/BaseRetryStrategy.java @@ -380,6 +380,13 @@ static Duration maxOf(Duration left, Duration right) { return right; } + static Duration minOf(Duration left, Duration right) { + if (left.compareTo(right) <= 0) { + return left; + } + return right; + } + static DefaultRetryToken asDefaultRetryToken(RetryToken token) { return Validate.isInstanceOf(DefaultRetryToken.class, token, "RetryToken is of unexpected class (%s), " diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java index 878cdcd380c8..92b24421b57d 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java @@ -16,6 +16,7 @@ package software.amazon.awssdk.retries.internal; import java.time.Duration; +import java.util.Optional; import java.util.function.Predicate; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.retries.StandardRetryStrategy; @@ -28,6 +29,7 @@ public final class DefaultStandardRetryStrategy extends BaseRetryStrategy implements StandardRetryStrategy { private static final Logger LOG = Logger.loggerFor(DefaultStandardRetryStrategy.class); + private static final Duration FIVE_SECONDS = Duration.ofSeconds(5); private final boolean retries2026Enabled; DefaultStandardRetryStrategy(Builder builder) { @@ -56,6 +58,38 @@ protected Duration computeAcquireFailureBackoff(RefreshRetryTokenRequest request return computeBackoff(request, attemptIncremented); } + @Override + protected Duration computeBackoff(RefreshRetryTokenRequest request, DefaultRetryToken token) { + if (!retries2026Enabled) { + return super.computeBackoff(request, token); + } + + Duration strategyBackoff; + if (treatAsThrottling.test(request.failure())) { + strategyBackoff = throttlingBackoffStrategy.computeDelay(token.attempt()); + } else { + strategyBackoff = backoffStrategy.computeDelay(token.attempt()); + } + + Optional optionalSuggested = request.suggestedDelay(); + + if (!optionalSuggested.isPresent()) { + return strategyBackoff; + } + + // the suggested delay needs to be at least what the strategy computed, OR + // not greater than 5s more than what the strat computed + Duration minBackoff = strategyBackoff; + Duration maxBackoff = strategyBackoff.plus(FIVE_SECONDS); + + Duration backoff = optionalSuggested.get(); + + backoff = maxOf(minBackoff, backoff); + backoff = minOf(maxBackoff, backoff); + + return backoff; + } + public static class Builder extends BaseRetryStrategy.Builder implements StandardRetryStrategy.Builder { private boolean retries2026Enabled; diff --git a/core/retries/src/test/java/software/amazon/awssdk/retries/internal/StandardRetryStrategyTest.java b/core/retries/src/test/java/software/amazon/awssdk/retries/internal/StandardRetryStrategyTest.java index c182a0ed6377..59497420701d 100644 --- a/core/retries/src/test/java/software/amazon/awssdk/retries/internal/StandardRetryStrategyTest.java +++ b/core/retries/src/test/java/software/amazon/awssdk/retries/internal/StandardRetryStrategyTest.java @@ -104,12 +104,17 @@ void verifyScenario(Scenario scenario) { case RETRY_REQUEST: { ScenarioTestException scenarioTestException = new ScenarioTestException(response.statusCode, response.throttling); - RefreshRetryTokenRequest refreshRequest = RefreshRetryTokenRequest.builder() - .failure(scenarioTestException) - .isLongPolling(given.isLongPolling) - .token(token.get()) - .build(); - RefreshRetryTokenResponse refreshResponse = strategy.refreshRetryToken(refreshRequest); + RefreshRetryTokenRequest.Builder refreshRequest = RefreshRetryTokenRequest.builder(); + + if (response.xAmzRetryAfter != null) { + refreshRequest.suggestedDelay(response.xAmzRetryAfter); + } + + refreshRequest.failure(scenarioTestException) + .isLongPolling(given.isLongPolling) + .token(token.get()) + .build(); + RefreshRetryTokenResponse refreshResponse = strategy.refreshRetryToken(refreshRequest.build()); DefaultRetryToken refreshedToken = (DefaultRetryToken) refreshResponse.token(); token.set(refreshedToken); @@ -120,14 +125,18 @@ void verifyScenario(Scenario scenario) { case RETRY_QUOTA_EXCEEDED: { ScenarioTestException scenarioTestException = new ScenarioTestException(response.statusCode, response.throttling); - RefreshRetryTokenRequest refreshRequest = RefreshRetryTokenRequest.builder() - .failure(scenarioTestException) - .isLongPolling(given.isLongPolling) - .token(token.get()) - .build(); + RefreshRetryTokenRequest.Builder refreshRequest = RefreshRetryTokenRequest.builder(); + + if (response.xAmzRetryAfter != null) { + refreshRequest.suggestedDelay(response.xAmzRetryAfter); + } + refreshRequest.failure(scenarioTestException) + .isLongPolling(given.isLongPolling) + .token(token.get()) + .build(); - assertThatThrownBy(() -> strategy.refreshRetryToken(refreshRequest)) + assertThatThrownBy(() -> strategy.refreshRetryToken(refreshRequest.build())) .isInstanceOf(TokenAcquisitionFailedException.class) .matches(e -> { TokenAcquisitionFailedException acquireException = (TokenAcquisitionFailedException) e; @@ -149,12 +158,18 @@ void verifyScenario(Scenario scenario) { case MAX_ATTEMPTS_EXCEEDED: { ScenarioTestException scenarioTestException = new ScenarioTestException(response.statusCode, response.throttling); - RefreshRetryTokenRequest refreshRequest = RefreshRetryTokenRequest.builder() - .failure(scenarioTestException) - .isLongPolling(given.isLongPolling) - .token(token.get()) - .build(); - assertThatThrownBy(() -> strategy.refreshRetryToken(refreshRequest)) + RefreshRetryTokenRequest.Builder refreshRequest = RefreshRetryTokenRequest.builder(); + + if (response.xAmzRetryAfter != null) { + refreshRequest.suggestedDelay(response.xAmzRetryAfter); + } + + refreshRequest.failure(scenarioTestException) + .isLongPolling(given.isLongPolling) + .token(token.get()) + .build(); + + assertThatThrownBy(() -> strategy.refreshRetryToken(refreshRequest.build())) .isInstanceOf(TokenAcquisitionFailedException.class) .matches(e -> { TokenAcquisitionFailedException acquireException = (TokenAcquisitionFailedException) e; @@ -673,7 +688,52 @@ private static Stream retriesV21Tests() { .expected(e -> e.outcome(Outcome.MAX_ATTEMPTS_EXCEEDED) .delay(Duration.ZERO) + .retryQuota(486))), + + aScenario("Honor x-amz-retry-after Header") + .newRetries2026(true) + .addResponse(r -> + r.statusCode(500) + .xAmzRetryAfter(Duration.ofMillis(1500)) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(1500)) .retryQuota(486))) + .addResponse(r -> + r.statusCode(200) + .expected(e -> + e.outcome(Outcome.SUCCESS) + .retryQuota(500))), + + aScenario("x-amz-retry-after minimum is exponential backoff duration") + .newRetries2026(true) + .addResponse(r -> + r.statusCode(500) + .xAmzRetryAfter(Duration.ofMillis(0)) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(50)) + .retryQuota(486))) + .addResponse(r -> + r.statusCode(200) + .expected(e -> + e.outcome(Outcome.SUCCESS) + .retryQuota(500))), + + aScenario("x-amz-retry-after maximum is 5+exponential backoff duration") + .newRetries2026(true) + .addResponse(r -> + r.statusCode(500) + .xAmzRetryAfter(Duration.ofMillis(10000)) + .expected(e -> + e.outcome(Outcome.RETRY_REQUEST) + .delay(Duration.ofMillis(5050)) + .retryQuota(486))) + .addResponse(r -> + r.statusCode(200) + .expected(e -> + e.outcome(Outcome.SUCCESS) + .retryQuota(500))) ); } @@ -721,6 +781,7 @@ public Given maxBackoff(Duration maxBackoff) { private static class Response { private int statusCode; private boolean throttling; + private Duration xAmzRetryAfter; private Expected expected; public Response statusCode(int statusCode) { @@ -733,6 +794,11 @@ public Response isThrottling(boolean throttling) { return this; } + public Response xAmzRetryAfter(Duration xAmzRetryAfter) { + this.xAmzRetryAfter = xAmzRetryAfter; + return this; + } + public Response expected(Consumer acceptor) { this.expected = new Expected(); acceptor.accept(this.expected); From 2f39fc1f3f5f098f8d5dca134ab6ce15acc92334 Mon Sep 17 00:00:00 2001 From: Dongie Agnir Date: Thu, 30 Apr 2026 11:55:41 -0700 Subject: [PATCH 14/18] Add changelog entry --- .changes/next-release/feature-AWSSDKforJavav2-8b47f8f.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changes/next-release/feature-AWSSDKforJavav2-8b47f8f.json diff --git a/.changes/next-release/feature-AWSSDKforJavav2-8b47f8f.json b/.changes/next-release/feature-AWSSDKforJavav2-8b47f8f.json new file mode 100644 index 000000000000..78b925a87e57 --- /dev/null +++ b/.changes/next-release/feature-AWSSDKforJavav2-8b47f8f.json @@ -0,0 +1,6 @@ +{ + "type": "feature", + "category": "AWS SDK for Java v2", + "contributor": "", + "description": "Added support for v2.1 retry behavior behind the `AWS_NEW_RETRIES_2026` feature gate. When enabled via environment variable `AWS_NEW_RETRIES_2026=true` or system property `-Daws.newRetries2026=true`, the SDK applies the following changes:\n\n- Uses `STANDARD` as the default retry mode\n- Reduces base backoff delay from 100ms to 50ms\n- Differentiates token costs between transient and throttling errors\n- Honors the `max_attempts` profile property\n- Uses the `x-amz-retry-after` response header for server-suggested delays\n- Retries on `LimitExceededException` as a throttling error\n- Retries on STS `IdpCommunicationErrorException`\n\nExample usage:\n```java\nSystem.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), \"true\");\nDynamoDbClient ddb = DynamoDbClient.create();\n```" +} From a682952dcb0224e7f2d503219b70ebdcfe2f83e4 Mon Sep 17 00:00:00 2001 From: Dongie Agnir Date: Thu, 30 Apr 2026 12:49:27 -0700 Subject: [PATCH 15/18] Bump version to 2.44.0 --- .changes/{ => 2.43.x}/2.43.0.json | 0 .changes/{ => 2.43.x}/2.43.1.json | 0 .changes/{ => 2.43.x}/2.43.2.json | 0 CHANGELOG.md | 174 ----------------- archetypes/archetype-app-quickstart/pom.xml | 2 +- archetypes/archetype-lambda/pom.xml | 2 +- archetypes/archetype-tools/pom.xml | 2 +- archetypes/pom.xml | 2 +- aws-sdk-java/pom.xml | 2 +- bom-internal/pom.xml | 2 +- bom/pom.xml | 2 +- bundle-logging-bridge/pom.xml | 2 +- bundle-sdk/pom.xml | 2 +- bundle/pom.xml | 2 +- changelogs/2.43.x-CHANGELOG.md | 175 ++++++++++++++++++ codegen-lite-maven-plugin/pom.xml | 2 +- codegen-lite/pom.xml | 2 +- codegen-maven-plugin/pom.xml | 2 +- codegen/pom.xml | 2 +- core/annotations/pom.xml | 2 +- core/arns/pom.xml | 2 +- core/auth-crt/pom.xml | 2 +- core/auth/pom.xml | 2 +- core/aws-core/pom.xml | 2 +- core/checksums-spi/pom.xml | 2 +- core/checksums/pom.xml | 2 +- core/crt-core/pom.xml | 2 +- core/endpoints-spi/pom.xml | 2 +- core/http-auth-aws-crt/pom.xml | 2 +- core/http-auth-aws-eventstream/pom.xml | 2 +- core/http-auth-aws/pom.xml | 2 +- core/http-auth-spi/pom.xml | 2 +- core/http-auth/pom.xml | 2 +- core/identity-spi/pom.xml | 2 +- core/imds/pom.xml | 2 +- core/json-utils/pom.xml | 2 +- core/metrics-spi/pom.xml | 2 +- core/pom.xml | 2 +- core/profiles/pom.xml | 2 +- core/protocols/aws-cbor-protocol/pom.xml | 2 +- core/protocols/aws-json-protocol/pom.xml | 2 +- core/protocols/aws-query-protocol/pom.xml | 2 +- core/protocols/aws-xml-protocol/pom.xml | 2 +- core/protocols/pom.xml | 2 +- core/protocols/protocol-core/pom.xml | 2 +- core/protocols/smithy-rpcv2-protocol/pom.xml | 2 +- core/regions/pom.xml | 2 +- core/retries-spi/pom.xml | 2 +- core/retries/pom.xml | 2 +- core/sdk-core/pom.xml | 2 +- http-client-spi/pom.xml | 2 +- http-clients/apache-client/pom.xml | 2 +- http-clients/apache5-client/pom.xml | 2 +- http-clients/aws-crt-client/pom.xml | 2 +- http-clients/netty-nio-client/pom.xml | 2 +- http-clients/pom.xml | 2 +- http-clients/url-connection-client/pom.xml | 2 +- .../cloudwatch-metric-publisher/pom.xml | 2 +- .../emf-metric-logging-publisher/pom.xml | 2 +- metric-publishers/pom.xml | 2 +- pom.xml | 2 +- release-scripts/pom.xml | 2 +- services-custom/dynamodb-enhanced/pom.xml | 2 +- services-custom/iam-policy-builder/pom.xml | 2 +- services-custom/pom.xml | 2 +- .../s3-event-notifications/pom.xml | 2 +- services-custom/s3-transfer-manager/pom.xml | 2 +- services-custom/sns-message-manager/pom.xml | 2 +- services/accessanalyzer/pom.xml | 2 +- services/account/pom.xml | 2 +- services/acm/pom.xml | 2 +- services/acmpca/pom.xml | 2 +- services/aiops/pom.xml | 2 +- services/amp/pom.xml | 2 +- services/amplify/pom.xml | 2 +- services/amplifybackend/pom.xml | 2 +- services/amplifyuibuilder/pom.xml | 2 +- services/apigateway/pom.xml | 2 +- services/apigatewaymanagementapi/pom.xml | 2 +- services/apigatewayv2/pom.xml | 2 +- services/appconfig/pom.xml | 2 +- services/appconfigdata/pom.xml | 2 +- services/appfabric/pom.xml | 2 +- services/appflow/pom.xml | 2 +- services/appintegrations/pom.xml | 2 +- services/applicationautoscaling/pom.xml | 2 +- services/applicationcostprofiler/pom.xml | 2 +- services/applicationdiscovery/pom.xml | 2 +- services/applicationinsights/pom.xml | 2 +- services/applicationsignals/pom.xml | 2 +- services/appmesh/pom.xml | 2 +- services/apprunner/pom.xml | 2 +- services/appstream/pom.xml | 2 +- services/appsync/pom.xml | 2 +- services/arcregionswitch/pom.xml | 2 +- services/arczonalshift/pom.xml | 2 +- services/artifact/pom.xml | 2 +- services/athena/pom.xml | 2 +- services/auditmanager/pom.xml | 2 +- services/autoscaling/pom.xml | 2 +- services/autoscalingplans/pom.xml | 2 +- services/b2bi/pom.xml | 2 +- services/backup/pom.xml | 2 +- services/backupgateway/pom.xml | 2 +- services/backupsearch/pom.xml | 2 +- services/batch/pom.xml | 2 +- services/bcmdashboards/pom.xml | 2 +- services/bcmdataexports/pom.xml | 2 +- services/bcmpricingcalculator/pom.xml | 2 +- services/bcmrecommendedactions/pom.xml | 2 +- services/bedrock/pom.xml | 2 +- services/bedrockagent/pom.xml | 2 +- services/bedrockagentcore/pom.xml | 2 +- services/bedrockagentcorecontrol/pom.xml | 2 +- services/bedrockagentruntime/pom.xml | 2 +- services/bedrockdataautomation/pom.xml | 2 +- services/bedrockdataautomationruntime/pom.xml | 2 +- services/bedrockruntime/pom.xml | 2 +- services/billing/pom.xml | 2 +- services/billingconductor/pom.xml | 2 +- services/braket/pom.xml | 2 +- services/budgets/pom.xml | 2 +- services/chatbot/pom.xml | 2 +- services/chime/pom.xml | 2 +- services/chimesdkidentity/pom.xml | 2 +- services/chimesdkmediapipelines/pom.xml | 2 +- services/chimesdkmeetings/pom.xml | 2 +- services/chimesdkmessaging/pom.xml | 2 +- services/chimesdkvoice/pom.xml | 2 +- services/cleanrooms/pom.xml | 2 +- services/cleanroomsml/pom.xml | 2 +- services/cloud9/pom.xml | 2 +- services/cloudcontrol/pom.xml | 2 +- services/clouddirectory/pom.xml | 2 +- services/cloudformation/pom.xml | 2 +- services/cloudfront/pom.xml | 2 +- services/cloudfrontkeyvaluestore/pom.xml | 2 +- services/cloudhsm/pom.xml | 2 +- services/cloudhsmv2/pom.xml | 2 +- services/cloudsearch/pom.xml | 2 +- services/cloudsearchdomain/pom.xml | 2 +- services/cloudtrail/pom.xml | 2 +- services/cloudtraildata/pom.xml | 2 +- services/cloudwatch/pom.xml | 2 +- services/cloudwatchevents/pom.xml | 2 +- services/cloudwatchlogs/pom.xml | 2 +- services/codeartifact/pom.xml | 2 +- services/codebuild/pom.xml | 2 +- services/codecatalyst/pom.xml | 2 +- services/codecommit/pom.xml | 2 +- services/codeconnections/pom.xml | 2 +- services/codedeploy/pom.xml | 2 +- services/codeguruprofiler/pom.xml | 2 +- services/codegurureviewer/pom.xml | 2 +- services/codegurusecurity/pom.xml | 2 +- services/codepipeline/pom.xml | 2 +- services/codestarconnections/pom.xml | 2 +- services/codestarnotifications/pom.xml | 2 +- services/cognitoidentity/pom.xml | 2 +- services/cognitoidentityprovider/pom.xml | 2 +- services/cognitosync/pom.xml | 2 +- services/comprehend/pom.xml | 2 +- services/comprehendmedical/pom.xml | 2 +- services/computeoptimizer/pom.xml | 2 +- services/computeoptimizerautomation/pom.xml | 2 +- services/config/pom.xml | 2 +- services/connect/pom.xml | 2 +- services/connectcampaigns/pom.xml | 2 +- services/connectcampaignsv2/pom.xml | 2 +- services/connectcases/pom.xml | 2 +- services/connectcontactlens/pom.xml | 2 +- services/connecthealth/pom.xml | 2 +- services/connectparticipant/pom.xml | 2 +- services/controlcatalog/pom.xml | 2 +- services/controltower/pom.xml | 2 +- services/costandusagereport/pom.xml | 2 +- services/costexplorer/pom.xml | 2 +- services/costoptimizationhub/pom.xml | 2 +- services/customerprofiles/pom.xml | 2 +- services/databasemigration/pom.xml | 2 +- services/databrew/pom.xml | 2 +- services/dataexchange/pom.xml | 2 +- services/datapipeline/pom.xml | 2 +- services/datasync/pom.xml | 2 +- services/datazone/pom.xml | 2 +- services/dax/pom.xml | 2 +- services/deadline/pom.xml | 2 +- services/detective/pom.xml | 2 +- services/devicefarm/pom.xml | 2 +- services/devopsagent/pom.xml | 2 +- services/devopsguru/pom.xml | 2 +- services/directconnect/pom.xml | 2 +- services/directory/pom.xml | 2 +- services/directoryservicedata/pom.xml | 2 +- services/dlm/pom.xml | 2 +- services/docdb/pom.xml | 2 +- services/docdbelastic/pom.xml | 2 +- services/drs/pom.xml | 2 +- services/dsql/pom.xml | 2 +- services/dynamodb/pom.xml | 2 +- services/ebs/pom.xml | 2 +- services/ec2/pom.xml | 2 +- services/ec2instanceconnect/pom.xml | 2 +- services/ecr/pom.xml | 2 +- services/ecrpublic/pom.xml | 2 +- services/ecs/pom.xml | 2 +- services/efs/pom.xml | 2 +- services/eks/pom.xml | 2 +- services/eksauth/pom.xml | 2 +- services/elasticache/pom.xml | 2 +- services/elasticbeanstalk/pom.xml | 2 +- services/elasticloadbalancing/pom.xml | 2 +- services/elasticloadbalancingv2/pom.xml | 2 +- services/elasticsearch/pom.xml | 2 +- services/elementalinference/pom.xml | 2 +- services/emr/pom.xml | 2 +- services/emrcontainers/pom.xml | 2 +- services/emrserverless/pom.xml | 2 +- services/entityresolution/pom.xml | 2 +- services/eventbridge/pom.xml | 2 +- services/evs/pom.xml | 2 +- services/finspace/pom.xml | 2 +- services/finspacedata/pom.xml | 2 +- services/firehose/pom.xml | 2 +- services/fis/pom.xml | 2 +- services/fms/pom.xml | 2 +- services/forecast/pom.xml | 2 +- services/forecastquery/pom.xml | 2 +- services/frauddetector/pom.xml | 2 +- services/freetier/pom.xml | 2 +- services/fsx/pom.xml | 2 +- services/gamelift/pom.xml | 2 +- services/gameliftstreams/pom.xml | 2 +- services/geomaps/pom.xml | 2 +- services/geoplaces/pom.xml | 2 +- services/georoutes/pom.xml | 2 +- services/glacier/pom.xml | 2 +- services/globalaccelerator/pom.xml | 2 +- services/glue/pom.xml | 2 +- services/grafana/pom.xml | 2 +- services/greengrass/pom.xml | 2 +- services/greengrassv2/pom.xml | 2 +- services/groundstation/pom.xml | 2 +- services/guardduty/pom.xml | 2 +- services/health/pom.xml | 2 +- services/healthlake/pom.xml | 2 +- services/iam/pom.xml | 2 +- services/identitystore/pom.xml | 2 +- services/imagebuilder/pom.xml | 2 +- services/inspector/pom.xml | 2 +- services/inspector2/pom.xml | 2 +- services/inspectorscan/pom.xml | 2 +- services/interconnect/pom.xml | 2 +- services/internetmonitor/pom.xml | 2 +- services/invoicing/pom.xml | 2 +- services/iot/pom.xml | 2 +- services/iotdataplane/pom.xml | 2 +- services/iotdeviceadvisor/pom.xml | 2 +- services/iotevents/pom.xml | 2 +- services/ioteventsdata/pom.xml | 2 +- services/iotfleetwise/pom.xml | 2 +- services/iotjobsdataplane/pom.xml | 2 +- services/iotmanagedintegrations/pom.xml | 2 +- services/iotsecuretunneling/pom.xml | 2 +- services/iotsitewise/pom.xml | 2 +- services/iotthingsgraph/pom.xml | 2 +- services/iottwinmaker/pom.xml | 2 +- services/iotwireless/pom.xml | 2 +- services/ivs/pom.xml | 2 +- services/ivschat/pom.xml | 2 +- services/ivsrealtime/pom.xml | 2 +- services/kafka/pom.xml | 2 +- services/kafkaconnect/pom.xml | 2 +- services/kendra/pom.xml | 2 +- services/kendraranking/pom.xml | 2 +- services/keyspaces/pom.xml | 2 +- services/keyspacesstreams/pom.xml | 2 +- services/kinesis/pom.xml | 2 +- services/kinesisanalytics/pom.xml | 2 +- services/kinesisanalyticsv2/pom.xml | 2 +- services/kinesisvideo/pom.xml | 2 +- services/kinesisvideoarchivedmedia/pom.xml | 2 +- services/kinesisvideomedia/pom.xml | 2 +- services/kinesisvideosignaling/pom.xml | 2 +- services/kinesisvideowebrtcstorage/pom.xml | 2 +- services/kms/pom.xml | 2 +- services/lakeformation/pom.xml | 2 +- services/lambda/pom.xml | 2 +- services/launchwizard/pom.xml | 2 +- services/lexmodelbuilding/pom.xml | 2 +- services/lexmodelsv2/pom.xml | 2 +- services/lexruntime/pom.xml | 2 +- services/lexruntimev2/pom.xml | 2 +- services/licensemanager/pom.xml | 2 +- .../licensemanagerlinuxsubscriptions/pom.xml | 2 +- .../licensemanagerusersubscriptions/pom.xml | 2 +- services/lightsail/pom.xml | 2 +- services/location/pom.xml | 2 +- services/lookoutequipment/pom.xml | 2 +- services/m2/pom.xml | 2 +- services/machinelearning/pom.xml | 2 +- services/macie2/pom.xml | 2 +- services/mailmanager/pom.xml | 2 +- services/managedblockchain/pom.xml | 2 +- services/managedblockchainquery/pom.xml | 2 +- services/marketplaceagreement/pom.xml | 2 +- services/marketplacecatalog/pom.xml | 2 +- services/marketplacecommerceanalytics/pom.xml | 2 +- services/marketplacedeployment/pom.xml | 2 +- services/marketplacediscovery/pom.xml | 2 +- services/marketplaceentitlement/pom.xml | 2 +- services/marketplacemetering/pom.xml | 2 +- services/marketplacereporting/pom.xml | 2 +- services/mediaconnect/pom.xml | 2 +- services/mediaconvert/pom.xml | 2 +- services/medialive/pom.xml | 2 +- services/mediapackage/pom.xml | 2 +- services/mediapackagev2/pom.xml | 2 +- services/mediapackagevod/pom.xml | 2 +- services/mediastore/pom.xml | 2 +- services/mediastoredata/pom.xml | 2 +- services/mediatailor/pom.xml | 2 +- services/medicalimaging/pom.xml | 2 +- services/memorydb/pom.xml | 2 +- services/mgn/pom.xml | 2 +- services/migrationhub/pom.xml | 2 +- services/migrationhubconfig/pom.xml | 2 +- services/migrationhuborchestrator/pom.xml | 2 +- services/migrationhubrefactorspaces/pom.xml | 2 +- services/migrationhubstrategy/pom.xml | 2 +- services/mpa/pom.xml | 2 +- services/mq/pom.xml | 2 +- services/mturk/pom.xml | 2 +- services/mwaa/pom.xml | 2 +- services/mwaaserverless/pom.xml | 2 +- services/neptune/pom.xml | 2 +- services/neptunedata/pom.xml | 2 +- services/neptunegraph/pom.xml | 2 +- services/networkfirewall/pom.xml | 2 +- services/networkflowmonitor/pom.xml | 2 +- services/networkmanager/pom.xml | 2 +- services/networkmonitor/pom.xml | 2 +- services/notifications/pom.xml | 2 +- services/notificationscontacts/pom.xml | 2 +- services/novaact/pom.xml | 2 +- services/oam/pom.xml | 2 +- services/observabilityadmin/pom.xml | 2 +- services/odb/pom.xml | 2 +- services/omics/pom.xml | 2 +- services/opensearch/pom.xml | 2 +- services/opensearchserverless/pom.xml | 2 +- services/organizations/pom.xml | 2 +- services/osis/pom.xml | 2 +- services/outposts/pom.xml | 2 +- services/panorama/pom.xml | 2 +- services/partnercentralaccount/pom.xml | 2 +- services/partnercentralbenefits/pom.xml | 2 +- services/partnercentralchannel/pom.xml | 2 +- services/partnercentralselling/pom.xml | 2 +- services/paymentcryptography/pom.xml | 2 +- services/paymentcryptographydata/pom.xml | 2 +- services/pcaconnectorad/pom.xml | 2 +- services/pcaconnectorscep/pom.xml | 2 +- services/pcs/pom.xml | 2 +- services/personalize/pom.xml | 2 +- services/personalizeevents/pom.xml | 2 +- services/personalizeruntime/pom.xml | 2 +- services/pi/pom.xml | 2 +- services/pinpoint/pom.xml | 2 +- services/pinpointemail/pom.xml | 2 +- services/pinpointsmsvoice/pom.xml | 2 +- services/pinpointsmsvoicev2/pom.xml | 2 +- services/pipes/pom.xml | 2 +- services/polly/pom.xml | 2 +- services/pom.xml | 2 +- services/pricing/pom.xml | 2 +- services/proton/pom.xml | 2 +- services/qapps/pom.xml | 2 +- services/qbusiness/pom.xml | 2 +- services/qconnect/pom.xml | 2 +- services/quicksight/pom.xml | 2 +- services/ram/pom.xml | 2 +- services/rbin/pom.xml | 2 +- services/rds/pom.xml | 2 +- services/rdsdata/pom.xml | 2 +- services/redshift/pom.xml | 2 +- services/redshiftdata/pom.xml | 2 +- services/redshiftserverless/pom.xml | 2 +- services/rekognition/pom.xml | 2 +- services/repostspace/pom.xml | 2 +- services/resiliencehub/pom.xml | 2 +- services/resourceexplorer2/pom.xml | 2 +- services/resourcegroups/pom.xml | 2 +- services/resourcegroupstaggingapi/pom.xml | 2 +- services/rolesanywhere/pom.xml | 2 +- services/route53/pom.xml | 2 +- services/route53domains/pom.xml | 2 +- services/route53globalresolver/pom.xml | 2 +- services/route53profiles/pom.xml | 2 +- services/route53recoverycluster/pom.xml | 2 +- services/route53recoverycontrolconfig/pom.xml | 2 +- services/route53recoveryreadiness/pom.xml | 2 +- services/route53resolver/pom.xml | 2 +- services/rtbfabric/pom.xml | 2 +- services/rum/pom.xml | 2 +- services/s3/pom.xml | 2 +- services/s3control/pom.xml | 2 +- services/s3files/pom.xml | 2 +- services/s3outposts/pom.xml | 2 +- services/s3tables/pom.xml | 2 +- services/s3vectors/pom.xml | 2 +- services/sagemaker/pom.xml | 2 +- services/sagemakera2iruntime/pom.xml | 2 +- services/sagemakeredge/pom.xml | 2 +- services/sagemakerfeaturestoreruntime/pom.xml | 2 +- services/sagemakergeospatial/pom.xml | 2 +- services/sagemakermetrics/pom.xml | 2 +- services/sagemakerruntime/pom.xml | 2 +- services/sagemakerruntimehttp2/pom.xml | 2 +- services/savingsplans/pom.xml | 2 +- services/scheduler/pom.xml | 2 +- services/schemas/pom.xml | 2 +- services/secretsmanager/pom.xml | 2 +- services/securityagent/pom.xml | 2 +- services/securityhub/pom.xml | 2 +- services/securityir/pom.xml | 2 +- services/securitylake/pom.xml | 2 +- .../serverlessapplicationrepository/pom.xml | 2 +- services/servicecatalog/pom.xml | 2 +- services/servicecatalogappregistry/pom.xml | 2 +- services/servicediscovery/pom.xml | 2 +- services/servicequotas/pom.xml | 2 +- services/ses/pom.xml | 2 +- services/sesv2/pom.xml | 2 +- services/sfn/pom.xml | 2 +- services/shield/pom.xml | 2 +- services/signer/pom.xml | 2 +- services/signerdata/pom.xml | 2 +- services/signin/pom.xml | 2 +- services/simpledbv2/pom.xml | 2 +- services/simspaceweaver/pom.xml | 2 +- services/snowball/pom.xml | 2 +- services/snowdevicemanagement/pom.xml | 2 +- services/sns/pom.xml | 2 +- services/socialmessaging/pom.xml | 2 +- services/sqs/pom.xml | 2 +- services/ssm/pom.xml | 2 +- services/ssmcontacts/pom.xml | 2 +- services/ssmguiconnect/pom.xml | 2 +- services/ssmincidents/pom.xml | 2 +- services/ssmquicksetup/pom.xml | 2 +- services/ssmsap/pom.xml | 2 +- services/sso/pom.xml | 2 +- services/ssoadmin/pom.xml | 2 +- services/ssooidc/pom.xml | 2 +- services/storagegateway/pom.xml | 2 +- services/sts/pom.xml | 2 +- services/supplychain/pom.xml | 2 +- services/support/pom.xml | 2 +- services/supportapp/pom.xml | 2 +- services/sustainability/pom.xml | 2 +- services/swf/pom.xml | 2 +- services/synthetics/pom.xml | 2 +- services/taxsettings/pom.xml | 2 +- services/textract/pom.xml | 2 +- services/timestreaminfluxdb/pom.xml | 2 +- services/timestreamquery/pom.xml | 2 +- services/timestreamwrite/pom.xml | 2 +- services/tnb/pom.xml | 2 +- services/transcribe/pom.xml | 2 +- services/transcribestreaming/pom.xml | 2 +- services/transfer/pom.xml | 2 +- services/translate/pom.xml | 2 +- services/trustedadvisor/pom.xml | 2 +- services/uxc/pom.xml | 2 +- services/verifiedpermissions/pom.xml | 2 +- services/voiceid/pom.xml | 2 +- services/vpclattice/pom.xml | 2 +- services/waf/pom.xml | 2 +- services/wafv2/pom.xml | 2 +- services/wellarchitected/pom.xml | 2 +- services/wickr/pom.xml | 2 +- services/wisdom/pom.xml | 2 +- services/workdocs/pom.xml | 2 +- services/workmail/pom.xml | 2 +- services/workmailmessageflow/pom.xml | 2 +- services/workspaces/pom.xml | 2 +- services/workspacesinstances/pom.xml | 2 +- services/workspacesthinclient/pom.xml | 2 +- services/workspacesweb/pom.xml | 2 +- services/xray/pom.xml | 2 +- test/architecture-tests/pom.xml | 2 +- test/auth-tests/pom.xml | 2 +- .../pom.xml | 2 +- test/bundle-shading-tests/pom.xml | 2 +- test/codegen-generated-classes-test/pom.xml | 2 +- test/crt-unavailable-tests/pom.xml | 2 +- test/http-client-benchmarks/pom.xml | 2 +- test/http-client-tests/pom.xml | 2 +- test/module-path-tests/pom.xml | 2 +- .../pom.xml | 2 +- test/protocol-tests-core/pom.xml | 2 +- test/protocol-tests/pom.xml | 2 +- test/region-testing/pom.xml | 2 +- test/ruleset-testing-core/pom.xml | 2 +- test/s3-benchmarks/pom.xml | 2 +- test/s3-tests/pom.xml | 2 +- test/sdk-benchmarks/pom.xml | 2 +- test/sdk-native-image-test/pom.xml | 2 +- test/sdk-standard-benchmarks/pom.xml | 2 +- test/service-test-utils/pom.xml | 2 +- test/stability-tests/pom.xml | 2 +- test/test-utils/pom.xml | 2 +- test/tests-coverage-reporting/pom.xml | 2 +- test/v2-migration-tests/pom.xml | 2 +- third-party/pom.xml | 2 +- third-party/third-party-jackson-core/pom.xml | 2 +- .../pom.xml | 2 +- third-party/third-party-slf4j-api/pom.xml | 2 +- utils-lite/pom.xml | 2 +- utils/pom.xml | 2 +- v2-migration/pom.xml | 2 +- 522 files changed, 692 insertions(+), 691 deletions(-) rename .changes/{ => 2.43.x}/2.43.0.json (100%) rename .changes/{ => 2.43.x}/2.43.1.json (100%) rename .changes/{ => 2.43.x}/2.43.2.json (100%) create mode 100644 changelogs/2.43.x-CHANGELOG.md diff --git a/.changes/2.43.0.json b/.changes/2.43.x/2.43.0.json similarity index 100% rename from .changes/2.43.0.json rename to .changes/2.43.x/2.43.0.json diff --git a/.changes/2.43.1.json b/.changes/2.43.x/2.43.1.json similarity index 100% rename from .changes/2.43.1.json rename to .changes/2.43.x/2.43.1.json diff --git a/.changes/2.43.2.json b/.changes/2.43.x/2.43.2.json similarity index 100% rename from .changes/2.43.2.json rename to .changes/2.43.x/2.43.2.json diff --git a/CHANGELOG.md b/CHANGELOG.md index e953bb39e9ba..a9233d91ad29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,175 +1 @@ #### 👋 _Looking for changelogs for older versions? You can find them in the [changelogs](./changelogs) directory._ -# __2.43.2__ __2026-04-30__ -## __AWS SDK for Java v2__ - - ### Features - - Updated endpoint and partition metadata. - - - ### Bugfixes - - Improved error message when `ResponseTransformer.toFile()` or `AsyncResponseTransformer.toFile()` fails because the parent directory does not exist. The error now indicates that the parent directory must be created before calling the method. - -## __AWS Single Sign-On Admin__ - - ### Features - - Add InstanceArn and IdentityStoreArn in the response of CreateApplication API and IdentityStoreArn in the response of DescribeApplication API - -## __Amazon Bedrock AgentCore__ - - ### Features - - AgentCore Identity now supports on-behalf-of token exchange OAuth2. AgentCore Memory now supports metadata for LongTerm Memory Records. - -## __Amazon Bedrock AgentCore Control__ - - ### Features - - AgentCore Identity now supports on-behalf-of token exchange OAuth2. AgentCore Memory now supports metadata for LongTerm Memory Records. - -## __Amazon DataZone__ - - ### Features - - Adds support for asynchronous notebook runs - -## __Amazon Elastic Kubernetes Service__ - - ### Features - - Vended logs update param for capability vended logs feature - -## __Amazon Route 53 Global Resolver__ - - ### Features - - Adds support for regions in the UpdateGlobalResolver input. - -## __Amazon SageMaker Service__ - - ### Features - - Add InstancePools support to Endpoint for flexible provisioning across a prioritized list of instance types. Add Specifications support to InferenceComponent for per-instance-type model configurations. - -## __CloudWatch Observability Admin Service__ - - ### Features - - Observability Admin enablement launch for AWS Kafka, Bedrock Agent Core Workload Identity and OTel metric enablement. - -## __Managed Streaming for Kafka__ - - ### Features - - Adds support for ZookeeperAccess field to control the Client-Zookeeper connectivity. - -## __Payment Cryptography Control Plane__ - - ### Features - - Adds support for resource-based policies on AWS Payment Cryptography keys, enabling cross-account key sharing. Also adds Multi-Party Approval (MPA) team association APIs for protecting sensitive import root public key operations. - -## __Url Connection Client__ - - ### Bugfixes - - Allow retry when URL Connection HTTP Client encounters a NullPointerException wrapped in a RuntimeException - -# __2.43.1__ __2026-04-29__ -## __AWS Account__ - - ### Features - - Adds AccountState in the response for the GetAccountInformation API. Each state represents a specific phase in the account lifecycle. Use this information to manage account access, automate workflows, or trigger actions based on account state changes. - -## __AWS Elemental MediaPackage v2__ - - ### Features - - This feature adds configuration for specifying SCTE marker handling and allow greater control over generated manifest and segment URIs - -## __AWS SDK for Java v2__ - - ### Features - - Updated endpoint and partition metadata. - - - ### Bugfixes - - Fixed deserialization failure for JSON responses containing field names longer than 50,000 characters. Services like DynamoDB allow attribute names up to 65,535 bytes, which exceeded Jackson's default `maxNameLength` limit. - -## __AWS Transfer Family__ - - ### Features - - This launch will increase the limits for customers to list the contents from the remote directories from 10k to 200k. - -## __AWSDeadlineCloud__ - - ### Features - - Adds support for rtx-pro-server-6000 GPU accelerator for service-managed fleets. - -## __Amazon Bedrock AgentCore__ - - ### Features - - Adds batch evaluation for running evaluators against multiple agent sessions with server-side orchestration, AI-powered recommendations for optimizing system prompts and tool descriptions, and AB testing with controlled traffic splitting and statistical significance reporting - -## __Amazon Bedrock AgentCore Control__ - - ### Features - - Adds configuration bundles for versioned, immutable agent configuration snapshots with branch-based lineage - -## __Amazon CloudFront__ - - ### Features - - Amazon CloudFront now supports cache tag. Tag objects via response headers and invalidate all matching objects in a single request, replacing manual URL tracking and broad wildcards. - -## __Amazon Elastic Container Registry__ - - ### Features - - Removes support for registry policy V1 - -## __Amazon GameLift__ - - ### Features - - Amazon GameLift Servers adds a new DescribeContainerGroupPortMappings API for container fleets, making it easy to discover which connection ports map to your container ports without needing to remotely access the compute. - -## __Amazon S3__ - - ### Bugfixes - - Add custom 503 throttling detection for S3 head operations - -## __Amazon WorkSpaces Web__ - - ### Features - - Allow admins to configure IPv6 ranges on IP Access Settings. - -## __S3 Transfer Manager__ - - ### Bugfixes - - Fixed an issue where cancelling a directory transfer did not fully stop the operation. - -## __S3TransferManager__ - - ### Features - - Support MRAP buckets in S3 TransferManager. - -# __2.43.0__ __2026-04-27__ -## __AWS Glue__ - - ### Features - - Addition of AdditionalAuditContext to GetPartition, GetPartitions, GetTableVersion, and GetTableVersions - -## __AWS Key Management Service__ - - ### Features - - KMS GetKeyLastUsage API provides information on the last successful cryptographic operation performed on KMS keys. This new API provides KMS customers with the last timestamp, CloudTrail eventId, and the cryptographic operation that was performed on the key. - -## __AWS SDK for Java v2__ - - ### Features - - Add support for overriding authSchemeProvider per request. - - Optimize ExecutionAttributes to reduce resizes and reduce hash computation cost. - -## __AWSBillingConductor__ - - ### Features - - Add support for Passthrough pricing plan - -## __Amazon CloudWatch Application Signals__ - - ### Features - - Application Signals now supports creating composite Service Level Objectives on Service Operations. Users can now create service SLO on multiple operations. - -## __Amazon CloudWatch Logs__ - - ### Features - - Adds support for selecting all logs sources and types in a single association. - -## __Amazon GameLift Streams__ - - ### Features - - Adds Proton 10.0-4 to the list of runtime environment options available when creating an Amazon GameLift Streams application - -## __Amazon Interactive Video Service__ - - ### Features - - Adds tags parameter to the CreateAdConfiguration operation - -## __Amazon Omics__ - - ### Features - - Enable Public Internet or VPC configuration to BatchRun - -## __Amazon OpenSearch Service__ - - ### Features - - Amazon OpenSearch Service now supports JWKS URL configuration for JWT authentication - -## __Amazon S3__ - - ### Features - - Add configurable `expectContinueThresholdInBytes` to S3Configuration (default 1 MB). The Expect: 100-continue header is now only added to PutObject and UploadPart requests when the content-length meets or exceeds the threshold, reducing latency overhead for small uploads. - -## __Amazon SageMaker Service__ - - ### Features - - Updated API documentation for endpoint MetricsConfig. Added details on supported metric publish frequencies and clarified how EnableEnhancedMetrics controls utilization and invocation metric behavior. - -## __Amazon WorkSpaces__ - - ### Features - - Added support for Protocol as modified resource and added update failure as modification state - -## __Application Migration Service__ - - ### Features - - Added network modernization support, enabling customers to edit, resize, merge, and split VPCs and subnets during migration while retaining functional, non-conflicting IP addresses. - -## __S3 Transfer Manager__ - - ### Bugfixes - - Fix TransferListener callbacks (bytesTransferred, transferComplete) not firing for unknown-content-length uploads via S3TransferManager when the data fits in a single chunk. - diff --git a/archetypes/archetype-app-quickstart/pom.xml b/archetypes/archetype-app-quickstart/pom.xml index cfdd76ceb8a8..808ad86e9f63 100644 --- a/archetypes/archetype-app-quickstart/pom.xml +++ b/archetypes/archetype-app-quickstart/pom.xml @@ -20,7 +20,7 @@ archetypes software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/archetypes/archetype-lambda/pom.xml b/archetypes/archetype-lambda/pom.xml index edb2f5a3ee9c..c0ddf8856da9 100644 --- a/archetypes/archetype-lambda/pom.xml +++ b/archetypes/archetype-lambda/pom.xml @@ -20,7 +20,7 @@ archetypes software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 archetype-lambda diff --git a/archetypes/archetype-tools/pom.xml b/archetypes/archetype-tools/pom.xml index 83c0678dc8f2..bff2ac137437 100644 --- a/archetypes/archetype-tools/pom.xml +++ b/archetypes/archetype-tools/pom.xml @@ -20,7 +20,7 @@ archetypes software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/archetypes/pom.xml b/archetypes/pom.xml index 8ef995426ef2..3fe0376d2231 100644 --- a/archetypes/pom.xml +++ b/archetypes/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 archetypes diff --git a/aws-sdk-java/pom.xml b/aws-sdk-java/pom.xml index ced834362efe..d24dd637b569 100644 --- a/aws-sdk-java/pom.xml +++ b/aws-sdk-java/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../pom.xml aws-sdk-java diff --git a/bom-internal/pom.xml b/bom-internal/pom.xml index f564216d5cd6..d68c013c8e6e 100644 --- a/bom-internal/pom.xml +++ b/bom-internal/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/bom/pom.xml b/bom/pom.xml index 77c054311b13..aeaf517ef607 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../pom.xml bom diff --git a/bundle-logging-bridge/pom.xml b/bundle-logging-bridge/pom.xml index 62b48fcfc9de..3035b8190774 100644 --- a/bundle-logging-bridge/pom.xml +++ b/bundle-logging-bridge/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bundle-logging-bridge jar diff --git a/bundle-sdk/pom.xml b/bundle-sdk/pom.xml index b8459e36e6cd..6e90ba3c048e 100644 --- a/bundle-sdk/pom.xml +++ b/bundle-sdk/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bundle-sdk jar diff --git a/bundle/pom.xml b/bundle/pom.xml index 5a9425d12705..1e8fb640c605 100644 --- a/bundle/pom.xml +++ b/bundle/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bundle jar diff --git a/changelogs/2.43.x-CHANGELOG.md b/changelogs/2.43.x-CHANGELOG.md new file mode 100644 index 000000000000..e953bb39e9ba --- /dev/null +++ b/changelogs/2.43.x-CHANGELOG.md @@ -0,0 +1,175 @@ + #### 👋 _Looking for changelogs for older versions? You can find them in the [changelogs](./changelogs) directory._ +# __2.43.2__ __2026-04-30__ +## __AWS SDK for Java v2__ + - ### Features + - Updated endpoint and partition metadata. + + - ### Bugfixes + - Improved error message when `ResponseTransformer.toFile()` or `AsyncResponseTransformer.toFile()` fails because the parent directory does not exist. The error now indicates that the parent directory must be created before calling the method. + +## __AWS Single Sign-On Admin__ + - ### Features + - Add InstanceArn and IdentityStoreArn in the response of CreateApplication API and IdentityStoreArn in the response of DescribeApplication API + +## __Amazon Bedrock AgentCore__ + - ### Features + - AgentCore Identity now supports on-behalf-of token exchange OAuth2. AgentCore Memory now supports metadata for LongTerm Memory Records. + +## __Amazon Bedrock AgentCore Control__ + - ### Features + - AgentCore Identity now supports on-behalf-of token exchange OAuth2. AgentCore Memory now supports metadata for LongTerm Memory Records. + +## __Amazon DataZone__ + - ### Features + - Adds support for asynchronous notebook runs + +## __Amazon Elastic Kubernetes Service__ + - ### Features + - Vended logs update param for capability vended logs feature + +## __Amazon Route 53 Global Resolver__ + - ### Features + - Adds support for regions in the UpdateGlobalResolver input. + +## __Amazon SageMaker Service__ + - ### Features + - Add InstancePools support to Endpoint for flexible provisioning across a prioritized list of instance types. Add Specifications support to InferenceComponent for per-instance-type model configurations. + +## __CloudWatch Observability Admin Service__ + - ### Features + - Observability Admin enablement launch for AWS Kafka, Bedrock Agent Core Workload Identity and OTel metric enablement. + +## __Managed Streaming for Kafka__ + - ### Features + - Adds support for ZookeeperAccess field to control the Client-Zookeeper connectivity. + +## __Payment Cryptography Control Plane__ + - ### Features + - Adds support for resource-based policies on AWS Payment Cryptography keys, enabling cross-account key sharing. Also adds Multi-Party Approval (MPA) team association APIs for protecting sensitive import root public key operations. + +## __Url Connection Client__ + - ### Bugfixes + - Allow retry when URL Connection HTTP Client encounters a NullPointerException wrapped in a RuntimeException + +# __2.43.1__ __2026-04-29__ +## __AWS Account__ + - ### Features + - Adds AccountState in the response for the GetAccountInformation API. Each state represents a specific phase in the account lifecycle. Use this information to manage account access, automate workflows, or trigger actions based on account state changes. + +## __AWS Elemental MediaPackage v2__ + - ### Features + - This feature adds configuration for specifying SCTE marker handling and allow greater control over generated manifest and segment URIs + +## __AWS SDK for Java v2__ + - ### Features + - Updated endpoint and partition metadata. + + - ### Bugfixes + - Fixed deserialization failure for JSON responses containing field names longer than 50,000 characters. Services like DynamoDB allow attribute names up to 65,535 bytes, which exceeded Jackson's default `maxNameLength` limit. + +## __AWS Transfer Family__ + - ### Features + - This launch will increase the limits for customers to list the contents from the remote directories from 10k to 200k. + +## __AWSDeadlineCloud__ + - ### Features + - Adds support for rtx-pro-server-6000 GPU accelerator for service-managed fleets. + +## __Amazon Bedrock AgentCore__ + - ### Features + - Adds batch evaluation for running evaluators against multiple agent sessions with server-side orchestration, AI-powered recommendations for optimizing system prompts and tool descriptions, and AB testing with controlled traffic splitting and statistical significance reporting + +## __Amazon Bedrock AgentCore Control__ + - ### Features + - Adds configuration bundles for versioned, immutable agent configuration snapshots with branch-based lineage + +## __Amazon CloudFront__ + - ### Features + - Amazon CloudFront now supports cache tag. Tag objects via response headers and invalidate all matching objects in a single request, replacing manual URL tracking and broad wildcards. + +## __Amazon Elastic Container Registry__ + - ### Features + - Removes support for registry policy V1 + +## __Amazon GameLift__ + - ### Features + - Amazon GameLift Servers adds a new DescribeContainerGroupPortMappings API for container fleets, making it easy to discover which connection ports map to your container ports without needing to remotely access the compute. + +## __Amazon S3__ + - ### Bugfixes + - Add custom 503 throttling detection for S3 head operations + +## __Amazon WorkSpaces Web__ + - ### Features + - Allow admins to configure IPv6 ranges on IP Access Settings. + +## __S3 Transfer Manager__ + - ### Bugfixes + - Fixed an issue where cancelling a directory transfer did not fully stop the operation. + +## __S3TransferManager__ + - ### Features + - Support MRAP buckets in S3 TransferManager. + +# __2.43.0__ __2026-04-27__ +## __AWS Glue__ + - ### Features + - Addition of AdditionalAuditContext to GetPartition, GetPartitions, GetTableVersion, and GetTableVersions + +## __AWS Key Management Service__ + - ### Features + - KMS GetKeyLastUsage API provides information on the last successful cryptographic operation performed on KMS keys. This new API provides KMS customers with the last timestamp, CloudTrail eventId, and the cryptographic operation that was performed on the key. + +## __AWS SDK for Java v2__ + - ### Features + - Add support for overriding authSchemeProvider per request. + - Optimize ExecutionAttributes to reduce resizes and reduce hash computation cost. + +## __AWSBillingConductor__ + - ### Features + - Add support for Passthrough pricing plan + +## __Amazon CloudWatch Application Signals__ + - ### Features + - Application Signals now supports creating composite Service Level Objectives on Service Operations. Users can now create service SLO on multiple operations. + +## __Amazon CloudWatch Logs__ + - ### Features + - Adds support for selecting all logs sources and types in a single association. + +## __Amazon GameLift Streams__ + - ### Features + - Adds Proton 10.0-4 to the list of runtime environment options available when creating an Amazon GameLift Streams application + +## __Amazon Interactive Video Service__ + - ### Features + - Adds tags parameter to the CreateAdConfiguration operation + +## __Amazon Omics__ + - ### Features + - Enable Public Internet or VPC configuration to BatchRun + +## __Amazon OpenSearch Service__ + - ### Features + - Amazon OpenSearch Service now supports JWKS URL configuration for JWT authentication + +## __Amazon S3__ + - ### Features + - Add configurable `expectContinueThresholdInBytes` to S3Configuration (default 1 MB). The Expect: 100-continue header is now only added to PutObject and UploadPart requests when the content-length meets or exceeds the threshold, reducing latency overhead for small uploads. + +## __Amazon SageMaker Service__ + - ### Features + - Updated API documentation for endpoint MetricsConfig. Added details on supported metric publish frequencies and clarified how EnableEnhancedMetrics controls utilization and invocation metric behavior. + +## __Amazon WorkSpaces__ + - ### Features + - Added support for Protocol as modified resource and added update failure as modification state + +## __Application Migration Service__ + - ### Features + - Added network modernization support, enabling customers to edit, resize, merge, and split VPCs and subnets during migration while retaining functional, non-conflicting IP addresses. + +## __S3 Transfer Manager__ + - ### Bugfixes + - Fix TransferListener callbacks (bytesTransferred, transferComplete) not firing for unknown-content-length uploads via S3TransferManager when the data fits in a single chunk. + diff --git a/codegen-lite-maven-plugin/pom.xml b/codegen-lite-maven-plugin/pom.xml index 84c059513ec4..9ee9ef4db298 100644 --- a/codegen-lite-maven-plugin/pom.xml +++ b/codegen-lite-maven-plugin/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../pom.xml codegen-lite-maven-plugin diff --git a/codegen-lite/pom.xml b/codegen-lite/pom.xml index 22433af8ff7e..0662cae5fc6e 100644 --- a/codegen-lite/pom.xml +++ b/codegen-lite/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codegen-lite AWS Java SDK :: Code Generator Lite diff --git a/codegen-maven-plugin/pom.xml b/codegen-maven-plugin/pom.xml index 16037f9b3280..3451ce274c5b 100644 --- a/codegen-maven-plugin/pom.xml +++ b/codegen-maven-plugin/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../pom.xml codegen-maven-plugin diff --git a/codegen/pom.xml b/codegen/pom.xml index e24f750b2d42..1db589a4d2c7 100644 --- a/codegen/pom.xml +++ b/codegen/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codegen AWS Java SDK :: Code Generator diff --git a/core/annotations/pom.xml b/core/annotations/pom.xml index 720fb6e117b6..648b148466cf 100644 --- a/core/annotations/pom.xml +++ b/core/annotations/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/arns/pom.xml b/core/arns/pom.xml index 154772d6f934..b2beb9e1089f 100644 --- a/core/arns/pom.xml +++ b/core/arns/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/auth-crt/pom.xml b/core/auth-crt/pom.xml index cfdcbde8cf2d..e31d58c316e9 100644 --- a/core/auth-crt/pom.xml +++ b/core/auth-crt/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT auth-crt diff --git a/core/auth/pom.xml b/core/auth/pom.xml index 424602068a12..6bbb86b65818 100644 --- a/core/auth/pom.xml +++ b/core/auth/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT auth diff --git a/core/aws-core/pom.xml b/core/aws-core/pom.xml index 47e3c6b9d40a..74c40d022737 100644 --- a/core/aws-core/pom.xml +++ b/core/aws-core/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT aws-core diff --git a/core/checksums-spi/pom.xml b/core/checksums-spi/pom.xml index 1d6adbb78d8e..1875db503f94 100644 --- a/core/checksums-spi/pom.xml +++ b/core/checksums-spi/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT checksums-spi diff --git a/core/checksums/pom.xml b/core/checksums/pom.xml index d3531b751f5d..65aaf81d9ae1 100644 --- a/core/checksums/pom.xml +++ b/core/checksums/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT checksums diff --git a/core/crt-core/pom.xml b/core/crt-core/pom.xml index b61aa22b08c8..bebce6a60958 100644 --- a/core/crt-core/pom.xml +++ b/core/crt-core/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT crt-core diff --git a/core/endpoints-spi/pom.xml b/core/endpoints-spi/pom.xml index 3dede79c865e..c45dbb6d6c96 100644 --- a/core/endpoints-spi/pom.xml +++ b/core/endpoints-spi/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/http-auth-aws-crt/pom.xml b/core/http-auth-aws-crt/pom.xml index a2aaebe4c5c9..7516221e7302 100644 --- a/core/http-auth-aws-crt/pom.xml +++ b/core/http-auth-aws-crt/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT http-auth-aws-crt diff --git a/core/http-auth-aws-eventstream/pom.xml b/core/http-auth-aws-eventstream/pom.xml index f1c089eae628..5c62e2d9e265 100644 --- a/core/http-auth-aws-eventstream/pom.xml +++ b/core/http-auth-aws-eventstream/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT http-auth-aws-eventstream diff --git a/core/http-auth-aws/pom.xml b/core/http-auth-aws/pom.xml index 62fa59c3f94b..c621eba5270d 100644 --- a/core/http-auth-aws/pom.xml +++ b/core/http-auth-aws/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT http-auth-aws diff --git a/core/http-auth-spi/pom.xml b/core/http-auth-spi/pom.xml index 59f59e146199..5cde916f2bec 100644 --- a/core/http-auth-spi/pom.xml +++ b/core/http-auth-spi/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT http-auth-spi diff --git a/core/http-auth/pom.xml b/core/http-auth/pom.xml index a36cdaf1d646..167e3054f840 100644 --- a/core/http-auth/pom.xml +++ b/core/http-auth/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT http-auth diff --git a/core/identity-spi/pom.xml b/core/identity-spi/pom.xml index 8a0510ac357d..3d1452685caa 100644 --- a/core/identity-spi/pom.xml +++ b/core/identity-spi/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT identity-spi diff --git a/core/imds/pom.xml b/core/imds/pom.xml index 9a9a7f6b984c..b8cf4fbf95cb 100644 --- a/core/imds/pom.xml +++ b/core/imds/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 imds diff --git a/core/json-utils/pom.xml b/core/json-utils/pom.xml index 4f3c08343bae..7022670f4407 100644 --- a/core/json-utils/pom.xml +++ b/core/json-utils/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/metrics-spi/pom.xml b/core/metrics-spi/pom.xml index dda28253ce41..17d3c5b08609 100644 --- a/core/metrics-spi/pom.xml +++ b/core/metrics-spi/pom.xml @@ -5,7 +5,7 @@ core software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/pom.xml b/core/pom.xml index 1f2fd98b69d2..4cd54507533c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -21,7 +21,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT core diff --git a/core/profiles/pom.xml b/core/profiles/pom.xml index a941abddde6c..069d0d304634 100644 --- a/core/profiles/pom.xml +++ b/core/profiles/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT profiles diff --git a/core/protocols/aws-cbor-protocol/pom.xml b/core/protocols/aws-cbor-protocol/pom.xml index 9e9f4c81cb38..e09342545126 100644 --- a/core/protocols/aws-cbor-protocol/pom.xml +++ b/core/protocols/aws-cbor-protocol/pom.xml @@ -20,7 +20,7 @@ protocols software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/protocols/aws-json-protocol/pom.xml b/core/protocols/aws-json-protocol/pom.xml index e729f12cff1c..3a9588526c58 100644 --- a/core/protocols/aws-json-protocol/pom.xml +++ b/core/protocols/aws-json-protocol/pom.xml @@ -20,7 +20,7 @@ protocols software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/protocols/aws-query-protocol/pom.xml b/core/protocols/aws-query-protocol/pom.xml index 08fa428eec3b..13ec2dcd728e 100644 --- a/core/protocols/aws-query-protocol/pom.xml +++ b/core/protocols/aws-query-protocol/pom.xml @@ -20,7 +20,7 @@ protocols software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/protocols/aws-xml-protocol/pom.xml b/core/protocols/aws-xml-protocol/pom.xml index 0cf268a30f42..a91a3659fcbf 100644 --- a/core/protocols/aws-xml-protocol/pom.xml +++ b/core/protocols/aws-xml-protocol/pom.xml @@ -20,7 +20,7 @@ protocols software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/protocols/pom.xml b/core/protocols/pom.xml index 71c9d6ca28d4..9c742e6cf5ad 100644 --- a/core/protocols/pom.xml +++ b/core/protocols/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/protocols/protocol-core/pom.xml b/core/protocols/protocol-core/pom.xml index 7bbdb7dda94a..bfad53a38a8a 100644 --- a/core/protocols/protocol-core/pom.xml +++ b/core/protocols/protocol-core/pom.xml @@ -20,7 +20,7 @@ protocols software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/protocols/smithy-rpcv2-protocol/pom.xml b/core/protocols/smithy-rpcv2-protocol/pom.xml index fc96bcafae0f..31bdc7ef320e 100644 --- a/core/protocols/smithy-rpcv2-protocol/pom.xml +++ b/core/protocols/smithy-rpcv2-protocol/pom.xml @@ -20,7 +20,7 @@ protocols software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/regions/pom.xml b/core/regions/pom.xml index 0149b7b22502..2aeb3d676797 100644 --- a/core/regions/pom.xml +++ b/core/regions/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT regions diff --git a/core/retries-spi/pom.xml b/core/retries-spi/pom.xml index 6bc31718c8f4..2d9e122de116 100644 --- a/core/retries-spi/pom.xml +++ b/core/retries-spi/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/retries/pom.xml b/core/retries/pom.xml index dda02f94e835..8f114dd02068 100644 --- a/core/retries/pom.xml +++ b/core/retries/pom.xml @@ -21,7 +21,7 @@ core software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/core/sdk-core/pom.xml b/core/sdk-core/pom.xml index 11b88cdc08a9..767757332f33 100644 --- a/core/sdk-core/pom.xml +++ b/core/sdk-core/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk core - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sdk-core AWS Java SDK :: SDK Core diff --git a/http-client-spi/pom.xml b/http-client-spi/pom.xml index 9fb01794a276..1fe423130bf1 100644 --- a/http-client-spi/pom.xml +++ b/http-client-spi/pom.xml @@ -22,7 +22,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT http-client-spi AWS Java SDK :: HTTP Client Interface diff --git a/http-clients/apache-client/pom.xml b/http-clients/apache-client/pom.xml index 68f3ae1fe56e..420fe8c0a9bf 100644 --- a/http-clients/apache-client/pom.xml +++ b/http-clients/apache-client/pom.xml @@ -21,7 +21,7 @@ http-clients software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT apache-client diff --git a/http-clients/apache5-client/pom.xml b/http-clients/apache5-client/pom.xml index 241bc088e497..dfbfaa1bb94b 100644 --- a/http-clients/apache5-client/pom.xml +++ b/http-clients/apache5-client/pom.xml @@ -21,7 +21,7 @@ http-clients software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT apache5-client diff --git a/http-clients/aws-crt-client/pom.xml b/http-clients/aws-crt-client/pom.xml index 5e994d372889..531e37319fdf 100644 --- a/http-clients/aws-crt-client/pom.xml +++ b/http-clients/aws-crt-client/pom.xml @@ -21,7 +21,7 @@ http-clients software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/http-clients/netty-nio-client/pom.xml b/http-clients/netty-nio-client/pom.xml index 5878ad4a8aec..7b8133b3420c 100644 --- a/http-clients/netty-nio-client/pom.xml +++ b/http-clients/netty-nio-client/pom.xml @@ -20,7 +20,7 @@ http-clients software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/http-clients/pom.xml b/http-clients/pom.xml index a205db3d7619..0501bfda66d9 100644 --- a/http-clients/pom.xml +++ b/http-clients/pom.xml @@ -21,7 +21,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/http-clients/url-connection-client/pom.xml b/http-clients/url-connection-client/pom.xml index 66cf1583f2b9..482c2a18ea42 100644 --- a/http-clients/url-connection-client/pom.xml +++ b/http-clients/url-connection-client/pom.xml @@ -20,7 +20,7 @@ http-clients software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/metric-publishers/cloudwatch-metric-publisher/pom.xml b/metric-publishers/cloudwatch-metric-publisher/pom.xml index b259ac847c82..613463a16e52 100644 --- a/metric-publishers/cloudwatch-metric-publisher/pom.xml +++ b/metric-publishers/cloudwatch-metric-publisher/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk metric-publishers - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cloudwatch-metric-publisher diff --git a/metric-publishers/emf-metric-logging-publisher/pom.xml b/metric-publishers/emf-metric-logging-publisher/pom.xml index 8db74b560a51..2de222f09ad6 100644 --- a/metric-publishers/emf-metric-logging-publisher/pom.xml +++ b/metric-publishers/emf-metric-logging-publisher/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk metric-publishers - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT emf-metric-logging-publisher diff --git a/metric-publishers/pom.xml b/metric-publishers/pom.xml index 6dc0be989127..e615b747d356 100644 --- a/metric-publishers/pom.xml +++ b/metric-publishers/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT metric-publishers diff --git a/pom.xml b/pom.xml index 25f199907ef0..47adaa02dfc2 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 4.0.0 software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT pom AWS Java SDK :: Parent The Amazon Web Services SDK for Java provides Java APIs diff --git a/release-scripts/pom.xml b/release-scripts/pom.xml index 94e73a061834..85f5b87caea0 100644 --- a/release-scripts/pom.xml +++ b/release-scripts/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../pom.xml release-scripts diff --git a/services-custom/dynamodb-enhanced/pom.xml b/services-custom/dynamodb-enhanced/pom.xml index 6dc47df7cca9..e7a9c80b53c0 100644 --- a/services-custom/dynamodb-enhanced/pom.xml +++ b/services-custom/dynamodb-enhanced/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services-custom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT dynamodb-enhanced AWS Java SDK :: DynamoDB :: Enhanced Client diff --git a/services-custom/iam-policy-builder/pom.xml b/services-custom/iam-policy-builder/pom.xml index 1e85a9729375..b7a46dab1d14 100644 --- a/services-custom/iam-policy-builder/pom.xml +++ b/services-custom/iam-policy-builder/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml iam-policy-builder diff --git a/services-custom/pom.xml b/services-custom/pom.xml index 70550b8ffe14..179bae99ce90 100644 --- a/services-custom/pom.xml +++ b/services-custom/pom.xml @@ -19,7 +19,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT services-custom AWS Java SDK :: Custom Services diff --git a/services-custom/s3-event-notifications/pom.xml b/services-custom/s3-event-notifications/pom.xml index 780cf6bc367f..9a7b9e5fe741 100644 --- a/services-custom/s3-event-notifications/pom.xml +++ b/services-custom/s3-event-notifications/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml s3-event-notifications diff --git a/services-custom/s3-transfer-manager/pom.xml b/services-custom/s3-transfer-manager/pom.xml index af588c74b408..1a27b2a8a01c 100644 --- a/services-custom/s3-transfer-manager/pom.xml +++ b/services-custom/s3-transfer-manager/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml s3-transfer-manager diff --git a/services-custom/sns-message-manager/pom.xml b/services-custom/sns-message-manager/pom.xml index f633b9ad3305..77b4e098c903 100644 --- a/services-custom/sns-message-manager/pom.xml +++ b/services-custom/sns-message-manager/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml sns-message-manager diff --git a/services/accessanalyzer/pom.xml b/services/accessanalyzer/pom.xml index 0971137fba7e..fe4d39b1040d 100644 --- a/services/accessanalyzer/pom.xml +++ b/services/accessanalyzer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT accessanalyzer AWS Java SDK :: Services :: AccessAnalyzer diff --git a/services/account/pom.xml b/services/account/pom.xml index 0015c65f2687..3264202c1bc4 100644 --- a/services/account/pom.xml +++ b/services/account/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT account AWS Java SDK :: Services :: Account diff --git a/services/acm/pom.xml b/services/acm/pom.xml index dfe866525c54..802170c2b8cd 100644 --- a/services/acm/pom.xml +++ b/services/acm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT acm AWS Java SDK :: Services :: AWS Certificate Manager diff --git a/services/acmpca/pom.xml b/services/acmpca/pom.xml index e6483c4d114e..842c54365ded 100644 --- a/services/acmpca/pom.xml +++ b/services/acmpca/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT acmpca AWS Java SDK :: Services :: ACM PCA diff --git a/services/aiops/pom.xml b/services/aiops/pom.xml index f2e088db9763..69f92cf73477 100644 --- a/services/aiops/pom.xml +++ b/services/aiops/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT aiops AWS Java SDK :: Services :: AI Ops diff --git a/services/amp/pom.xml b/services/amp/pom.xml index 29b0a34d5f76..2de2dd8a9c55 100644 --- a/services/amp/pom.xml +++ b/services/amp/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT amp AWS Java SDK :: Services :: Amp diff --git a/services/amplify/pom.xml b/services/amplify/pom.xml index 2abb038db121..97dd615008a7 100644 --- a/services/amplify/pom.xml +++ b/services/amplify/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT amplify AWS Java SDK :: Services :: Amplify diff --git a/services/amplifybackend/pom.xml b/services/amplifybackend/pom.xml index b91ec7023fdc..1689c251cfbe 100644 --- a/services/amplifybackend/pom.xml +++ b/services/amplifybackend/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT amplifybackend AWS Java SDK :: Services :: Amplify Backend diff --git a/services/amplifyuibuilder/pom.xml b/services/amplifyuibuilder/pom.xml index b3aa65c5f168..4d204761f088 100644 --- a/services/amplifyuibuilder/pom.xml +++ b/services/amplifyuibuilder/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT amplifyuibuilder AWS Java SDK :: Services :: Amplify UI Builder diff --git a/services/apigateway/pom.xml b/services/apigateway/pom.xml index e3b65d8df587..e7f5134300da 100644 --- a/services/apigateway/pom.xml +++ b/services/apigateway/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT apigateway AWS Java SDK :: Services :: Amazon API Gateway diff --git a/services/apigatewaymanagementapi/pom.xml b/services/apigatewaymanagementapi/pom.xml index d1a04dfb62f1..bd0cc6e4ffab 100644 --- a/services/apigatewaymanagementapi/pom.xml +++ b/services/apigatewaymanagementapi/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT apigatewaymanagementapi AWS Java SDK :: Services :: ApiGatewayManagementApi diff --git a/services/apigatewayv2/pom.xml b/services/apigatewayv2/pom.xml index 3b227bf8c811..3ae19b5e9c3f 100644 --- a/services/apigatewayv2/pom.xml +++ b/services/apigatewayv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT apigatewayv2 AWS Java SDK :: Services :: ApiGatewayV2 diff --git a/services/appconfig/pom.xml b/services/appconfig/pom.xml index dbf96e148d2b..c90ebcb27048 100644 --- a/services/appconfig/pom.xml +++ b/services/appconfig/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT appconfig AWS Java SDK :: Services :: AppConfig diff --git a/services/appconfigdata/pom.xml b/services/appconfigdata/pom.xml index 9bcde6570091..8b7a76bb122e 100644 --- a/services/appconfigdata/pom.xml +++ b/services/appconfigdata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT appconfigdata AWS Java SDK :: Services :: App Config Data diff --git a/services/appfabric/pom.xml b/services/appfabric/pom.xml index f684a455b300..d21a05ed8878 100644 --- a/services/appfabric/pom.xml +++ b/services/appfabric/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT appfabric AWS Java SDK :: Services :: App Fabric diff --git a/services/appflow/pom.xml b/services/appflow/pom.xml index 5abba7e067f9..965e20aad2f4 100644 --- a/services/appflow/pom.xml +++ b/services/appflow/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT appflow AWS Java SDK :: Services :: Appflow diff --git a/services/appintegrations/pom.xml b/services/appintegrations/pom.xml index bfc1890d71af..74847c21abbd 100644 --- a/services/appintegrations/pom.xml +++ b/services/appintegrations/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT appintegrations AWS Java SDK :: Services :: App Integrations diff --git a/services/applicationautoscaling/pom.xml b/services/applicationautoscaling/pom.xml index 03d4a0620d68..989367a0c4f8 100644 --- a/services/applicationautoscaling/pom.xml +++ b/services/applicationautoscaling/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT applicationautoscaling AWS Java SDK :: Services :: AWS Application Auto Scaling diff --git a/services/applicationcostprofiler/pom.xml b/services/applicationcostprofiler/pom.xml index f6f68d0815f0..521153e78c08 100644 --- a/services/applicationcostprofiler/pom.xml +++ b/services/applicationcostprofiler/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT applicationcostprofiler AWS Java SDK :: Services :: Application Cost Profiler diff --git a/services/applicationdiscovery/pom.xml b/services/applicationdiscovery/pom.xml index 209d0adcbcce..415621bf2c46 100644 --- a/services/applicationdiscovery/pom.xml +++ b/services/applicationdiscovery/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT applicationdiscovery AWS Java SDK :: Services :: AWS Application Discovery Service diff --git a/services/applicationinsights/pom.xml b/services/applicationinsights/pom.xml index f73903ca81e9..d5dcf7715c3a 100644 --- a/services/applicationinsights/pom.xml +++ b/services/applicationinsights/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT applicationinsights AWS Java SDK :: Services :: Application Insights diff --git a/services/applicationsignals/pom.xml b/services/applicationsignals/pom.xml index f2e94c6afc8a..5d9948600f4c 100644 --- a/services/applicationsignals/pom.xml +++ b/services/applicationsignals/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT applicationsignals AWS Java SDK :: Services :: Application Signals diff --git a/services/appmesh/pom.xml b/services/appmesh/pom.xml index 1709b1bde85d..616b421fe857 100644 --- a/services/appmesh/pom.xml +++ b/services/appmesh/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT appmesh AWS Java SDK :: Services :: App Mesh diff --git a/services/apprunner/pom.xml b/services/apprunner/pom.xml index da49035b7eb9..c6e1253e6117 100644 --- a/services/apprunner/pom.xml +++ b/services/apprunner/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT apprunner AWS Java SDK :: Services :: App Runner diff --git a/services/appstream/pom.xml b/services/appstream/pom.xml index b4c33ea971db..bf40e4d1c748 100644 --- a/services/appstream/pom.xml +++ b/services/appstream/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT appstream AWS Java SDK :: Services :: Amazon AppStream diff --git a/services/appsync/pom.xml b/services/appsync/pom.xml index 1f0494785000..a0cef8ecf449 100644 --- a/services/appsync/pom.xml +++ b/services/appsync/pom.xml @@ -21,7 +21,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT appsync diff --git a/services/arcregionswitch/pom.xml b/services/arcregionswitch/pom.xml index 16963a557cc9..591051561439 100644 --- a/services/arcregionswitch/pom.xml +++ b/services/arcregionswitch/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT arcregionswitch AWS Java SDK :: Services :: ARC Region Switch diff --git a/services/arczonalshift/pom.xml b/services/arczonalshift/pom.xml index 31e5545dc592..69a93c3d6a44 100644 --- a/services/arczonalshift/pom.xml +++ b/services/arczonalshift/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT arczonalshift AWS Java SDK :: Services :: ARC Zonal Shift diff --git a/services/artifact/pom.xml b/services/artifact/pom.xml index f56db0bcc98b..3a8d9982b0e4 100644 --- a/services/artifact/pom.xml +++ b/services/artifact/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT artifact AWS Java SDK :: Services :: Artifact diff --git a/services/athena/pom.xml b/services/athena/pom.xml index acf10060a9f7..7cbae1a1cc9d 100644 --- a/services/athena/pom.xml +++ b/services/athena/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT athena AWS Java SDK :: Services :: Amazon Athena diff --git a/services/auditmanager/pom.xml b/services/auditmanager/pom.xml index 75caab260e1b..cb2dceb2cb83 100644 --- a/services/auditmanager/pom.xml +++ b/services/auditmanager/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT auditmanager AWS Java SDK :: Services :: Audit Manager diff --git a/services/autoscaling/pom.xml b/services/autoscaling/pom.xml index 42ee7940ce7f..4750a788cfd8 100644 --- a/services/autoscaling/pom.xml +++ b/services/autoscaling/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT autoscaling AWS Java SDK :: Services :: Auto Scaling diff --git a/services/autoscalingplans/pom.xml b/services/autoscalingplans/pom.xml index 92d2145ac0fb..9610ebd47482 100644 --- a/services/autoscalingplans/pom.xml +++ b/services/autoscalingplans/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT autoscalingplans AWS Java SDK :: Services :: Auto Scaling Plans diff --git a/services/b2bi/pom.xml b/services/b2bi/pom.xml index f7f99bc0011f..8dd9c2cfd6d2 100644 --- a/services/b2bi/pom.xml +++ b/services/b2bi/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT b2bi AWS Java SDK :: Services :: B2 Bi diff --git a/services/backup/pom.xml b/services/backup/pom.xml index 3a76fb2683a9..240ff89f5867 100644 --- a/services/backup/pom.xml +++ b/services/backup/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT backup AWS Java SDK :: Services :: Backup diff --git a/services/backupgateway/pom.xml b/services/backupgateway/pom.xml index 25e0f4ad5581..748c1ce9f33a 100644 --- a/services/backupgateway/pom.xml +++ b/services/backupgateway/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT backupgateway AWS Java SDK :: Services :: Backup Gateway diff --git a/services/backupsearch/pom.xml b/services/backupsearch/pom.xml index 424297fd1ba1..bce17aee148a 100644 --- a/services/backupsearch/pom.xml +++ b/services/backupsearch/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT backupsearch AWS Java SDK :: Services :: Backup Search diff --git a/services/batch/pom.xml b/services/batch/pom.xml index c115ea39b107..a7ee525d0421 100644 --- a/services/batch/pom.xml +++ b/services/batch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT batch AWS Java SDK :: Services :: AWS Batch diff --git a/services/bcmdashboards/pom.xml b/services/bcmdashboards/pom.xml index 36bf086dfd40..44c4694ea9d4 100644 --- a/services/bcmdashboards/pom.xml +++ b/services/bcmdashboards/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bcmdashboards AWS Java SDK :: Services :: BCM Dashboards diff --git a/services/bcmdataexports/pom.xml b/services/bcmdataexports/pom.xml index f68dc673161a..4a5ef95618e2 100644 --- a/services/bcmdataexports/pom.xml +++ b/services/bcmdataexports/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bcmdataexports AWS Java SDK :: Services :: BCM Data Exports diff --git a/services/bcmpricingcalculator/pom.xml b/services/bcmpricingcalculator/pom.xml index e80bd11409d8..6c6850ec1e8a 100644 --- a/services/bcmpricingcalculator/pom.xml +++ b/services/bcmpricingcalculator/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bcmpricingcalculator AWS Java SDK :: Services :: BCM Pricing Calculator diff --git a/services/bcmrecommendedactions/pom.xml b/services/bcmrecommendedactions/pom.xml index dc513457c36e..29b73a440927 100644 --- a/services/bcmrecommendedactions/pom.xml +++ b/services/bcmrecommendedactions/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bcmrecommendedactions AWS Java SDK :: Services :: BCM Recommended Actions diff --git a/services/bedrock/pom.xml b/services/bedrock/pom.xml index 4d345365e123..f0f13809f0c5 100644 --- a/services/bedrock/pom.xml +++ b/services/bedrock/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bedrock AWS Java SDK :: Services :: Bedrock diff --git a/services/bedrockagent/pom.xml b/services/bedrockagent/pom.xml index 2a54fd22da1c..15e64f1c2d56 100644 --- a/services/bedrockagent/pom.xml +++ b/services/bedrockagent/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bedrockagent AWS Java SDK :: Services :: Bedrock Agent diff --git a/services/bedrockagentcore/pom.xml b/services/bedrockagentcore/pom.xml index 44947f078e86..e5649289088d 100644 --- a/services/bedrockagentcore/pom.xml +++ b/services/bedrockagentcore/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bedrockagentcore AWS Java SDK :: Services :: Bedrock Agent Core diff --git a/services/bedrockagentcorecontrol/pom.xml b/services/bedrockagentcorecontrol/pom.xml index 289cd68a4959..26222caa219e 100644 --- a/services/bedrockagentcorecontrol/pom.xml +++ b/services/bedrockagentcorecontrol/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bedrockagentcorecontrol AWS Java SDK :: Services :: Bedrock Agent Core Control diff --git a/services/bedrockagentruntime/pom.xml b/services/bedrockagentruntime/pom.xml index 0d2fa398b2d3..24e74fc8e4cb 100644 --- a/services/bedrockagentruntime/pom.xml +++ b/services/bedrockagentruntime/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bedrockagentruntime AWS Java SDK :: Services :: Bedrock Agent Runtime diff --git a/services/bedrockdataautomation/pom.xml b/services/bedrockdataautomation/pom.xml index 7998c9ee095b..e97bf700b8f5 100644 --- a/services/bedrockdataautomation/pom.xml +++ b/services/bedrockdataautomation/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bedrockdataautomation AWS Java SDK :: Services :: Bedrock Data Automation diff --git a/services/bedrockdataautomationruntime/pom.xml b/services/bedrockdataautomationruntime/pom.xml index 52aa081db62a..e198895134ad 100644 --- a/services/bedrockdataautomationruntime/pom.xml +++ b/services/bedrockdataautomationruntime/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bedrockdataautomationruntime AWS Java SDK :: Services :: Bedrock Data Automation Runtime diff --git a/services/bedrockruntime/pom.xml b/services/bedrockruntime/pom.xml index e794a6efd363..08d524ddc095 100644 --- a/services/bedrockruntime/pom.xml +++ b/services/bedrockruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT bedrockruntime AWS Java SDK :: Services :: Bedrock Runtime diff --git a/services/billing/pom.xml b/services/billing/pom.xml index a07b0a7f7021..6a3055c8da34 100644 --- a/services/billing/pom.xml +++ b/services/billing/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT billing AWS Java SDK :: Services :: Billing diff --git a/services/billingconductor/pom.xml b/services/billingconductor/pom.xml index 265cb3e7ccd0..faaa46a5e5bc 100644 --- a/services/billingconductor/pom.xml +++ b/services/billingconductor/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT billingconductor AWS Java SDK :: Services :: Billingconductor diff --git a/services/braket/pom.xml b/services/braket/pom.xml index fbf6c14cbb93..d10a601b0cd9 100644 --- a/services/braket/pom.xml +++ b/services/braket/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT braket AWS Java SDK :: Services :: Braket diff --git a/services/budgets/pom.xml b/services/budgets/pom.xml index 75760efb2f38..0715cd9cfa1c 100644 --- a/services/budgets/pom.xml +++ b/services/budgets/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT budgets AWS Java SDK :: Services :: AWS Budgets diff --git a/services/chatbot/pom.xml b/services/chatbot/pom.xml index 5e0abc29699a..48a1d82a7467 100644 --- a/services/chatbot/pom.xml +++ b/services/chatbot/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT chatbot AWS Java SDK :: Services :: Chatbot diff --git a/services/chime/pom.xml b/services/chime/pom.xml index a371cac120cb..1dad37e47bfc 100644 --- a/services/chime/pom.xml +++ b/services/chime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT chime AWS Java SDK :: Services :: Chime diff --git a/services/chimesdkidentity/pom.xml b/services/chimesdkidentity/pom.xml index 0cedbf336ea1..899419794e33 100644 --- a/services/chimesdkidentity/pom.xml +++ b/services/chimesdkidentity/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT chimesdkidentity AWS Java SDK :: Services :: Chime SDK Identity diff --git a/services/chimesdkmediapipelines/pom.xml b/services/chimesdkmediapipelines/pom.xml index 45fb8c4ba0b7..94f3e46d40c9 100644 --- a/services/chimesdkmediapipelines/pom.xml +++ b/services/chimesdkmediapipelines/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT chimesdkmediapipelines AWS Java SDK :: Services :: Chime SDK Media Pipelines diff --git a/services/chimesdkmeetings/pom.xml b/services/chimesdkmeetings/pom.xml index e12a2e4b0b65..9800a0beecc5 100644 --- a/services/chimesdkmeetings/pom.xml +++ b/services/chimesdkmeetings/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT chimesdkmeetings AWS Java SDK :: Services :: Chime SDK Meetings diff --git a/services/chimesdkmessaging/pom.xml b/services/chimesdkmessaging/pom.xml index 53d7a477037c..3cdc3987371e 100644 --- a/services/chimesdkmessaging/pom.xml +++ b/services/chimesdkmessaging/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT chimesdkmessaging AWS Java SDK :: Services :: Chime SDK Messaging diff --git a/services/chimesdkvoice/pom.xml b/services/chimesdkvoice/pom.xml index f5984387e60b..ac56a6620142 100644 --- a/services/chimesdkvoice/pom.xml +++ b/services/chimesdkvoice/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT chimesdkvoice AWS Java SDK :: Services :: Chime SDK Voice diff --git a/services/cleanrooms/pom.xml b/services/cleanrooms/pom.xml index dcd6b2dc10f7..4cf25747d322 100644 --- a/services/cleanrooms/pom.xml +++ b/services/cleanrooms/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cleanrooms AWS Java SDK :: Services :: Clean Rooms diff --git a/services/cleanroomsml/pom.xml b/services/cleanroomsml/pom.xml index 707995711fca..5781aab1c0cf 100644 --- a/services/cleanroomsml/pom.xml +++ b/services/cleanroomsml/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cleanroomsml AWS Java SDK :: Services :: Clean Rooms ML diff --git a/services/cloud9/pom.xml b/services/cloud9/pom.xml index a214f98ce80b..033fdc141df4 100644 --- a/services/cloud9/pom.xml +++ b/services/cloud9/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 cloud9 diff --git a/services/cloudcontrol/pom.xml b/services/cloudcontrol/pom.xml index 7e02545249ea..30454d68608c 100644 --- a/services/cloudcontrol/pom.xml +++ b/services/cloudcontrol/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cloudcontrol AWS Java SDK :: Services :: Cloud Control diff --git a/services/clouddirectory/pom.xml b/services/clouddirectory/pom.xml index cf8fd3f65c10..0f5dcab36bf4 100644 --- a/services/clouddirectory/pom.xml +++ b/services/clouddirectory/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT clouddirectory AWS Java SDK :: Services :: Amazon CloudDirectory diff --git a/services/cloudformation/pom.xml b/services/cloudformation/pom.xml index c56df6d32904..3a378d4dfb89 100644 --- a/services/cloudformation/pom.xml +++ b/services/cloudformation/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cloudformation AWS Java SDK :: Services :: AWS CloudFormation diff --git a/services/cloudfront/pom.xml b/services/cloudfront/pom.xml index 60cfb999e6ef..b1c3b82ba183 100644 --- a/services/cloudfront/pom.xml +++ b/services/cloudfront/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cloudfront AWS Java SDK :: Services :: Amazon CloudFront diff --git a/services/cloudfrontkeyvaluestore/pom.xml b/services/cloudfrontkeyvaluestore/pom.xml index d104f87ea028..e3b9bebcebc4 100644 --- a/services/cloudfrontkeyvaluestore/pom.xml +++ b/services/cloudfrontkeyvaluestore/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cloudfrontkeyvaluestore AWS Java SDK :: Services :: Cloud Front Key Value Store diff --git a/services/cloudhsm/pom.xml b/services/cloudhsm/pom.xml index 130f95dd77b9..1aa2b713069d 100644 --- a/services/cloudhsm/pom.xml +++ b/services/cloudhsm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cloudhsm AWS Java SDK :: Services :: AWS CloudHSM diff --git a/services/cloudhsmv2/pom.xml b/services/cloudhsmv2/pom.xml index efef72a09177..9498cdec192d 100644 --- a/services/cloudhsmv2/pom.xml +++ b/services/cloudhsmv2/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 cloudhsmv2 diff --git a/services/cloudsearch/pom.xml b/services/cloudsearch/pom.xml index 43c374ffdbbb..3bf720b174f2 100644 --- a/services/cloudsearch/pom.xml +++ b/services/cloudsearch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cloudsearch AWS Java SDK :: Services :: Amazon CloudSearch diff --git a/services/cloudsearchdomain/pom.xml b/services/cloudsearchdomain/pom.xml index 840369e4be0a..349a94fa01b3 100644 --- a/services/cloudsearchdomain/pom.xml +++ b/services/cloudsearchdomain/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cloudsearchdomain AWS Java SDK :: Services :: Amazon CloudSearch Domain diff --git a/services/cloudtrail/pom.xml b/services/cloudtrail/pom.xml index a7fb877c2622..20d4e07fc7f1 100644 --- a/services/cloudtrail/pom.xml +++ b/services/cloudtrail/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cloudtrail AWS Java SDK :: Services :: AWS CloudTrail diff --git a/services/cloudtraildata/pom.xml b/services/cloudtraildata/pom.xml index e9ba424963e6..c8d8f3ce6e75 100644 --- a/services/cloudtraildata/pom.xml +++ b/services/cloudtraildata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cloudtraildata AWS Java SDK :: Services :: Cloud Trail Data diff --git a/services/cloudwatch/pom.xml b/services/cloudwatch/pom.xml index 21ab5bd6e011..e40343442857 100644 --- a/services/cloudwatch/pom.xml +++ b/services/cloudwatch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cloudwatch AWS Java SDK :: Services :: Amazon CloudWatch diff --git a/services/cloudwatchevents/pom.xml b/services/cloudwatchevents/pom.xml index 83cdd01e18fb..e9c8ba59f4b6 100644 --- a/services/cloudwatchevents/pom.xml +++ b/services/cloudwatchevents/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cloudwatchevents AWS Java SDK :: Services :: Amazon CloudWatch Events diff --git a/services/cloudwatchlogs/pom.xml b/services/cloudwatchlogs/pom.xml index df010ae911b4..19d88df1cc2f 100644 --- a/services/cloudwatchlogs/pom.xml +++ b/services/cloudwatchlogs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cloudwatchlogs AWS Java SDK :: Services :: Amazon CloudWatch Logs diff --git a/services/codeartifact/pom.xml b/services/codeartifact/pom.xml index e20383becf82..d749840538f8 100644 --- a/services/codeartifact/pom.xml +++ b/services/codeartifact/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codeartifact AWS Java SDK :: Services :: Codeartifact diff --git a/services/codebuild/pom.xml b/services/codebuild/pom.xml index 8da34c8f16d5..ac81d6c22631 100644 --- a/services/codebuild/pom.xml +++ b/services/codebuild/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codebuild AWS Java SDK :: Services :: AWS Code Build diff --git a/services/codecatalyst/pom.xml b/services/codecatalyst/pom.xml index 777ee31f5983..2487f6b249a9 100644 --- a/services/codecatalyst/pom.xml +++ b/services/codecatalyst/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codecatalyst AWS Java SDK :: Services :: Code Catalyst diff --git a/services/codecommit/pom.xml b/services/codecommit/pom.xml index 8568aeab2327..9aa60d3c22cb 100644 --- a/services/codecommit/pom.xml +++ b/services/codecommit/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codecommit AWS Java SDK :: Services :: AWS CodeCommit diff --git a/services/codeconnections/pom.xml b/services/codeconnections/pom.xml index 65f2b62bcde7..fbf4bbaac9a4 100644 --- a/services/codeconnections/pom.xml +++ b/services/codeconnections/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codeconnections AWS Java SDK :: Services :: Code Connections diff --git a/services/codedeploy/pom.xml b/services/codedeploy/pom.xml index 04167c7e795b..4047394a094a 100644 --- a/services/codedeploy/pom.xml +++ b/services/codedeploy/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codedeploy AWS Java SDK :: Services :: AWS CodeDeploy diff --git a/services/codeguruprofiler/pom.xml b/services/codeguruprofiler/pom.xml index 1a79aae4a1ea..5f523bd4bf5a 100644 --- a/services/codeguruprofiler/pom.xml +++ b/services/codeguruprofiler/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codeguruprofiler AWS Java SDK :: Services :: CodeGuruProfiler diff --git a/services/codegurureviewer/pom.xml b/services/codegurureviewer/pom.xml index a35f32ac5de5..316d1a62670c 100644 --- a/services/codegurureviewer/pom.xml +++ b/services/codegurureviewer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codegurureviewer AWS Java SDK :: Services :: CodeGuru Reviewer diff --git a/services/codegurusecurity/pom.xml b/services/codegurusecurity/pom.xml index 3c92c670f4ab..8dd1796d4b65 100644 --- a/services/codegurusecurity/pom.xml +++ b/services/codegurusecurity/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codegurusecurity AWS Java SDK :: Services :: Code Guru Security diff --git a/services/codepipeline/pom.xml b/services/codepipeline/pom.xml index 9d408dd68d12..7e6a90dd9dae 100644 --- a/services/codepipeline/pom.xml +++ b/services/codepipeline/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codepipeline AWS Java SDK :: Services :: AWS CodePipeline diff --git a/services/codestarconnections/pom.xml b/services/codestarconnections/pom.xml index 3f51c167d190..1cc98faa17de 100644 --- a/services/codestarconnections/pom.xml +++ b/services/codestarconnections/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codestarconnections AWS Java SDK :: Services :: CodeStar connections diff --git a/services/codestarnotifications/pom.xml b/services/codestarnotifications/pom.xml index ceabe744a91c..b15b3e2be82a 100644 --- a/services/codestarnotifications/pom.xml +++ b/services/codestarnotifications/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT codestarnotifications AWS Java SDK :: Services :: Codestar Notifications diff --git a/services/cognitoidentity/pom.xml b/services/cognitoidentity/pom.xml index 65dd171ba67b..b07480d2869a 100644 --- a/services/cognitoidentity/pom.xml +++ b/services/cognitoidentity/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cognitoidentity AWS Java SDK :: Services :: Amazon Cognito Identity diff --git a/services/cognitoidentityprovider/pom.xml b/services/cognitoidentityprovider/pom.xml index f91fc4095944..66b056c12080 100644 --- a/services/cognitoidentityprovider/pom.xml +++ b/services/cognitoidentityprovider/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cognitoidentityprovider AWS Java SDK :: Services :: Amazon Cognito Identity Provider Service diff --git a/services/cognitosync/pom.xml b/services/cognitosync/pom.xml index 4932b579ebe2..923864642a1e 100644 --- a/services/cognitosync/pom.xml +++ b/services/cognitosync/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT cognitosync AWS Java SDK :: Services :: Amazon Cognito Sync diff --git a/services/comprehend/pom.xml b/services/comprehend/pom.xml index 2ce453c039c6..1eda1b4ec465 100644 --- a/services/comprehend/pom.xml +++ b/services/comprehend/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 comprehend diff --git a/services/comprehendmedical/pom.xml b/services/comprehendmedical/pom.xml index d1a3daf925ab..d4fa3f1ff4e8 100644 --- a/services/comprehendmedical/pom.xml +++ b/services/comprehendmedical/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT comprehendmedical AWS Java SDK :: Services :: ComprehendMedical diff --git a/services/computeoptimizer/pom.xml b/services/computeoptimizer/pom.xml index d02275ed1313..9db9df52cfb8 100644 --- a/services/computeoptimizer/pom.xml +++ b/services/computeoptimizer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT computeoptimizer AWS Java SDK :: Services :: Compute Optimizer diff --git a/services/computeoptimizerautomation/pom.xml b/services/computeoptimizerautomation/pom.xml index 5d4f6b7e6121..a82cffa9576e 100644 --- a/services/computeoptimizerautomation/pom.xml +++ b/services/computeoptimizerautomation/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT computeoptimizerautomation AWS Java SDK :: Services :: Compute Optimizer Automation diff --git a/services/config/pom.xml b/services/config/pom.xml index c9210b86dce2..9b571e3de5fd 100644 --- a/services/config/pom.xml +++ b/services/config/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT config AWS Java SDK :: Services :: AWS Config diff --git a/services/connect/pom.xml b/services/connect/pom.xml index 685c3fdab21b..fd04bf9dd67f 100644 --- a/services/connect/pom.xml +++ b/services/connect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT connect AWS Java SDK :: Services :: Connect diff --git a/services/connectcampaigns/pom.xml b/services/connectcampaigns/pom.xml index d2cb07147abc..47996b67f378 100644 --- a/services/connectcampaigns/pom.xml +++ b/services/connectcampaigns/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT connectcampaigns AWS Java SDK :: Services :: Connect Campaigns diff --git a/services/connectcampaignsv2/pom.xml b/services/connectcampaignsv2/pom.xml index c7e54c78654e..901222f0ec93 100644 --- a/services/connectcampaignsv2/pom.xml +++ b/services/connectcampaignsv2/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT connectcampaignsv2 AWS Java SDK :: Services :: Connect Campaigns V2 diff --git a/services/connectcases/pom.xml b/services/connectcases/pom.xml index 60456e17959f..30059b0e55c2 100644 --- a/services/connectcases/pom.xml +++ b/services/connectcases/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT connectcases AWS Java SDK :: Services :: Connect Cases diff --git a/services/connectcontactlens/pom.xml b/services/connectcontactlens/pom.xml index 38d7cba115e4..8ee951f33cb2 100644 --- a/services/connectcontactlens/pom.xml +++ b/services/connectcontactlens/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT connectcontactlens AWS Java SDK :: Services :: Connect Contact Lens diff --git a/services/connecthealth/pom.xml b/services/connecthealth/pom.xml index 278dccdc6b2e..175936059945 100644 --- a/services/connecthealth/pom.xml +++ b/services/connecthealth/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT connecthealth AWS Java SDK :: Services :: Connect Health diff --git a/services/connectparticipant/pom.xml b/services/connectparticipant/pom.xml index dc4f22c6f65f..89059d4066ed 100644 --- a/services/connectparticipant/pom.xml +++ b/services/connectparticipant/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT connectparticipant AWS Java SDK :: Services :: ConnectParticipant diff --git a/services/controlcatalog/pom.xml b/services/controlcatalog/pom.xml index da3c503e1880..6c80d57e283c 100644 --- a/services/controlcatalog/pom.xml +++ b/services/controlcatalog/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT controlcatalog AWS Java SDK :: Services :: Control Catalog diff --git a/services/controltower/pom.xml b/services/controltower/pom.xml index a246ffecd3fb..6f4a5068cb9c 100644 --- a/services/controltower/pom.xml +++ b/services/controltower/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT controltower AWS Java SDK :: Services :: Control Tower diff --git a/services/costandusagereport/pom.xml b/services/costandusagereport/pom.xml index 3c9806448311..8760e416ae5e 100644 --- a/services/costandusagereport/pom.xml +++ b/services/costandusagereport/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT costandusagereport AWS Java SDK :: Services :: AWS Cost and Usage Report diff --git a/services/costexplorer/pom.xml b/services/costexplorer/pom.xml index ff0c6bba54fc..2ca44947df9f 100644 --- a/services/costexplorer/pom.xml +++ b/services/costexplorer/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 costexplorer diff --git a/services/costoptimizationhub/pom.xml b/services/costoptimizationhub/pom.xml index f881509daa00..61afcfaf593f 100644 --- a/services/costoptimizationhub/pom.xml +++ b/services/costoptimizationhub/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT costoptimizationhub AWS Java SDK :: Services :: Cost Optimization Hub diff --git a/services/customerprofiles/pom.xml b/services/customerprofiles/pom.xml index 58f8764a89ad..5c6c2eb13a8e 100644 --- a/services/customerprofiles/pom.xml +++ b/services/customerprofiles/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT customerprofiles AWS Java SDK :: Services :: Customer Profiles diff --git a/services/databasemigration/pom.xml b/services/databasemigration/pom.xml index 8c97a648f6f4..95e5c934bafa 100644 --- a/services/databasemigration/pom.xml +++ b/services/databasemigration/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT databasemigration AWS Java SDK :: Services :: AWS Database Migration Service diff --git a/services/databrew/pom.xml b/services/databrew/pom.xml index d96e7eaef286..637938ae67c6 100644 --- a/services/databrew/pom.xml +++ b/services/databrew/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT databrew AWS Java SDK :: Services :: Data Brew diff --git a/services/dataexchange/pom.xml b/services/dataexchange/pom.xml index b77f030cfe82..1098b9554ea5 100644 --- a/services/dataexchange/pom.xml +++ b/services/dataexchange/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT dataexchange AWS Java SDK :: Services :: DataExchange diff --git a/services/datapipeline/pom.xml b/services/datapipeline/pom.xml index edf399cdfe83..24a02f4e917f 100644 --- a/services/datapipeline/pom.xml +++ b/services/datapipeline/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT datapipeline AWS Java SDK :: Services :: AWS Data Pipeline diff --git a/services/datasync/pom.xml b/services/datasync/pom.xml index 027c254cd537..e71fe73023ec 100644 --- a/services/datasync/pom.xml +++ b/services/datasync/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT datasync AWS Java SDK :: Services :: DataSync diff --git a/services/datazone/pom.xml b/services/datazone/pom.xml index 81e48d15e593..2bb4a1577fe2 100644 --- a/services/datazone/pom.xml +++ b/services/datazone/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT datazone AWS Java SDK :: Services :: Data Zone diff --git a/services/dax/pom.xml b/services/dax/pom.xml index 1d09559a51f0..11c04ccdfaad 100644 --- a/services/dax/pom.xml +++ b/services/dax/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT dax AWS Java SDK :: Services :: Amazon DynamoDB Accelerator (DAX) diff --git a/services/deadline/pom.xml b/services/deadline/pom.xml index 397f8f4959b5..d55182750e02 100644 --- a/services/deadline/pom.xml +++ b/services/deadline/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT deadline AWS Java SDK :: Services :: Deadline diff --git a/services/detective/pom.xml b/services/detective/pom.xml index 3b991fa97ecf..a71164320ed5 100644 --- a/services/detective/pom.xml +++ b/services/detective/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT detective AWS Java SDK :: Services :: Detective diff --git a/services/devicefarm/pom.xml b/services/devicefarm/pom.xml index d4870bf12c56..6a4321d6dcdd 100644 --- a/services/devicefarm/pom.xml +++ b/services/devicefarm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT devicefarm AWS Java SDK :: Services :: AWS Device Farm diff --git a/services/devopsagent/pom.xml b/services/devopsagent/pom.xml index 70e8d2ba6f3f..79aeda3457d4 100644 --- a/services/devopsagent/pom.xml +++ b/services/devopsagent/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT devopsagent AWS Java SDK :: Services :: Dev Ops Agent diff --git a/services/devopsguru/pom.xml b/services/devopsguru/pom.xml index bb2cc8c16fee..224d6b06ac75 100644 --- a/services/devopsguru/pom.xml +++ b/services/devopsguru/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT devopsguru AWS Java SDK :: Services :: Dev Ops Guru diff --git a/services/directconnect/pom.xml b/services/directconnect/pom.xml index 1b40e456ff7a..bf462369364d 100644 --- a/services/directconnect/pom.xml +++ b/services/directconnect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT directconnect AWS Java SDK :: Services :: AWS Direct Connect diff --git a/services/directory/pom.xml b/services/directory/pom.xml index ca5f9c264390..06fd7ec80c4e 100644 --- a/services/directory/pom.xml +++ b/services/directory/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT directory AWS Java SDK :: Services :: AWS Directory Service diff --git a/services/directoryservicedata/pom.xml b/services/directoryservicedata/pom.xml index 435a13ac7312..309aeabcf6c7 100644 --- a/services/directoryservicedata/pom.xml +++ b/services/directoryservicedata/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT directoryservicedata AWS Java SDK :: Services :: Directory Service Data diff --git a/services/dlm/pom.xml b/services/dlm/pom.xml index 67e3b02ae2d3..a2bb3f457964 100644 --- a/services/dlm/pom.xml +++ b/services/dlm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT dlm AWS Java SDK :: Services :: DLM diff --git a/services/docdb/pom.xml b/services/docdb/pom.xml index 56d35cd3250e..53bf5e1530ac 100644 --- a/services/docdb/pom.xml +++ b/services/docdb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT docdb AWS Java SDK :: Services :: DocDB diff --git a/services/docdbelastic/pom.xml b/services/docdbelastic/pom.xml index 4f12c5395230..c4309f3e89a6 100644 --- a/services/docdbelastic/pom.xml +++ b/services/docdbelastic/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT docdbelastic AWS Java SDK :: Services :: Doc DB Elastic diff --git a/services/drs/pom.xml b/services/drs/pom.xml index 9fad8ff9070c..daf1aa3a9406 100644 --- a/services/drs/pom.xml +++ b/services/drs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT drs AWS Java SDK :: Services :: Drs diff --git a/services/dsql/pom.xml b/services/dsql/pom.xml index ae7985d374b8..4dd5e7f8d806 100644 --- a/services/dsql/pom.xml +++ b/services/dsql/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT dsql AWS Java SDK :: Services :: DSQL diff --git a/services/dynamodb/pom.xml b/services/dynamodb/pom.xml index 1b6e1089603b..a25a486d317b 100644 --- a/services/dynamodb/pom.xml +++ b/services/dynamodb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT dynamodb AWS Java SDK :: Services :: Amazon DynamoDB diff --git a/services/ebs/pom.xml b/services/ebs/pom.xml index 3cac7ddc62c8..f873ee7f9267 100644 --- a/services/ebs/pom.xml +++ b/services/ebs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ebs AWS Java SDK :: Services :: EBS diff --git a/services/ec2/pom.xml b/services/ec2/pom.xml index a2fed70368d0..5b047658ab4c 100644 --- a/services/ec2/pom.xml +++ b/services/ec2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ec2 AWS Java SDK :: Services :: Amazon EC2 diff --git a/services/ec2instanceconnect/pom.xml b/services/ec2instanceconnect/pom.xml index 228e25ae83aa..7340bf7c005f 100644 --- a/services/ec2instanceconnect/pom.xml +++ b/services/ec2instanceconnect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ec2instanceconnect AWS Java SDK :: Services :: EC2 Instance Connect diff --git a/services/ecr/pom.xml b/services/ecr/pom.xml index 0b204ce964f7..d9024c29a3dc 100644 --- a/services/ecr/pom.xml +++ b/services/ecr/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ecr AWS Java SDK :: Services :: Amazon EC2 Container Registry diff --git a/services/ecrpublic/pom.xml b/services/ecrpublic/pom.xml index b7b3119392b1..146887b7f13e 100644 --- a/services/ecrpublic/pom.xml +++ b/services/ecrpublic/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ecrpublic AWS Java SDK :: Services :: ECR PUBLIC diff --git a/services/ecs/pom.xml b/services/ecs/pom.xml index b07feb7d8553..b1bd6c0ba0e3 100644 --- a/services/ecs/pom.xml +++ b/services/ecs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ecs AWS Java SDK :: Services :: Amazon EC2 Container Service diff --git a/services/efs/pom.xml b/services/efs/pom.xml index 401ccc5913c2..100dc76234b2 100644 --- a/services/efs/pom.xml +++ b/services/efs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT efs AWS Java SDK :: Services :: Amazon Elastic File System diff --git a/services/eks/pom.xml b/services/eks/pom.xml index 895fe56b45a3..426eb9692072 100644 --- a/services/eks/pom.xml +++ b/services/eks/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT eks AWS Java SDK :: Services :: EKS diff --git a/services/eksauth/pom.xml b/services/eksauth/pom.xml index 45daed5f8318..8c529408d0de 100644 --- a/services/eksauth/pom.xml +++ b/services/eksauth/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT eksauth AWS Java SDK :: Services :: EKS Auth diff --git a/services/elasticache/pom.xml b/services/elasticache/pom.xml index 08b682cbe281..f7866aa09862 100644 --- a/services/elasticache/pom.xml +++ b/services/elasticache/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT elasticache AWS Java SDK :: Services :: Amazon ElastiCache diff --git a/services/elasticbeanstalk/pom.xml b/services/elasticbeanstalk/pom.xml index cb67c4c6e97b..ba7586524480 100644 --- a/services/elasticbeanstalk/pom.xml +++ b/services/elasticbeanstalk/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT elasticbeanstalk AWS Java SDK :: Services :: AWS Elastic Beanstalk diff --git a/services/elasticloadbalancing/pom.xml b/services/elasticloadbalancing/pom.xml index b7581522be78..c4baca076e53 100644 --- a/services/elasticloadbalancing/pom.xml +++ b/services/elasticloadbalancing/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT elasticloadbalancing AWS Java SDK :: Services :: Elastic Load Balancing diff --git a/services/elasticloadbalancingv2/pom.xml b/services/elasticloadbalancingv2/pom.xml index eef8536b41af..9066c3e6e329 100644 --- a/services/elasticloadbalancingv2/pom.xml +++ b/services/elasticloadbalancingv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT elasticloadbalancingv2 AWS Java SDK :: Services :: Elastic Load Balancing V2 diff --git a/services/elasticsearch/pom.xml b/services/elasticsearch/pom.xml index 817fe50dd60b..508896097ae0 100644 --- a/services/elasticsearch/pom.xml +++ b/services/elasticsearch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT elasticsearch AWS Java SDK :: Services :: Amazon Elasticsearch Service diff --git a/services/elementalinference/pom.xml b/services/elementalinference/pom.xml index f0b0f2380bf7..c24e91c9a371 100644 --- a/services/elementalinference/pom.xml +++ b/services/elementalinference/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT elementalinference AWS Java SDK :: Services :: Elemental Inference diff --git a/services/emr/pom.xml b/services/emr/pom.xml index 2d2894393421..ed64e50516a5 100644 --- a/services/emr/pom.xml +++ b/services/emr/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT emr AWS Java SDK :: Services :: Amazon EMR diff --git a/services/emrcontainers/pom.xml b/services/emrcontainers/pom.xml index 2bf6e28db71c..c0f2c240ad93 100644 --- a/services/emrcontainers/pom.xml +++ b/services/emrcontainers/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT emrcontainers AWS Java SDK :: Services :: EMR Containers diff --git a/services/emrserverless/pom.xml b/services/emrserverless/pom.xml index fc64ec4643fa..043a9323782c 100644 --- a/services/emrserverless/pom.xml +++ b/services/emrserverless/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT emrserverless AWS Java SDK :: Services :: EMR Serverless diff --git a/services/entityresolution/pom.xml b/services/entityresolution/pom.xml index cd7dc56ccfbf..5e8a71c00050 100644 --- a/services/entityresolution/pom.xml +++ b/services/entityresolution/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT entityresolution AWS Java SDK :: Services :: Entity Resolution diff --git a/services/eventbridge/pom.xml b/services/eventbridge/pom.xml index ccda19efce4f..e353fdef0557 100644 --- a/services/eventbridge/pom.xml +++ b/services/eventbridge/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT eventbridge AWS Java SDK :: Services :: EventBridge diff --git a/services/evs/pom.xml b/services/evs/pom.xml index 6c2ac5539514..e7e53c4f0997 100644 --- a/services/evs/pom.xml +++ b/services/evs/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT evs AWS Java SDK :: Services :: Evs diff --git a/services/finspace/pom.xml b/services/finspace/pom.xml index 89fff1a88290..00bd9dc539cb 100644 --- a/services/finspace/pom.xml +++ b/services/finspace/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT finspace AWS Java SDK :: Services :: Finspace diff --git a/services/finspacedata/pom.xml b/services/finspacedata/pom.xml index 9f2aae58a3b2..cf19ed49cbfc 100644 --- a/services/finspacedata/pom.xml +++ b/services/finspacedata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT finspacedata AWS Java SDK :: Services :: Finspace Data diff --git a/services/firehose/pom.xml b/services/firehose/pom.xml index d695b7f0f285..fbccb4597f10 100644 --- a/services/firehose/pom.xml +++ b/services/firehose/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT firehose AWS Java SDK :: Services :: Amazon Kinesis Firehose diff --git a/services/fis/pom.xml b/services/fis/pom.xml index ee9d3cb89e5b..8714f7851cad 100644 --- a/services/fis/pom.xml +++ b/services/fis/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT fis AWS Java SDK :: Services :: Fis diff --git a/services/fms/pom.xml b/services/fms/pom.xml index 4c8e7c66fd67..37c3db029a14 100644 --- a/services/fms/pom.xml +++ b/services/fms/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT fms AWS Java SDK :: Services :: FMS diff --git a/services/forecast/pom.xml b/services/forecast/pom.xml index d5534d446a93..f84baaa10574 100644 --- a/services/forecast/pom.xml +++ b/services/forecast/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT forecast AWS Java SDK :: Services :: Forecast diff --git a/services/forecastquery/pom.xml b/services/forecastquery/pom.xml index 7f04d704db29..71661e3dd3b4 100644 --- a/services/forecastquery/pom.xml +++ b/services/forecastquery/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT forecastquery AWS Java SDK :: Services :: Forecastquery diff --git a/services/frauddetector/pom.xml b/services/frauddetector/pom.xml index d94c33d11d5b..801563a6d43f 100644 --- a/services/frauddetector/pom.xml +++ b/services/frauddetector/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT frauddetector AWS Java SDK :: Services :: FraudDetector diff --git a/services/freetier/pom.xml b/services/freetier/pom.xml index 6bf9e1accde6..bc4ded5f51f8 100644 --- a/services/freetier/pom.xml +++ b/services/freetier/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT freetier AWS Java SDK :: Services :: Free Tier diff --git a/services/fsx/pom.xml b/services/fsx/pom.xml index 0e964c5dc703..af3a7b51addd 100644 --- a/services/fsx/pom.xml +++ b/services/fsx/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT fsx AWS Java SDK :: Services :: FSx diff --git a/services/gamelift/pom.xml b/services/gamelift/pom.xml index d4b9a3b84e4c..b6cfd19fb031 100644 --- a/services/gamelift/pom.xml +++ b/services/gamelift/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT gamelift AWS Java SDK :: Services :: AWS GameLift diff --git a/services/gameliftstreams/pom.xml b/services/gameliftstreams/pom.xml index 75aab848506e..3792bc22118e 100644 --- a/services/gameliftstreams/pom.xml +++ b/services/gameliftstreams/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT gameliftstreams AWS Java SDK :: Services :: Game Lift Streams diff --git a/services/geomaps/pom.xml b/services/geomaps/pom.xml index 0df0b00ceb1d..7490cc749262 100644 --- a/services/geomaps/pom.xml +++ b/services/geomaps/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT geomaps AWS Java SDK :: Services :: Geo Maps diff --git a/services/geoplaces/pom.xml b/services/geoplaces/pom.xml index 075d9bd6e8f8..82862b24a133 100644 --- a/services/geoplaces/pom.xml +++ b/services/geoplaces/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT geoplaces AWS Java SDK :: Services :: Geo Places diff --git a/services/georoutes/pom.xml b/services/georoutes/pom.xml index 68505bfbfca1..edb66ee0e28e 100644 --- a/services/georoutes/pom.xml +++ b/services/georoutes/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT georoutes AWS Java SDK :: Services :: Geo Routes diff --git a/services/glacier/pom.xml b/services/glacier/pom.xml index 1e094684a7ca..da3b098c4ba0 100644 --- a/services/glacier/pom.xml +++ b/services/glacier/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT glacier AWS Java SDK :: Services :: Amazon Glacier diff --git a/services/globalaccelerator/pom.xml b/services/globalaccelerator/pom.xml index ba7eb56188a5..71af6e5abb82 100644 --- a/services/globalaccelerator/pom.xml +++ b/services/globalaccelerator/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT globalaccelerator AWS Java SDK :: Services :: Global Accelerator diff --git a/services/glue/pom.xml b/services/glue/pom.xml index 711e32b74893..f0499ad1506c 100644 --- a/services/glue/pom.xml +++ b/services/glue/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 glue diff --git a/services/grafana/pom.xml b/services/grafana/pom.xml index b03fe93190c1..af348d326443 100644 --- a/services/grafana/pom.xml +++ b/services/grafana/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT grafana AWS Java SDK :: Services :: Grafana diff --git a/services/greengrass/pom.xml b/services/greengrass/pom.xml index 581470d258b3..a920b3d60774 100644 --- a/services/greengrass/pom.xml +++ b/services/greengrass/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT greengrass AWS Java SDK :: Services :: AWS Greengrass diff --git a/services/greengrassv2/pom.xml b/services/greengrassv2/pom.xml index f73d3945feab..f4fd92fd64f6 100644 --- a/services/greengrassv2/pom.xml +++ b/services/greengrassv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT greengrassv2 AWS Java SDK :: Services :: Greengrass V2 diff --git a/services/groundstation/pom.xml b/services/groundstation/pom.xml index 14978076e70c..17a9152e74ce 100644 --- a/services/groundstation/pom.xml +++ b/services/groundstation/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT groundstation AWS Java SDK :: Services :: GroundStation diff --git a/services/guardduty/pom.xml b/services/guardduty/pom.xml index 822ca17e9f74..4844be7e75be 100644 --- a/services/guardduty/pom.xml +++ b/services/guardduty/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 guardduty diff --git a/services/health/pom.xml b/services/health/pom.xml index 7b062ccffb30..8c66e9e0008a 100644 --- a/services/health/pom.xml +++ b/services/health/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT health AWS Java SDK :: Services :: AWS Health APIs and Notifications diff --git a/services/healthlake/pom.xml b/services/healthlake/pom.xml index edbae7f3b60b..062284e54a3b 100644 --- a/services/healthlake/pom.xml +++ b/services/healthlake/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT healthlake AWS Java SDK :: Services :: Health Lake diff --git a/services/iam/pom.xml b/services/iam/pom.xml index e8c4998ff75c..a8a5e2007023 100644 --- a/services/iam/pom.xml +++ b/services/iam/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT iam AWS Java SDK :: Services :: AWS IAM diff --git a/services/identitystore/pom.xml b/services/identitystore/pom.xml index 5468a6f14c27..aa5bc7cd50a0 100644 --- a/services/identitystore/pom.xml +++ b/services/identitystore/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT identitystore AWS Java SDK :: Services :: Identitystore diff --git a/services/imagebuilder/pom.xml b/services/imagebuilder/pom.xml index da890e827a33..180cb3979093 100644 --- a/services/imagebuilder/pom.xml +++ b/services/imagebuilder/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT imagebuilder AWS Java SDK :: Services :: Imagebuilder diff --git a/services/inspector/pom.xml b/services/inspector/pom.xml index a1c0614cdc8c..ec7f1ba8c16d 100644 --- a/services/inspector/pom.xml +++ b/services/inspector/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT inspector AWS Java SDK :: Services :: Amazon Inspector Service diff --git a/services/inspector2/pom.xml b/services/inspector2/pom.xml index 243518066943..7059a4b70770 100644 --- a/services/inspector2/pom.xml +++ b/services/inspector2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT inspector2 AWS Java SDK :: Services :: Inspector2 diff --git a/services/inspectorscan/pom.xml b/services/inspectorscan/pom.xml index 063013f4b924..536f15340ce5 100644 --- a/services/inspectorscan/pom.xml +++ b/services/inspectorscan/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT inspectorscan AWS Java SDK :: Services :: Inspector Scan diff --git a/services/interconnect/pom.xml b/services/interconnect/pom.xml index 2beaecb3d5d0..d414e6a994a6 100644 --- a/services/interconnect/pom.xml +++ b/services/interconnect/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT interconnect AWS Java SDK :: Services :: Interconnect diff --git a/services/internetmonitor/pom.xml b/services/internetmonitor/pom.xml index 30735251ea97..aafb7cae25cd 100644 --- a/services/internetmonitor/pom.xml +++ b/services/internetmonitor/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT internetmonitor AWS Java SDK :: Services :: Internet Monitor diff --git a/services/invoicing/pom.xml b/services/invoicing/pom.xml index fdb0156729e5..9b330528dc16 100644 --- a/services/invoicing/pom.xml +++ b/services/invoicing/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT invoicing AWS Java SDK :: Services :: Invoicing diff --git a/services/iot/pom.xml b/services/iot/pom.xml index b9718e17225a..4434b6f4cc22 100644 --- a/services/iot/pom.xml +++ b/services/iot/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT iot AWS Java SDK :: Services :: AWS IoT diff --git a/services/iotdataplane/pom.xml b/services/iotdataplane/pom.xml index d3e58eff3d01..b67c51013824 100644 --- a/services/iotdataplane/pom.xml +++ b/services/iotdataplane/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT iotdataplane AWS Java SDK :: Services :: AWS IoT Data Plane diff --git a/services/iotdeviceadvisor/pom.xml b/services/iotdeviceadvisor/pom.xml index ff05a7db06f9..dfbf571557f2 100644 --- a/services/iotdeviceadvisor/pom.xml +++ b/services/iotdeviceadvisor/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT iotdeviceadvisor AWS Java SDK :: Services :: Iot Device Advisor diff --git a/services/iotevents/pom.xml b/services/iotevents/pom.xml index 815b1a6a832c..4227f3c89b51 100644 --- a/services/iotevents/pom.xml +++ b/services/iotevents/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT iotevents AWS Java SDK :: Services :: IoT Events diff --git a/services/ioteventsdata/pom.xml b/services/ioteventsdata/pom.xml index d801fd055b5f..a8faea636d30 100644 --- a/services/ioteventsdata/pom.xml +++ b/services/ioteventsdata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ioteventsdata AWS Java SDK :: Services :: IoT Events Data diff --git a/services/iotfleetwise/pom.xml b/services/iotfleetwise/pom.xml index b1ad638e61e2..150e538a438b 100644 --- a/services/iotfleetwise/pom.xml +++ b/services/iotfleetwise/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT iotfleetwise AWS Java SDK :: Services :: Io T Fleet Wise diff --git a/services/iotjobsdataplane/pom.xml b/services/iotjobsdataplane/pom.xml index cfdfaf2b29f0..b9ae06e0eb20 100644 --- a/services/iotjobsdataplane/pom.xml +++ b/services/iotjobsdataplane/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT iotjobsdataplane AWS Java SDK :: Services :: IoT Jobs Data Plane diff --git a/services/iotmanagedintegrations/pom.xml b/services/iotmanagedintegrations/pom.xml index d8a3f757b658..55c2660dd2d4 100644 --- a/services/iotmanagedintegrations/pom.xml +++ b/services/iotmanagedintegrations/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT iotmanagedintegrations AWS Java SDK :: Services :: IoT Managed Integrations diff --git a/services/iotsecuretunneling/pom.xml b/services/iotsecuretunneling/pom.xml index 87393161c639..273c84a51b5c 100644 --- a/services/iotsecuretunneling/pom.xml +++ b/services/iotsecuretunneling/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT iotsecuretunneling AWS Java SDK :: Services :: IoTSecureTunneling diff --git a/services/iotsitewise/pom.xml b/services/iotsitewise/pom.xml index 5d3d40776dbf..1eafe0c64870 100644 --- a/services/iotsitewise/pom.xml +++ b/services/iotsitewise/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT iotsitewise AWS Java SDK :: Services :: Io T Site Wise diff --git a/services/iotthingsgraph/pom.xml b/services/iotthingsgraph/pom.xml index e2a802e27ea6..9856d09ebd61 100644 --- a/services/iotthingsgraph/pom.xml +++ b/services/iotthingsgraph/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT iotthingsgraph AWS Java SDK :: Services :: IoTThingsGraph diff --git a/services/iottwinmaker/pom.xml b/services/iottwinmaker/pom.xml index 0c05b8d34472..64414f3e6ac0 100644 --- a/services/iottwinmaker/pom.xml +++ b/services/iottwinmaker/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT iottwinmaker AWS Java SDK :: Services :: Io T Twin Maker diff --git a/services/iotwireless/pom.xml b/services/iotwireless/pom.xml index ca992779da74..ee62bec38028 100644 --- a/services/iotwireless/pom.xml +++ b/services/iotwireless/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT iotwireless AWS Java SDK :: Services :: IoT Wireless diff --git a/services/ivs/pom.xml b/services/ivs/pom.xml index 81264de1840d..6085d91cfdc8 100644 --- a/services/ivs/pom.xml +++ b/services/ivs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ivs AWS Java SDK :: Services :: Ivs diff --git a/services/ivschat/pom.xml b/services/ivschat/pom.xml index c0cee4bcaa4b..ad7b56ed63c0 100644 --- a/services/ivschat/pom.xml +++ b/services/ivschat/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ivschat AWS Java SDK :: Services :: Ivschat diff --git a/services/ivsrealtime/pom.xml b/services/ivsrealtime/pom.xml index ea6563bbc069..0cbbcc7b5c8b 100644 --- a/services/ivsrealtime/pom.xml +++ b/services/ivsrealtime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ivsrealtime AWS Java SDK :: Services :: IVS Real Time diff --git a/services/kafka/pom.xml b/services/kafka/pom.xml index 88780336ab4d..3f729664e15e 100644 --- a/services/kafka/pom.xml +++ b/services/kafka/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT kafka AWS Java SDK :: Services :: Kafka diff --git a/services/kafkaconnect/pom.xml b/services/kafkaconnect/pom.xml index fb9301bb774f..08bd1601d91a 100644 --- a/services/kafkaconnect/pom.xml +++ b/services/kafkaconnect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT kafkaconnect AWS Java SDK :: Services :: Kafka Connect diff --git a/services/kendra/pom.xml b/services/kendra/pom.xml index dd267ef0a10a..fed716a59e28 100644 --- a/services/kendra/pom.xml +++ b/services/kendra/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT kendra AWS Java SDK :: Services :: Kendra diff --git a/services/kendraranking/pom.xml b/services/kendraranking/pom.xml index 050b0644841a..dd8442e36060 100644 --- a/services/kendraranking/pom.xml +++ b/services/kendraranking/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT kendraranking AWS Java SDK :: Services :: Kendra Ranking diff --git a/services/keyspaces/pom.xml b/services/keyspaces/pom.xml index 8dba68236e2c..88f53b8534fa 100644 --- a/services/keyspaces/pom.xml +++ b/services/keyspaces/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT keyspaces AWS Java SDK :: Services :: Keyspaces diff --git a/services/keyspacesstreams/pom.xml b/services/keyspacesstreams/pom.xml index 252d9d9fe503..275fc5c57868 100644 --- a/services/keyspacesstreams/pom.xml +++ b/services/keyspacesstreams/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT keyspacesstreams AWS Java SDK :: Services :: Keyspaces Streams diff --git a/services/kinesis/pom.xml b/services/kinesis/pom.xml index 8b50641ba8d2..899bf625812b 100644 --- a/services/kinesis/pom.xml +++ b/services/kinesis/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT kinesis AWS Java SDK :: Services :: Amazon Kinesis diff --git a/services/kinesisanalytics/pom.xml b/services/kinesisanalytics/pom.xml index f567deeaf244..525f44784194 100644 --- a/services/kinesisanalytics/pom.xml +++ b/services/kinesisanalytics/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT kinesisanalytics AWS Java SDK :: Services :: Amazon Kinesis Analytics diff --git a/services/kinesisanalyticsv2/pom.xml b/services/kinesisanalyticsv2/pom.xml index ebc565c281c5..c96d39c9b741 100644 --- a/services/kinesisanalyticsv2/pom.xml +++ b/services/kinesisanalyticsv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT kinesisanalyticsv2 AWS Java SDK :: Services :: Kinesis Analytics V2 diff --git a/services/kinesisvideo/pom.xml b/services/kinesisvideo/pom.xml index d5c93be0a831..671fc7f9d6e4 100644 --- a/services/kinesisvideo/pom.xml +++ b/services/kinesisvideo/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 kinesisvideo diff --git a/services/kinesisvideoarchivedmedia/pom.xml b/services/kinesisvideoarchivedmedia/pom.xml index 7c029425eb2f..7bdc0c09b8b7 100644 --- a/services/kinesisvideoarchivedmedia/pom.xml +++ b/services/kinesisvideoarchivedmedia/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT kinesisvideoarchivedmedia AWS Java SDK :: Services :: Kinesis Video Archived Media diff --git a/services/kinesisvideomedia/pom.xml b/services/kinesisvideomedia/pom.xml index 820643b68a57..361aaadea823 100644 --- a/services/kinesisvideomedia/pom.xml +++ b/services/kinesisvideomedia/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT kinesisvideomedia AWS Java SDK :: Services :: Kinesis Video Media diff --git a/services/kinesisvideosignaling/pom.xml b/services/kinesisvideosignaling/pom.xml index bc16a86e5819..63da58db164a 100644 --- a/services/kinesisvideosignaling/pom.xml +++ b/services/kinesisvideosignaling/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT kinesisvideosignaling AWS Java SDK :: Services :: Kinesis Video Signaling diff --git a/services/kinesisvideowebrtcstorage/pom.xml b/services/kinesisvideowebrtcstorage/pom.xml index 2875347ea3d5..04aed3eb8220 100644 --- a/services/kinesisvideowebrtcstorage/pom.xml +++ b/services/kinesisvideowebrtcstorage/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT kinesisvideowebrtcstorage AWS Java SDK :: Services :: Kinesis Video Web RTC Storage diff --git a/services/kms/pom.xml b/services/kms/pom.xml index 394e3451ae45..c1f3782010cf 100644 --- a/services/kms/pom.xml +++ b/services/kms/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT kms AWS Java SDK :: Services :: AWS KMS diff --git a/services/lakeformation/pom.xml b/services/lakeformation/pom.xml index 8acebfd7a622..f1f5223121a4 100644 --- a/services/lakeformation/pom.xml +++ b/services/lakeformation/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT lakeformation AWS Java SDK :: Services :: LakeFormation diff --git a/services/lambda/pom.xml b/services/lambda/pom.xml index 359a48ccd3e1..3b0eb9fb0b46 100644 --- a/services/lambda/pom.xml +++ b/services/lambda/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT lambda AWS Java SDK :: Services :: AWS Lambda diff --git a/services/launchwizard/pom.xml b/services/launchwizard/pom.xml index 16a26297a4d8..5f0d890f603b 100644 --- a/services/launchwizard/pom.xml +++ b/services/launchwizard/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT launchwizard AWS Java SDK :: Services :: Launch Wizard diff --git a/services/lexmodelbuilding/pom.xml b/services/lexmodelbuilding/pom.xml index a962d81928d4..7639daf8a3f2 100644 --- a/services/lexmodelbuilding/pom.xml +++ b/services/lexmodelbuilding/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT lexmodelbuilding AWS Java SDK :: Services :: Amazon Lex Model Building diff --git a/services/lexmodelsv2/pom.xml b/services/lexmodelsv2/pom.xml index 88d649dbb807..1a5135dd973c 100644 --- a/services/lexmodelsv2/pom.xml +++ b/services/lexmodelsv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT lexmodelsv2 AWS Java SDK :: Services :: Lex Models V2 diff --git a/services/lexruntime/pom.xml b/services/lexruntime/pom.xml index a6cc07d4f854..f32b2cc54ff4 100644 --- a/services/lexruntime/pom.xml +++ b/services/lexruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT lexruntime AWS Java SDK :: Services :: Amazon Lex Runtime diff --git a/services/lexruntimev2/pom.xml b/services/lexruntimev2/pom.xml index 84233304af96..079a7017dd17 100644 --- a/services/lexruntimev2/pom.xml +++ b/services/lexruntimev2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT lexruntimev2 AWS Java SDK :: Services :: Lex Runtime V2 diff --git a/services/licensemanager/pom.xml b/services/licensemanager/pom.xml index 4f726429985c..f15eb1899e92 100644 --- a/services/licensemanager/pom.xml +++ b/services/licensemanager/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT licensemanager AWS Java SDK :: Services :: License Manager diff --git a/services/licensemanagerlinuxsubscriptions/pom.xml b/services/licensemanagerlinuxsubscriptions/pom.xml index fd195dfc40f1..c5c6787a070e 100644 --- a/services/licensemanagerlinuxsubscriptions/pom.xml +++ b/services/licensemanagerlinuxsubscriptions/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT licensemanagerlinuxsubscriptions AWS Java SDK :: Services :: License Manager Linux Subscriptions diff --git a/services/licensemanagerusersubscriptions/pom.xml b/services/licensemanagerusersubscriptions/pom.xml index 25369b7a0ef7..047fe3ee5041 100644 --- a/services/licensemanagerusersubscriptions/pom.xml +++ b/services/licensemanagerusersubscriptions/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT licensemanagerusersubscriptions AWS Java SDK :: Services :: License Manager User Subscriptions diff --git a/services/lightsail/pom.xml b/services/lightsail/pom.xml index 03020576b463..8b76fb6fb229 100644 --- a/services/lightsail/pom.xml +++ b/services/lightsail/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT lightsail AWS Java SDK :: Services :: Amazon Lightsail diff --git a/services/location/pom.xml b/services/location/pom.xml index 631a15e82ece..0c220491a48d 100644 --- a/services/location/pom.xml +++ b/services/location/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT location AWS Java SDK :: Services :: Location diff --git a/services/lookoutequipment/pom.xml b/services/lookoutequipment/pom.xml index 749683668e9e..d0dc73826076 100644 --- a/services/lookoutequipment/pom.xml +++ b/services/lookoutequipment/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT lookoutequipment AWS Java SDK :: Services :: Lookout Equipment diff --git a/services/m2/pom.xml b/services/m2/pom.xml index ef56fcc6fe62..472136af3799 100644 --- a/services/m2/pom.xml +++ b/services/m2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT m2 AWS Java SDK :: Services :: M2 diff --git a/services/machinelearning/pom.xml b/services/machinelearning/pom.xml index be9c5abd2593..0b688e7d12f1 100644 --- a/services/machinelearning/pom.xml +++ b/services/machinelearning/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT machinelearning AWS Java SDK :: Services :: Amazon Machine Learning diff --git a/services/macie2/pom.xml b/services/macie2/pom.xml index 450e239968c9..698ea727d70d 100644 --- a/services/macie2/pom.xml +++ b/services/macie2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT macie2 AWS Java SDK :: Services :: Macie2 diff --git a/services/mailmanager/pom.xml b/services/mailmanager/pom.xml index 8dc111ba40ab..dff4975eeca9 100644 --- a/services/mailmanager/pom.xml +++ b/services/mailmanager/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT mailmanager AWS Java SDK :: Services :: Mail Manager diff --git a/services/managedblockchain/pom.xml b/services/managedblockchain/pom.xml index 8377f06fdb94..40d994c5df1c 100644 --- a/services/managedblockchain/pom.xml +++ b/services/managedblockchain/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT managedblockchain AWS Java SDK :: Services :: ManagedBlockchain diff --git a/services/managedblockchainquery/pom.xml b/services/managedblockchainquery/pom.xml index 1d192ca996d1..f100cbac33a4 100644 --- a/services/managedblockchainquery/pom.xml +++ b/services/managedblockchainquery/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT managedblockchainquery AWS Java SDK :: Services :: Managed Blockchain Query diff --git a/services/marketplaceagreement/pom.xml b/services/marketplaceagreement/pom.xml index 256940cf7014..fe6c7aad960f 100644 --- a/services/marketplaceagreement/pom.xml +++ b/services/marketplaceagreement/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT marketplaceagreement AWS Java SDK :: Services :: Marketplace Agreement diff --git a/services/marketplacecatalog/pom.xml b/services/marketplacecatalog/pom.xml index 845bc5d561fd..e214fd0f426b 100644 --- a/services/marketplacecatalog/pom.xml +++ b/services/marketplacecatalog/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT marketplacecatalog AWS Java SDK :: Services :: Marketplace Catalog diff --git a/services/marketplacecommerceanalytics/pom.xml b/services/marketplacecommerceanalytics/pom.xml index 6aa9329d7926..3d5138d62d7f 100644 --- a/services/marketplacecommerceanalytics/pom.xml +++ b/services/marketplacecommerceanalytics/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT marketplacecommerceanalytics AWS Java SDK :: Services :: AWS Marketplace Commerce Analytics diff --git a/services/marketplacedeployment/pom.xml b/services/marketplacedeployment/pom.xml index 12fd4bbbfd24..5daa977bcded 100644 --- a/services/marketplacedeployment/pom.xml +++ b/services/marketplacedeployment/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT marketplacedeployment AWS Java SDK :: Services :: Marketplace Deployment diff --git a/services/marketplacediscovery/pom.xml b/services/marketplacediscovery/pom.xml index f3daecd3bec4..5391122b82bd 100644 --- a/services/marketplacediscovery/pom.xml +++ b/services/marketplacediscovery/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT marketplacediscovery AWS Java SDK :: Services :: Marketplace Discovery diff --git a/services/marketplaceentitlement/pom.xml b/services/marketplaceentitlement/pom.xml index 4bc815ec505b..2f51541c74b9 100644 --- a/services/marketplaceentitlement/pom.xml +++ b/services/marketplaceentitlement/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT marketplaceentitlement AWS Java SDK :: Services :: AWS Marketplace Entitlement diff --git a/services/marketplacemetering/pom.xml b/services/marketplacemetering/pom.xml index 2972d8c3da8b..d11d9be2931e 100644 --- a/services/marketplacemetering/pom.xml +++ b/services/marketplacemetering/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT marketplacemetering AWS Java SDK :: Services :: AWS Marketplace Metering Service diff --git a/services/marketplacereporting/pom.xml b/services/marketplacereporting/pom.xml index dd71dda02a0c..a61e9321fa57 100644 --- a/services/marketplacereporting/pom.xml +++ b/services/marketplacereporting/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT marketplacereporting AWS Java SDK :: Services :: Marketplace Reporting diff --git a/services/mediaconnect/pom.xml b/services/mediaconnect/pom.xml index 08a9f9d90a1a..0fc25a7189da 100644 --- a/services/mediaconnect/pom.xml +++ b/services/mediaconnect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT mediaconnect AWS Java SDK :: Services :: MediaConnect diff --git a/services/mediaconvert/pom.xml b/services/mediaconvert/pom.xml index 293cd5fe558c..1bc635a6bc3c 100644 --- a/services/mediaconvert/pom.xml +++ b/services/mediaconvert/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 mediaconvert diff --git a/services/medialive/pom.xml b/services/medialive/pom.xml index 4306b4144b0c..d9574f346cea 100644 --- a/services/medialive/pom.xml +++ b/services/medialive/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 medialive diff --git a/services/mediapackage/pom.xml b/services/mediapackage/pom.xml index 78b5bba99541..b343a09a0222 100644 --- a/services/mediapackage/pom.xml +++ b/services/mediapackage/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 mediapackage diff --git a/services/mediapackagev2/pom.xml b/services/mediapackagev2/pom.xml index 60419c410371..03dfaa675d89 100644 --- a/services/mediapackagev2/pom.xml +++ b/services/mediapackagev2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT mediapackagev2 AWS Java SDK :: Services :: Media Package V2 diff --git a/services/mediapackagevod/pom.xml b/services/mediapackagevod/pom.xml index 4f666ebf1793..1897ea6d46fe 100644 --- a/services/mediapackagevod/pom.xml +++ b/services/mediapackagevod/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT mediapackagevod AWS Java SDK :: Services :: MediaPackage Vod diff --git a/services/mediastore/pom.xml b/services/mediastore/pom.xml index c5fc83fb971d..379dec2bd473 100644 --- a/services/mediastore/pom.xml +++ b/services/mediastore/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 mediastore diff --git a/services/mediastoredata/pom.xml b/services/mediastoredata/pom.xml index 6679c01fa620..96500d11c41e 100644 --- a/services/mediastoredata/pom.xml +++ b/services/mediastoredata/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 mediastoredata diff --git a/services/mediatailor/pom.xml b/services/mediatailor/pom.xml index a2ed4266baa5..9d00a0c46efa 100644 --- a/services/mediatailor/pom.xml +++ b/services/mediatailor/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT mediatailor AWS Java SDK :: Services :: MediaTailor diff --git a/services/medicalimaging/pom.xml b/services/medicalimaging/pom.xml index d6a75906899b..25cf9f2b500e 100644 --- a/services/medicalimaging/pom.xml +++ b/services/medicalimaging/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT medicalimaging AWS Java SDK :: Services :: Medical Imaging diff --git a/services/memorydb/pom.xml b/services/memorydb/pom.xml index 532234744d78..059924ec8601 100644 --- a/services/memorydb/pom.xml +++ b/services/memorydb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT memorydb AWS Java SDK :: Services :: Memory DB diff --git a/services/mgn/pom.xml b/services/mgn/pom.xml index 16b718929246..0d4fd35d313e 100644 --- a/services/mgn/pom.xml +++ b/services/mgn/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT mgn AWS Java SDK :: Services :: Mgn diff --git a/services/migrationhub/pom.xml b/services/migrationhub/pom.xml index b5037eb6a9da..20940b69dc61 100644 --- a/services/migrationhub/pom.xml +++ b/services/migrationhub/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 migrationhub diff --git a/services/migrationhubconfig/pom.xml b/services/migrationhubconfig/pom.xml index e33a90fe21e1..634aed73555a 100644 --- a/services/migrationhubconfig/pom.xml +++ b/services/migrationhubconfig/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT migrationhubconfig AWS Java SDK :: Services :: MigrationHub Config diff --git a/services/migrationhuborchestrator/pom.xml b/services/migrationhuborchestrator/pom.xml index 364f9e9fa3c4..8ea1b280289e 100644 --- a/services/migrationhuborchestrator/pom.xml +++ b/services/migrationhuborchestrator/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT migrationhuborchestrator AWS Java SDK :: Services :: Migration Hub Orchestrator diff --git a/services/migrationhubrefactorspaces/pom.xml b/services/migrationhubrefactorspaces/pom.xml index 5d474f27e22a..583eb8198e99 100644 --- a/services/migrationhubrefactorspaces/pom.xml +++ b/services/migrationhubrefactorspaces/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT migrationhubrefactorspaces AWS Java SDK :: Services :: Migration Hub Refactor Spaces diff --git a/services/migrationhubstrategy/pom.xml b/services/migrationhubstrategy/pom.xml index 9907e27e78be..f8af8e74fe75 100644 --- a/services/migrationhubstrategy/pom.xml +++ b/services/migrationhubstrategy/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT migrationhubstrategy AWS Java SDK :: Services :: Migration Hub Strategy diff --git a/services/mpa/pom.xml b/services/mpa/pom.xml index 62ad59221a5f..9b452409f844 100644 --- a/services/mpa/pom.xml +++ b/services/mpa/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT mpa AWS Java SDK :: Services :: MPA diff --git a/services/mq/pom.xml b/services/mq/pom.xml index e424d8971dc3..976b30b78778 100644 --- a/services/mq/pom.xml +++ b/services/mq/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 mq diff --git a/services/mturk/pom.xml b/services/mturk/pom.xml index 003f17a8d055..c187ebefb4e5 100644 --- a/services/mturk/pom.xml +++ b/services/mturk/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT mturk AWS Java SDK :: Services :: Amazon Mechanical Turk Requester diff --git a/services/mwaa/pom.xml b/services/mwaa/pom.xml index d610b7082f1f..508ad85164b5 100644 --- a/services/mwaa/pom.xml +++ b/services/mwaa/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT mwaa AWS Java SDK :: Services :: MWAA diff --git a/services/mwaaserverless/pom.xml b/services/mwaaserverless/pom.xml index 3ae096c5eef1..17430f69a1ae 100644 --- a/services/mwaaserverless/pom.xml +++ b/services/mwaaserverless/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT mwaaserverless AWS Java SDK :: Services :: MWAA Serverless diff --git a/services/neptune/pom.xml b/services/neptune/pom.xml index 46be4da6eca1..2e9fa74ac5ad 100644 --- a/services/neptune/pom.xml +++ b/services/neptune/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT neptune AWS Java SDK :: Services :: Neptune diff --git a/services/neptunedata/pom.xml b/services/neptunedata/pom.xml index e8cf8fa3a6a8..24121eaf2116 100644 --- a/services/neptunedata/pom.xml +++ b/services/neptunedata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT neptunedata AWS Java SDK :: Services :: Neptunedata diff --git a/services/neptunegraph/pom.xml b/services/neptunegraph/pom.xml index 7bee466d2ef3..8055b258fc27 100644 --- a/services/neptunegraph/pom.xml +++ b/services/neptunegraph/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT neptunegraph AWS Java SDK :: Services :: Neptune Graph diff --git a/services/networkfirewall/pom.xml b/services/networkfirewall/pom.xml index e4e3bd5c4d46..d3f9ac547e06 100644 --- a/services/networkfirewall/pom.xml +++ b/services/networkfirewall/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT networkfirewall AWS Java SDK :: Services :: Network Firewall diff --git a/services/networkflowmonitor/pom.xml b/services/networkflowmonitor/pom.xml index c5716851ede0..96333bfaeaea 100644 --- a/services/networkflowmonitor/pom.xml +++ b/services/networkflowmonitor/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT networkflowmonitor AWS Java SDK :: Services :: Network Flow Monitor diff --git a/services/networkmanager/pom.xml b/services/networkmanager/pom.xml index 69dfbba1a3e9..db82c2399448 100644 --- a/services/networkmanager/pom.xml +++ b/services/networkmanager/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT networkmanager AWS Java SDK :: Services :: NetworkManager diff --git a/services/networkmonitor/pom.xml b/services/networkmonitor/pom.xml index 99a2dd636aad..5a96ccb021f2 100644 --- a/services/networkmonitor/pom.xml +++ b/services/networkmonitor/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT networkmonitor AWS Java SDK :: Services :: Network Monitor diff --git a/services/notifications/pom.xml b/services/notifications/pom.xml index fdda7bd6cd3e..f2153af3a716 100644 --- a/services/notifications/pom.xml +++ b/services/notifications/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT notifications AWS Java SDK :: Services :: Notifications diff --git a/services/notificationscontacts/pom.xml b/services/notificationscontacts/pom.xml index 155a5404fc60..28d24f32c8ae 100644 --- a/services/notificationscontacts/pom.xml +++ b/services/notificationscontacts/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT notificationscontacts AWS Java SDK :: Services :: Notifications Contacts diff --git a/services/novaact/pom.xml b/services/novaact/pom.xml index c48970f8f822..f807868ca885 100644 --- a/services/novaact/pom.xml +++ b/services/novaact/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT novaact AWS Java SDK :: Services :: Nova Act diff --git a/services/oam/pom.xml b/services/oam/pom.xml index 34553cee3b4b..1e780ff0ee06 100644 --- a/services/oam/pom.xml +++ b/services/oam/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT oam AWS Java SDK :: Services :: OAM diff --git a/services/observabilityadmin/pom.xml b/services/observabilityadmin/pom.xml index 216d49e40d6c..f301c7fec5cb 100644 --- a/services/observabilityadmin/pom.xml +++ b/services/observabilityadmin/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT observabilityadmin AWS Java SDK :: Services :: Observability Admin diff --git a/services/odb/pom.xml b/services/odb/pom.xml index 4504cc7bbe8d..1ef3603c48eb 100644 --- a/services/odb/pom.xml +++ b/services/odb/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT odb AWS Java SDK :: Services :: Odb diff --git a/services/omics/pom.xml b/services/omics/pom.xml index 8effcf02af28..305c6b5bc94a 100644 --- a/services/omics/pom.xml +++ b/services/omics/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT omics AWS Java SDK :: Services :: Omics diff --git a/services/opensearch/pom.xml b/services/opensearch/pom.xml index 5a1912dfd3c4..f0ae32a26b2e 100644 --- a/services/opensearch/pom.xml +++ b/services/opensearch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT opensearch AWS Java SDK :: Services :: Open Search diff --git a/services/opensearchserverless/pom.xml b/services/opensearchserverless/pom.xml index 92143bdf108b..718a3c33e502 100644 --- a/services/opensearchserverless/pom.xml +++ b/services/opensearchserverless/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT opensearchserverless AWS Java SDK :: Services :: Open Search Serverless diff --git a/services/organizations/pom.xml b/services/organizations/pom.xml index 4dd7b5f525d2..17a390c1c359 100644 --- a/services/organizations/pom.xml +++ b/services/organizations/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT organizations AWS Java SDK :: Services :: AWS Organizations diff --git a/services/osis/pom.xml b/services/osis/pom.xml index 35388e882a3c..48460876fa8a 100644 --- a/services/osis/pom.xml +++ b/services/osis/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT osis AWS Java SDK :: Services :: OSIS diff --git a/services/outposts/pom.xml b/services/outposts/pom.xml index 7756fa70f594..564c9805ce88 100644 --- a/services/outposts/pom.xml +++ b/services/outposts/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT outposts AWS Java SDK :: Services :: Outposts diff --git a/services/panorama/pom.xml b/services/panorama/pom.xml index 96c6a399fbdb..f680131facef 100644 --- a/services/panorama/pom.xml +++ b/services/panorama/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT panorama AWS Java SDK :: Services :: Panorama diff --git a/services/partnercentralaccount/pom.xml b/services/partnercentralaccount/pom.xml index 4831df84b593..e6a61e6b1622 100644 --- a/services/partnercentralaccount/pom.xml +++ b/services/partnercentralaccount/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT partnercentralaccount AWS Java SDK :: Services :: Partner Central Account diff --git a/services/partnercentralbenefits/pom.xml b/services/partnercentralbenefits/pom.xml index 3f61306c64ff..137d9a7c692b 100644 --- a/services/partnercentralbenefits/pom.xml +++ b/services/partnercentralbenefits/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT partnercentralbenefits AWS Java SDK :: Services :: Partner Central Benefits diff --git a/services/partnercentralchannel/pom.xml b/services/partnercentralchannel/pom.xml index fb073e8f2bb4..56e259bc1808 100644 --- a/services/partnercentralchannel/pom.xml +++ b/services/partnercentralchannel/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT partnercentralchannel AWS Java SDK :: Services :: Partner Central Channel diff --git a/services/partnercentralselling/pom.xml b/services/partnercentralselling/pom.xml index d81c89011e6c..9220df61755c 100644 --- a/services/partnercentralselling/pom.xml +++ b/services/partnercentralselling/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT partnercentralselling AWS Java SDK :: Services :: Partner Central Selling diff --git a/services/paymentcryptography/pom.xml b/services/paymentcryptography/pom.xml index 47a4bdb1ce78..c64b9f260d33 100644 --- a/services/paymentcryptography/pom.xml +++ b/services/paymentcryptography/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT paymentcryptography AWS Java SDK :: Services :: Payment Cryptography diff --git a/services/paymentcryptographydata/pom.xml b/services/paymentcryptographydata/pom.xml index 2e0dd82702ca..ff4000642798 100644 --- a/services/paymentcryptographydata/pom.xml +++ b/services/paymentcryptographydata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT paymentcryptographydata AWS Java SDK :: Services :: Payment Cryptography Data diff --git a/services/pcaconnectorad/pom.xml b/services/pcaconnectorad/pom.xml index 0f29da00d5d5..0aba41974ef0 100644 --- a/services/pcaconnectorad/pom.xml +++ b/services/pcaconnectorad/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT pcaconnectorad AWS Java SDK :: Services :: Pca Connector Ad diff --git a/services/pcaconnectorscep/pom.xml b/services/pcaconnectorscep/pom.xml index 2f16a4a5ee8c..a880e3003a5d 100644 --- a/services/pcaconnectorscep/pom.xml +++ b/services/pcaconnectorscep/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT pcaconnectorscep AWS Java SDK :: Services :: Pca Connector Scep diff --git a/services/pcs/pom.xml b/services/pcs/pom.xml index aafb5317174c..9655cb9a1872 100644 --- a/services/pcs/pom.xml +++ b/services/pcs/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT pcs AWS Java SDK :: Services :: PCS diff --git a/services/personalize/pom.xml b/services/personalize/pom.xml index 4a0af2adbf98..be0d816c8027 100644 --- a/services/personalize/pom.xml +++ b/services/personalize/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT personalize AWS Java SDK :: Services :: Personalize diff --git a/services/personalizeevents/pom.xml b/services/personalizeevents/pom.xml index 75bface2708a..58ed76ed9d5d 100644 --- a/services/personalizeevents/pom.xml +++ b/services/personalizeevents/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT personalizeevents AWS Java SDK :: Services :: Personalize Events diff --git a/services/personalizeruntime/pom.xml b/services/personalizeruntime/pom.xml index 5f3261e86639..7fa78304dc4b 100644 --- a/services/personalizeruntime/pom.xml +++ b/services/personalizeruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT personalizeruntime AWS Java SDK :: Services :: Personalize Runtime diff --git a/services/pi/pom.xml b/services/pi/pom.xml index 882f098a01a4..063f613ace2b 100644 --- a/services/pi/pom.xml +++ b/services/pi/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT pi AWS Java SDK :: Services :: PI diff --git a/services/pinpoint/pom.xml b/services/pinpoint/pom.xml index 36380d87d11f..410e9afdffa9 100644 --- a/services/pinpoint/pom.xml +++ b/services/pinpoint/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT pinpoint AWS Java SDK :: Services :: Amazon Pinpoint diff --git a/services/pinpointemail/pom.xml b/services/pinpointemail/pom.xml index 1aa1e224edaf..d52d51e30463 100644 --- a/services/pinpointemail/pom.xml +++ b/services/pinpointemail/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT pinpointemail AWS Java SDK :: Services :: Pinpoint Email diff --git a/services/pinpointsmsvoice/pom.xml b/services/pinpointsmsvoice/pom.xml index e9bccc891d40..bfe42eb2ad3e 100644 --- a/services/pinpointsmsvoice/pom.xml +++ b/services/pinpointsmsvoice/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT pinpointsmsvoice AWS Java SDK :: Services :: Pinpoint SMS Voice diff --git a/services/pinpointsmsvoicev2/pom.xml b/services/pinpointsmsvoicev2/pom.xml index 762666dae525..e83d32b23e09 100644 --- a/services/pinpointsmsvoicev2/pom.xml +++ b/services/pinpointsmsvoicev2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT pinpointsmsvoicev2 AWS Java SDK :: Services :: Pinpoint SMS Voice V2 diff --git a/services/pipes/pom.xml b/services/pipes/pom.xml index cfc7bd85d9db..5aa6718afef5 100644 --- a/services/pipes/pom.xml +++ b/services/pipes/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT pipes AWS Java SDK :: Services :: Pipes diff --git a/services/polly/pom.xml b/services/polly/pom.xml index 412c025cdfd7..7288cbb36119 100644 --- a/services/polly/pom.xml +++ b/services/polly/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT polly AWS Java SDK :: Services :: Amazon Polly diff --git a/services/pom.xml b/services/pom.xml index 91ece44cb572..cd1e8f76d199 100644 --- a/services/pom.xml +++ b/services/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT services AWS Java SDK :: Services diff --git a/services/pricing/pom.xml b/services/pricing/pom.xml index 1134f3f1c242..cdacc9542948 100644 --- a/services/pricing/pom.xml +++ b/services/pricing/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 pricing diff --git a/services/proton/pom.xml b/services/proton/pom.xml index 886c41d1b97d..32115faf6693 100644 --- a/services/proton/pom.xml +++ b/services/proton/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT proton AWS Java SDK :: Services :: Proton diff --git a/services/qapps/pom.xml b/services/qapps/pom.xml index 9a739c0f112f..d8ed0e50ca51 100644 --- a/services/qapps/pom.xml +++ b/services/qapps/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT qapps AWS Java SDK :: Services :: Q Apps diff --git a/services/qbusiness/pom.xml b/services/qbusiness/pom.xml index f86f2ccd4e14..eba15b81077e 100644 --- a/services/qbusiness/pom.xml +++ b/services/qbusiness/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT qbusiness AWS Java SDK :: Services :: Q Business diff --git a/services/qconnect/pom.xml b/services/qconnect/pom.xml index 67d20befc8e2..dd6afd11f131 100644 --- a/services/qconnect/pom.xml +++ b/services/qconnect/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT qconnect AWS Java SDK :: Services :: Q Connect diff --git a/services/quicksight/pom.xml b/services/quicksight/pom.xml index 10cebbfe0b17..cf524c903bf0 100644 --- a/services/quicksight/pom.xml +++ b/services/quicksight/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT quicksight AWS Java SDK :: Services :: QuickSight diff --git a/services/ram/pom.xml b/services/ram/pom.xml index 8c24823a5fe2..821439c8f8c8 100644 --- a/services/ram/pom.xml +++ b/services/ram/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ram AWS Java SDK :: Services :: RAM diff --git a/services/rbin/pom.xml b/services/rbin/pom.xml index 489b0c9ea601..466595249abb 100644 --- a/services/rbin/pom.xml +++ b/services/rbin/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT rbin AWS Java SDK :: Services :: Rbin diff --git a/services/rds/pom.xml b/services/rds/pom.xml index 7826b1a9d1c4..1b8cc4f008dd 100644 --- a/services/rds/pom.xml +++ b/services/rds/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT rds AWS Java SDK :: Services :: Amazon RDS diff --git a/services/rdsdata/pom.xml b/services/rdsdata/pom.xml index 0fc59507127b..ad4465f23c98 100644 --- a/services/rdsdata/pom.xml +++ b/services/rdsdata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT rdsdata AWS Java SDK :: Services :: RDS Data diff --git a/services/redshift/pom.xml b/services/redshift/pom.xml index 0baa26d27065..09559f26e6b6 100644 --- a/services/redshift/pom.xml +++ b/services/redshift/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT redshift AWS Java SDK :: Services :: Amazon Redshift diff --git a/services/redshiftdata/pom.xml b/services/redshiftdata/pom.xml index 53dae72432d5..58598c5803e8 100644 --- a/services/redshiftdata/pom.xml +++ b/services/redshiftdata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT redshiftdata AWS Java SDK :: Services :: Redshift Data diff --git a/services/redshiftserverless/pom.xml b/services/redshiftserverless/pom.xml index b2c6659db357..2ba41e7fad62 100644 --- a/services/redshiftserverless/pom.xml +++ b/services/redshiftserverless/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT redshiftserverless AWS Java SDK :: Services :: Redshift Serverless diff --git a/services/rekognition/pom.xml b/services/rekognition/pom.xml index e88be4bcdd3b..1feb1e0fec16 100644 --- a/services/rekognition/pom.xml +++ b/services/rekognition/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT rekognition AWS Java SDK :: Services :: Amazon Rekognition diff --git a/services/repostspace/pom.xml b/services/repostspace/pom.xml index 720385204ec9..ef140068434e 100644 --- a/services/repostspace/pom.xml +++ b/services/repostspace/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT repostspace AWS Java SDK :: Services :: Repostspace diff --git a/services/resiliencehub/pom.xml b/services/resiliencehub/pom.xml index 91542d170b4f..1a2242818124 100644 --- a/services/resiliencehub/pom.xml +++ b/services/resiliencehub/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT resiliencehub AWS Java SDK :: Services :: Resiliencehub diff --git a/services/resourceexplorer2/pom.xml b/services/resourceexplorer2/pom.xml index c768a8cc66d1..60ec6826714f 100644 --- a/services/resourceexplorer2/pom.xml +++ b/services/resourceexplorer2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT resourceexplorer2 AWS Java SDK :: Services :: Resource Explorer 2 diff --git a/services/resourcegroups/pom.xml b/services/resourcegroups/pom.xml index be17c3006e1c..01b2d161fcf6 100644 --- a/services/resourcegroups/pom.xml +++ b/services/resourcegroups/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 resourcegroups diff --git a/services/resourcegroupstaggingapi/pom.xml b/services/resourcegroupstaggingapi/pom.xml index 7421097b2086..161d6c89322b 100644 --- a/services/resourcegroupstaggingapi/pom.xml +++ b/services/resourcegroupstaggingapi/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT resourcegroupstaggingapi AWS Java SDK :: Services :: AWS Resource Groups Tagging API diff --git a/services/rolesanywhere/pom.xml b/services/rolesanywhere/pom.xml index 5edbdc2ec8cf..d6adf81f6b52 100644 --- a/services/rolesanywhere/pom.xml +++ b/services/rolesanywhere/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT rolesanywhere AWS Java SDK :: Services :: Roles Anywhere diff --git a/services/route53/pom.xml b/services/route53/pom.xml index bd8c747dc431..c40d76f2572f 100644 --- a/services/route53/pom.xml +++ b/services/route53/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT route53 AWS Java SDK :: Services :: Amazon Route53 diff --git a/services/route53domains/pom.xml b/services/route53domains/pom.xml index 6d52648686a5..774aef35ae90 100644 --- a/services/route53domains/pom.xml +++ b/services/route53domains/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT route53domains AWS Java SDK :: Services :: Amazon Route53 Domains diff --git a/services/route53globalresolver/pom.xml b/services/route53globalresolver/pom.xml index 08756f3620dd..fb0a8042352e 100644 --- a/services/route53globalresolver/pom.xml +++ b/services/route53globalresolver/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT route53globalresolver AWS Java SDK :: Services :: Route53 Global Resolver diff --git a/services/route53profiles/pom.xml b/services/route53profiles/pom.xml index 35d3f3bf726a..6063cee6e48e 100644 --- a/services/route53profiles/pom.xml +++ b/services/route53profiles/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT route53profiles AWS Java SDK :: Services :: Route53 Profiles diff --git a/services/route53recoverycluster/pom.xml b/services/route53recoverycluster/pom.xml index 15c806243209..be43d66cd669 100644 --- a/services/route53recoverycluster/pom.xml +++ b/services/route53recoverycluster/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT route53recoverycluster AWS Java SDK :: Services :: Route53 Recovery Cluster diff --git a/services/route53recoverycontrolconfig/pom.xml b/services/route53recoverycontrolconfig/pom.xml index 11262cac9549..00d5b5caa3ea 100644 --- a/services/route53recoverycontrolconfig/pom.xml +++ b/services/route53recoverycontrolconfig/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT route53recoverycontrolconfig AWS Java SDK :: Services :: Route53 Recovery Control Config diff --git a/services/route53recoveryreadiness/pom.xml b/services/route53recoveryreadiness/pom.xml index a68cad16282d..7301822a616b 100644 --- a/services/route53recoveryreadiness/pom.xml +++ b/services/route53recoveryreadiness/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT route53recoveryreadiness AWS Java SDK :: Services :: Route53 Recovery Readiness diff --git a/services/route53resolver/pom.xml b/services/route53resolver/pom.xml index 5fa5df02f50f..d3e52853b463 100644 --- a/services/route53resolver/pom.xml +++ b/services/route53resolver/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT route53resolver AWS Java SDK :: Services :: Route53Resolver diff --git a/services/rtbfabric/pom.xml b/services/rtbfabric/pom.xml index 8935e99a0472..39b2c2775e30 100644 --- a/services/rtbfabric/pom.xml +++ b/services/rtbfabric/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT rtbfabric AWS Java SDK :: Services :: RTB Fabric diff --git a/services/rum/pom.xml b/services/rum/pom.xml index bdc40e3c2b0a..af5137f815bb 100644 --- a/services/rum/pom.xml +++ b/services/rum/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT rum AWS Java SDK :: Services :: RUM diff --git a/services/s3/pom.xml b/services/s3/pom.xml index 29b24f92e223..0ca247b64260 100644 --- a/services/s3/pom.xml +++ b/services/s3/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT s3 AWS Java SDK :: Services :: Amazon S3 diff --git a/services/s3control/pom.xml b/services/s3control/pom.xml index 2cd16dae9a97..afe8ca91f80e 100644 --- a/services/s3control/pom.xml +++ b/services/s3control/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT s3control AWS Java SDK :: Services :: Amazon S3 Control diff --git a/services/s3files/pom.xml b/services/s3files/pom.xml index bf557fbd1075..2e2971b04c02 100644 --- a/services/s3files/pom.xml +++ b/services/s3files/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT s3files AWS Java SDK :: Services :: S3 Files diff --git a/services/s3outposts/pom.xml b/services/s3outposts/pom.xml index 7cf017cf95b4..112bd21ad163 100644 --- a/services/s3outposts/pom.xml +++ b/services/s3outposts/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT s3outposts AWS Java SDK :: Services :: S3 Outposts diff --git a/services/s3tables/pom.xml b/services/s3tables/pom.xml index 813ab517c7b5..ad6e0dca69ae 100644 --- a/services/s3tables/pom.xml +++ b/services/s3tables/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT s3tables AWS Java SDK :: Services :: S3 Tables diff --git a/services/s3vectors/pom.xml b/services/s3vectors/pom.xml index 6e8d55bbb9b3..d6a4c28541da 100644 --- a/services/s3vectors/pom.xml +++ b/services/s3vectors/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT s3vectors AWS Java SDK :: Services :: S3 Vectors diff --git a/services/sagemaker/pom.xml b/services/sagemaker/pom.xml index 4003a3f91bdd..281c06e6cd78 100644 --- a/services/sagemaker/pom.xml +++ b/services/sagemaker/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 sagemaker diff --git a/services/sagemakera2iruntime/pom.xml b/services/sagemakera2iruntime/pom.xml index f168834e01ff..a6b7a7799b61 100644 --- a/services/sagemakera2iruntime/pom.xml +++ b/services/sagemakera2iruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sagemakera2iruntime AWS Java SDK :: Services :: SageMaker A2I Runtime diff --git a/services/sagemakeredge/pom.xml b/services/sagemakeredge/pom.xml index c8393656977a..df50ee57281b 100644 --- a/services/sagemakeredge/pom.xml +++ b/services/sagemakeredge/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sagemakeredge AWS Java SDK :: Services :: Sagemaker Edge diff --git a/services/sagemakerfeaturestoreruntime/pom.xml b/services/sagemakerfeaturestoreruntime/pom.xml index 710884e6a450..f0aaac64b368 100644 --- a/services/sagemakerfeaturestoreruntime/pom.xml +++ b/services/sagemakerfeaturestoreruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sagemakerfeaturestoreruntime AWS Java SDK :: Services :: Sage Maker Feature Store Runtime diff --git a/services/sagemakergeospatial/pom.xml b/services/sagemakergeospatial/pom.xml index ceb4c40becfe..15af2cca7456 100644 --- a/services/sagemakergeospatial/pom.xml +++ b/services/sagemakergeospatial/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sagemakergeospatial AWS Java SDK :: Services :: Sage Maker Geospatial diff --git a/services/sagemakermetrics/pom.xml b/services/sagemakermetrics/pom.xml index fe1984881948..ad8683adfb64 100644 --- a/services/sagemakermetrics/pom.xml +++ b/services/sagemakermetrics/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sagemakermetrics AWS Java SDK :: Services :: Sage Maker Metrics diff --git a/services/sagemakerruntime/pom.xml b/services/sagemakerruntime/pom.xml index ef24ee72d313..12bdaba5906a 100644 --- a/services/sagemakerruntime/pom.xml +++ b/services/sagemakerruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sagemakerruntime AWS Java SDK :: Services :: SageMaker Runtime diff --git a/services/sagemakerruntimehttp2/pom.xml b/services/sagemakerruntimehttp2/pom.xml index 6a0eb38e9c60..a2cb35b6058a 100644 --- a/services/sagemakerruntimehttp2/pom.xml +++ b/services/sagemakerruntimehttp2/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sagemakerruntimehttp2 AWS Java SDK :: Services :: Sage Maker Runtime HTTP2 diff --git a/services/savingsplans/pom.xml b/services/savingsplans/pom.xml index 696f88c0149d..7204e6af1ea4 100644 --- a/services/savingsplans/pom.xml +++ b/services/savingsplans/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT savingsplans AWS Java SDK :: Services :: Savingsplans diff --git a/services/scheduler/pom.xml b/services/scheduler/pom.xml index 5ae75756f143..9a6e74875b7a 100644 --- a/services/scheduler/pom.xml +++ b/services/scheduler/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT scheduler AWS Java SDK :: Services :: Scheduler diff --git a/services/schemas/pom.xml b/services/schemas/pom.xml index 156d564153ea..f62641d493f0 100644 --- a/services/schemas/pom.xml +++ b/services/schemas/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT schemas AWS Java SDK :: Services :: Schemas diff --git a/services/secretsmanager/pom.xml b/services/secretsmanager/pom.xml index b8ea30f9cb48..17b5299a55bd 100644 --- a/services/secretsmanager/pom.xml +++ b/services/secretsmanager/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT secretsmanager AWS Java SDK :: Services :: AWS Secrets Manager diff --git a/services/securityagent/pom.xml b/services/securityagent/pom.xml index a348db5e06db..2a00ab79701e 100644 --- a/services/securityagent/pom.xml +++ b/services/securityagent/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT securityagent AWS Java SDK :: Services :: Security Agent diff --git a/services/securityhub/pom.xml b/services/securityhub/pom.xml index 646ffdd44c81..f4777237bcc1 100644 --- a/services/securityhub/pom.xml +++ b/services/securityhub/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT securityhub AWS Java SDK :: Services :: SecurityHub diff --git a/services/securityir/pom.xml b/services/securityir/pom.xml index f919ead38449..06347953bc4e 100644 --- a/services/securityir/pom.xml +++ b/services/securityir/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT securityir AWS Java SDK :: Services :: Security IR diff --git a/services/securitylake/pom.xml b/services/securitylake/pom.xml index 6cfa27f02dbe..0b0bcfcd0862 100644 --- a/services/securitylake/pom.xml +++ b/services/securitylake/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT securitylake AWS Java SDK :: Services :: Security Lake diff --git a/services/serverlessapplicationrepository/pom.xml b/services/serverlessapplicationrepository/pom.xml index b1c2deb9f56b..346866502009 100644 --- a/services/serverlessapplicationrepository/pom.xml +++ b/services/serverlessapplicationrepository/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 serverlessapplicationrepository diff --git a/services/servicecatalog/pom.xml b/services/servicecatalog/pom.xml index c87a9716605b..6b40fcdd44ee 100644 --- a/services/servicecatalog/pom.xml +++ b/services/servicecatalog/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT servicecatalog AWS Java SDK :: Services :: AWS Service Catalog diff --git a/services/servicecatalogappregistry/pom.xml b/services/servicecatalogappregistry/pom.xml index dc333586162f..9212d3db5c22 100644 --- a/services/servicecatalogappregistry/pom.xml +++ b/services/servicecatalogappregistry/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT servicecatalogappregistry AWS Java SDK :: Services :: Service Catalog App Registry diff --git a/services/servicediscovery/pom.xml b/services/servicediscovery/pom.xml index d35f5e7070e4..000470c3a930 100644 --- a/services/servicediscovery/pom.xml +++ b/services/servicediscovery/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 servicediscovery diff --git a/services/servicequotas/pom.xml b/services/servicequotas/pom.xml index b48cc09cf5a2..b65397297086 100644 --- a/services/servicequotas/pom.xml +++ b/services/servicequotas/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT servicequotas AWS Java SDK :: Services :: Service Quotas diff --git a/services/ses/pom.xml b/services/ses/pom.xml index 8c415dac1dee..0848897528bb 100644 --- a/services/ses/pom.xml +++ b/services/ses/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ses AWS Java SDK :: Services :: Amazon SES diff --git a/services/sesv2/pom.xml b/services/sesv2/pom.xml index 612984ae8161..aa3e23e725c6 100644 --- a/services/sesv2/pom.xml +++ b/services/sesv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sesv2 AWS Java SDK :: Services :: SESv2 diff --git a/services/sfn/pom.xml b/services/sfn/pom.xml index 2cbd5ea7a9b2..4e09c5ed9ee3 100644 --- a/services/sfn/pom.xml +++ b/services/sfn/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sfn AWS Java SDK :: Services :: AWS Step Functions diff --git a/services/shield/pom.xml b/services/shield/pom.xml index d24109efbf91..0da71816416c 100644 --- a/services/shield/pom.xml +++ b/services/shield/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT shield AWS Java SDK :: Services :: AWS Shield diff --git a/services/signer/pom.xml b/services/signer/pom.xml index 15ceb3bc63e2..bedbe9fa0321 100644 --- a/services/signer/pom.xml +++ b/services/signer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT signer AWS Java SDK :: Services :: Signer diff --git a/services/signerdata/pom.xml b/services/signerdata/pom.xml index 0ec49f06b5cc..a3c747239558 100644 --- a/services/signerdata/pom.xml +++ b/services/signerdata/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT signerdata AWS Java SDK :: Services :: Signer Data diff --git a/services/signin/pom.xml b/services/signin/pom.xml index 103781d68ac5..542e5f09f3bc 100644 --- a/services/signin/pom.xml +++ b/services/signin/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT signin AWS Java SDK :: Services :: Signin diff --git a/services/simpledbv2/pom.xml b/services/simpledbv2/pom.xml index 3ce54f9f9951..bd79873a494d 100644 --- a/services/simpledbv2/pom.xml +++ b/services/simpledbv2/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT simpledbv2 AWS Java SDK :: Services :: Simple DB V2 diff --git a/services/simspaceweaver/pom.xml b/services/simspaceweaver/pom.xml index 1654802d5d6a..072104aa8a1b 100644 --- a/services/simspaceweaver/pom.xml +++ b/services/simspaceweaver/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT simspaceweaver AWS Java SDK :: Services :: Sim Space Weaver diff --git a/services/snowball/pom.xml b/services/snowball/pom.xml index 0398b1775e5c..8555726757a7 100644 --- a/services/snowball/pom.xml +++ b/services/snowball/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT snowball AWS Java SDK :: Services :: Amazon Snowball diff --git a/services/snowdevicemanagement/pom.xml b/services/snowdevicemanagement/pom.xml index b4c7afb0c1b5..6b29d22d4c45 100644 --- a/services/snowdevicemanagement/pom.xml +++ b/services/snowdevicemanagement/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT snowdevicemanagement AWS Java SDK :: Services :: Snow Device Management diff --git a/services/sns/pom.xml b/services/sns/pom.xml index a03eb650f536..4dff0f423b1e 100644 --- a/services/sns/pom.xml +++ b/services/sns/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sns AWS Java SDK :: Services :: Amazon SNS diff --git a/services/socialmessaging/pom.xml b/services/socialmessaging/pom.xml index ed1e72305008..7e20f18658ce 100644 --- a/services/socialmessaging/pom.xml +++ b/services/socialmessaging/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT socialmessaging AWS Java SDK :: Services :: Social Messaging diff --git a/services/sqs/pom.xml b/services/sqs/pom.xml index 634a16d693dc..f1690290f748 100644 --- a/services/sqs/pom.xml +++ b/services/sqs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sqs AWS Java SDK :: Services :: Amazon SQS diff --git a/services/ssm/pom.xml b/services/ssm/pom.xml index 6ffe7fcbd997..7d86dd77ab83 100644 --- a/services/ssm/pom.xml +++ b/services/ssm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ssm AWS Java SDK :: Services :: AWS Simple Systems Management (SSM) diff --git a/services/ssmcontacts/pom.xml b/services/ssmcontacts/pom.xml index f205ed02d56d..a7f3dd73720c 100644 --- a/services/ssmcontacts/pom.xml +++ b/services/ssmcontacts/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ssmcontacts AWS Java SDK :: Services :: SSM Contacts diff --git a/services/ssmguiconnect/pom.xml b/services/ssmguiconnect/pom.xml index 7a305fb6e83a..9c4a3e19d5f7 100644 --- a/services/ssmguiconnect/pom.xml +++ b/services/ssmguiconnect/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ssmguiconnect AWS Java SDK :: Services :: SSM Gui Connect diff --git a/services/ssmincidents/pom.xml b/services/ssmincidents/pom.xml index 8b6e0fde2a68..f1fbadc55034 100644 --- a/services/ssmincidents/pom.xml +++ b/services/ssmincidents/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ssmincidents AWS Java SDK :: Services :: SSM Incidents diff --git a/services/ssmquicksetup/pom.xml b/services/ssmquicksetup/pom.xml index 94b1363e6951..242a3e10e861 100644 --- a/services/ssmquicksetup/pom.xml +++ b/services/ssmquicksetup/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ssmquicksetup AWS Java SDK :: Services :: SSM Quick Setup diff --git a/services/ssmsap/pom.xml b/services/ssmsap/pom.xml index b0b17e3c8d0c..fbb0b351c24e 100644 --- a/services/ssmsap/pom.xml +++ b/services/ssmsap/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ssmsap AWS Java SDK :: Services :: Ssm Sap diff --git a/services/sso/pom.xml b/services/sso/pom.xml index 77b9c772832c..944f724cbe4b 100644 --- a/services/sso/pom.xml +++ b/services/sso/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sso AWS Java SDK :: Services :: SSO diff --git a/services/ssoadmin/pom.xml b/services/ssoadmin/pom.xml index 04e17806de5b..f5854d821d52 100644 --- a/services/ssoadmin/pom.xml +++ b/services/ssoadmin/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ssoadmin AWS Java SDK :: Services :: SSO Admin diff --git a/services/ssooidc/pom.xml b/services/ssooidc/pom.xml index d63d9d3bef25..d865e427ff86 100644 --- a/services/ssooidc/pom.xml +++ b/services/ssooidc/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ssooidc AWS Java SDK :: Services :: SSO OIDC diff --git a/services/storagegateway/pom.xml b/services/storagegateway/pom.xml index e0236d4cbb89..9a269b763b87 100644 --- a/services/storagegateway/pom.xml +++ b/services/storagegateway/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT storagegateway AWS Java SDK :: Services :: AWS Storage Gateway diff --git a/services/sts/pom.xml b/services/sts/pom.xml index 7b1675e14569..aefd6760fbc6 100644 --- a/services/sts/pom.xml +++ b/services/sts/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sts AWS Java SDK :: Services :: AWS STS diff --git a/services/supplychain/pom.xml b/services/supplychain/pom.xml index bb83b6555192..03b36beab1b0 100644 --- a/services/supplychain/pom.xml +++ b/services/supplychain/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT supplychain AWS Java SDK :: Services :: Supply Chain diff --git a/services/support/pom.xml b/services/support/pom.xml index 0fbcf7655733..427981cec8dc 100644 --- a/services/support/pom.xml +++ b/services/support/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT support AWS Java SDK :: Services :: AWS Support diff --git a/services/supportapp/pom.xml b/services/supportapp/pom.xml index 9f75df420c07..b614c12f540f 100644 --- a/services/supportapp/pom.xml +++ b/services/supportapp/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT supportapp AWS Java SDK :: Services :: Support App diff --git a/services/sustainability/pom.xml b/services/sustainability/pom.xml index cf87080488b2..8280b3c30df0 100644 --- a/services/sustainability/pom.xml +++ b/services/sustainability/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT sustainability AWS Java SDK :: Services :: Sustainability diff --git a/services/swf/pom.xml b/services/swf/pom.xml index e32aa8c058df..5865d56b778a 100644 --- a/services/swf/pom.xml +++ b/services/swf/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT swf AWS Java SDK :: Services :: Amazon SWF diff --git a/services/synthetics/pom.xml b/services/synthetics/pom.xml index 01676ca899e6..9d57de434e05 100644 --- a/services/synthetics/pom.xml +++ b/services/synthetics/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT synthetics AWS Java SDK :: Services :: Synthetics diff --git a/services/taxsettings/pom.xml b/services/taxsettings/pom.xml index 7a9c038dfd58..004d19579c64 100644 --- a/services/taxsettings/pom.xml +++ b/services/taxsettings/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT taxsettings AWS Java SDK :: Services :: Tax Settings diff --git a/services/textract/pom.xml b/services/textract/pom.xml index 88f87295cd59..d05b8e46433c 100644 --- a/services/textract/pom.xml +++ b/services/textract/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT textract AWS Java SDK :: Services :: Textract diff --git a/services/timestreaminfluxdb/pom.xml b/services/timestreaminfluxdb/pom.xml index 0f4e443a57b2..d40328acbca2 100644 --- a/services/timestreaminfluxdb/pom.xml +++ b/services/timestreaminfluxdb/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT timestreaminfluxdb AWS Java SDK :: Services :: Timestream Influx DB diff --git a/services/timestreamquery/pom.xml b/services/timestreamquery/pom.xml index 01de2f85c9ed..66eeb9bb6516 100644 --- a/services/timestreamquery/pom.xml +++ b/services/timestreamquery/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT timestreamquery AWS Java SDK :: Services :: Timestream Query diff --git a/services/timestreamwrite/pom.xml b/services/timestreamwrite/pom.xml index 31a8f6080eee..4f018d34c71c 100644 --- a/services/timestreamwrite/pom.xml +++ b/services/timestreamwrite/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT timestreamwrite AWS Java SDK :: Services :: Timestream Write diff --git a/services/tnb/pom.xml b/services/tnb/pom.xml index 6afbbdee4370..3b4e2a1addb9 100644 --- a/services/tnb/pom.xml +++ b/services/tnb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT tnb AWS Java SDK :: Services :: Tnb diff --git a/services/transcribe/pom.xml b/services/transcribe/pom.xml index 16ca1307ea7f..b69fa90c1697 100644 --- a/services/transcribe/pom.xml +++ b/services/transcribe/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT transcribe AWS Java SDK :: Services :: Transcribe diff --git a/services/transcribestreaming/pom.xml b/services/transcribestreaming/pom.xml index 05bc34fd695d..51fdfc10eff6 100644 --- a/services/transcribestreaming/pom.xml +++ b/services/transcribestreaming/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT transcribestreaming AWS Java SDK :: Services :: AWS Transcribe Streaming diff --git a/services/transfer/pom.xml b/services/transfer/pom.xml index 01ca59c9225a..48dd66b6b20c 100644 --- a/services/transfer/pom.xml +++ b/services/transfer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT transfer AWS Java SDK :: Services :: Transfer diff --git a/services/translate/pom.xml b/services/translate/pom.xml index 6cb5aa9ad65d..849737c82701 100644 --- a/services/translate/pom.xml +++ b/services/translate/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 translate diff --git a/services/trustedadvisor/pom.xml b/services/trustedadvisor/pom.xml index 1270ab779f43..5eb9e0d2d19f 100644 --- a/services/trustedadvisor/pom.xml +++ b/services/trustedadvisor/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT trustedadvisor AWS Java SDK :: Services :: Trusted Advisor diff --git a/services/uxc/pom.xml b/services/uxc/pom.xml index 445f4b3d0a75..1c6181393448 100644 --- a/services/uxc/pom.xml +++ b/services/uxc/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT uxc AWS Java SDK :: Services :: Uxc diff --git a/services/verifiedpermissions/pom.xml b/services/verifiedpermissions/pom.xml index 3818f92a01b3..7035317cde12 100644 --- a/services/verifiedpermissions/pom.xml +++ b/services/verifiedpermissions/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT verifiedpermissions AWS Java SDK :: Services :: Verified Permissions diff --git a/services/voiceid/pom.xml b/services/voiceid/pom.xml index 4f1b02e300b5..4557f4788bbc 100644 --- a/services/voiceid/pom.xml +++ b/services/voiceid/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT voiceid AWS Java SDK :: Services :: Voice ID diff --git a/services/vpclattice/pom.xml b/services/vpclattice/pom.xml index 2b39ab3bc7fc..5b150c25f3dc 100644 --- a/services/vpclattice/pom.xml +++ b/services/vpclattice/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT vpclattice AWS Java SDK :: Services :: VPC Lattice diff --git a/services/waf/pom.xml b/services/waf/pom.xml index f4c14c5982b7..ba44cdd3ce18 100644 --- a/services/waf/pom.xml +++ b/services/waf/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT waf AWS Java SDK :: Services :: AWS WAF diff --git a/services/wafv2/pom.xml b/services/wafv2/pom.xml index e1cccde803eb..a55415c7f241 100644 --- a/services/wafv2/pom.xml +++ b/services/wafv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT wafv2 AWS Java SDK :: Services :: WAFV2 diff --git a/services/wellarchitected/pom.xml b/services/wellarchitected/pom.xml index c62bb52d6e77..3184e0354f34 100644 --- a/services/wellarchitected/pom.xml +++ b/services/wellarchitected/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT wellarchitected AWS Java SDK :: Services :: Well Architected diff --git a/services/wickr/pom.xml b/services/wickr/pom.xml index 01d01553c07e..ae0443c7579f 100644 --- a/services/wickr/pom.xml +++ b/services/wickr/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT wickr AWS Java SDK :: Services :: Wickr diff --git a/services/wisdom/pom.xml b/services/wisdom/pom.xml index d82bcee96b3c..9e0548c1eebe 100644 --- a/services/wisdom/pom.xml +++ b/services/wisdom/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT wisdom AWS Java SDK :: Services :: Wisdom diff --git a/services/workdocs/pom.xml b/services/workdocs/pom.xml index 86d3d06fb15f..91fb4140b212 100644 --- a/services/workdocs/pom.xml +++ b/services/workdocs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT workdocs AWS Java SDK :: Services :: Amazon WorkDocs diff --git a/services/workmail/pom.xml b/services/workmail/pom.xml index 5be427fd1494..f7819933c021 100644 --- a/services/workmail/pom.xml +++ b/services/workmail/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 workmail diff --git a/services/workmailmessageflow/pom.xml b/services/workmailmessageflow/pom.xml index 468e8b60b99a..f92bb9e9633f 100644 --- a/services/workmailmessageflow/pom.xml +++ b/services/workmailmessageflow/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT workmailmessageflow AWS Java SDK :: Services :: WorkMailMessageFlow diff --git a/services/workspaces/pom.xml b/services/workspaces/pom.xml index c43bd858f866..f72bf990c06d 100644 --- a/services/workspaces/pom.xml +++ b/services/workspaces/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT workspaces AWS Java SDK :: Services :: Amazon WorkSpaces diff --git a/services/workspacesinstances/pom.xml b/services/workspacesinstances/pom.xml index 69858c35806f..77302e823597 100644 --- a/services/workspacesinstances/pom.xml +++ b/services/workspacesinstances/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT workspacesinstances AWS Java SDK :: Services :: Workspaces Instances diff --git a/services/workspacesthinclient/pom.xml b/services/workspacesthinclient/pom.xml index 7784b3866f37..2897599d0e8e 100644 --- a/services/workspacesthinclient/pom.xml +++ b/services/workspacesthinclient/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT workspacesthinclient AWS Java SDK :: Services :: Work Spaces Thin Client diff --git a/services/workspacesweb/pom.xml b/services/workspacesweb/pom.xml index 4a61ba1bc23c..7cf73460fab7 100644 --- a/services/workspacesweb/pom.xml +++ b/services/workspacesweb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT workspacesweb AWS Java SDK :: Services :: Work Spaces Web diff --git a/services/xray/pom.xml b/services/xray/pom.xml index ce00d6f31511..a595df72e884 100644 --- a/services/xray/pom.xml +++ b/services/xray/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT xray AWS Java SDK :: Services :: AWS X-Ray diff --git a/test/architecture-tests/pom.xml b/test/architecture-tests/pom.xml index 298d3eb99327..24617ef473b0 100644 --- a/test/architecture-tests/pom.xml +++ b/test/architecture-tests/pom.xml @@ -21,7 +21,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml diff --git a/test/auth-tests/pom.xml b/test/auth-tests/pom.xml index 79ba2247cf85..cadaede9d292 100644 --- a/test/auth-tests/pom.xml +++ b/test/auth-tests/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/bundle-logging-bridge-binding-test/pom.xml b/test/bundle-logging-bridge-binding-test/pom.xml index f902a4f6b817..92817d9adaf9 100644 --- a/test/bundle-logging-bridge-binding-test/pom.xml +++ b/test/bundle-logging-bridge-binding-test/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/bundle-shading-tests/pom.xml b/test/bundle-shading-tests/pom.xml index 6e9e8b7d2aad..b8e0ca4066e4 100644 --- a/test/bundle-shading-tests/pom.xml +++ b/test/bundle-shading-tests/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/codegen-generated-classes-test/pom.xml b/test/codegen-generated-classes-test/pom.xml index 206310967844..d16f0df2ef9a 100644 --- a/test/codegen-generated-classes-test/pom.xml +++ b/test/codegen-generated-classes-test/pom.xml @@ -21,7 +21,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml diff --git a/test/crt-unavailable-tests/pom.xml b/test/crt-unavailable-tests/pom.xml index b5e24ad6df0e..f53c31beee7d 100644 --- a/test/crt-unavailable-tests/pom.xml +++ b/test/crt-unavailable-tests/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/http-client-benchmarks/pom.xml b/test/http-client-benchmarks/pom.xml index 6cee9e6ea020..c42b9a9da4ec 100644 --- a/test/http-client-benchmarks/pom.xml +++ b/test/http-client-benchmarks/pom.xml @@ -19,7 +19,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml diff --git a/test/http-client-tests/pom.xml b/test/http-client-tests/pom.xml index be8637e090bd..0386d6c2bb19 100644 --- a/test/http-client-tests/pom.xml +++ b/test/http-client-tests/pom.xml @@ -21,7 +21,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml http-client-tests diff --git a/test/module-path-tests/pom.xml b/test/module-path-tests/pom.xml index c074edaec980..a8de3c801abf 100644 --- a/test/module-path-tests/pom.xml +++ b/test/module-path-tests/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/old-client-version-compatibility-test/pom.xml b/test/old-client-version-compatibility-test/pom.xml index 35c7db5ed8fb..f3d783d0da73 100644 --- a/test/old-client-version-compatibility-test/pom.xml +++ b/test/old-client-version-compatibility-test/pom.xml @@ -21,7 +21,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml diff --git a/test/protocol-tests-core/pom.xml b/test/protocol-tests-core/pom.xml index 94f3ecd11039..51397df02883 100644 --- a/test/protocol-tests-core/pom.xml +++ b/test/protocol-tests-core/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/protocol-tests/pom.xml b/test/protocol-tests/pom.xml index 7549b736cf50..1b35aa5a2b9b 100644 --- a/test/protocol-tests/pom.xml +++ b/test/protocol-tests/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/region-testing/pom.xml b/test/region-testing/pom.xml index bb87e91b31c4..04b3d931e3b7 100644 --- a/test/region-testing/pom.xml +++ b/test/region-testing/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/ruleset-testing-core/pom.xml b/test/ruleset-testing-core/pom.xml index b188eee95c2a..acfe9399701b 100644 --- a/test/ruleset-testing-core/pom.xml +++ b/test/ruleset-testing-core/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/s3-benchmarks/pom.xml b/test/s3-benchmarks/pom.xml index 171410a035bf..c3c71e8b8747 100644 --- a/test/s3-benchmarks/pom.xml +++ b/test/s3-benchmarks/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/s3-tests/pom.xml b/test/s3-tests/pom.xml index dfac657198f2..fd5ecc2ec10a 100644 --- a/test/s3-tests/pom.xml +++ b/test/s3-tests/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/sdk-benchmarks/pom.xml b/test/sdk-benchmarks/pom.xml index 6ac531ac7a40..92b677ac71ae 100644 --- a/test/sdk-benchmarks/pom.xml +++ b/test/sdk-benchmarks/pom.xml @@ -19,7 +19,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml diff --git a/test/sdk-native-image-test/pom.xml b/test/sdk-native-image-test/pom.xml index e0b5994f3fda..33bfcdb1a13d 100644 --- a/test/sdk-native-image-test/pom.xml +++ b/test/sdk-native-image-test/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/sdk-standard-benchmarks/pom.xml b/test/sdk-standard-benchmarks/pom.xml index 8ed983234f4d..25359e48d93f 100644 --- a/test/sdk-standard-benchmarks/pom.xml +++ b/test/sdk-standard-benchmarks/pom.xml @@ -19,7 +19,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml diff --git a/test/service-test-utils/pom.xml b/test/service-test-utils/pom.xml index cb97e49bf8e9..28169bad66ea 100644 --- a/test/service-test-utils/pom.xml +++ b/test/service-test-utils/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml service-test-utils diff --git a/test/stability-tests/pom.xml b/test/stability-tests/pom.xml index ca7fc4d8dd93..0cdbee11e7e5 100644 --- a/test/stability-tests/pom.xml +++ b/test/stability-tests/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/test-utils/pom.xml b/test/test-utils/pom.xml index 34b4e183f524..1a2248ae7dbd 100644 --- a/test/test-utils/pom.xml +++ b/test/test-utils/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml test-utils diff --git a/test/tests-coverage-reporting/pom.xml b/test/tests-coverage-reporting/pom.xml index 317227256a71..5b8feba7c16b 100644 --- a/test/tests-coverage-reporting/pom.xml +++ b/test/tests-coverage-reporting/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/v2-migration-tests/pom.xml b/test/v2-migration-tests/pom.xml index 26b56a50d01f..a859dbd12a99 100644 --- a/test/v2-migration-tests/pom.xml +++ b/test/v2-migration-tests/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../.. diff --git a/third-party/pom.xml b/third-party/pom.xml index 5739aa13d44a..e546866cd1e5 100644 --- a/third-party/pom.xml +++ b/third-party/pom.xml @@ -21,7 +21,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT third-party diff --git a/third-party/third-party-jackson-core/pom.xml b/third-party/third-party-jackson-core/pom.xml index a4798fc1c633..655b10c023d6 100644 --- a/third-party/third-party-jackson-core/pom.xml +++ b/third-party/third-party-jackson-core/pom.xml @@ -20,7 +20,7 @@ third-party software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/third-party/third-party-jackson-dataformat-cbor/pom.xml b/third-party/third-party-jackson-dataformat-cbor/pom.xml index dd10e9a3fec2..d4eccc3040fa 100644 --- a/third-party/third-party-jackson-dataformat-cbor/pom.xml +++ b/third-party/third-party-jackson-dataformat-cbor/pom.xml @@ -20,7 +20,7 @@ third-party software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/third-party/third-party-slf4j-api/pom.xml b/third-party/third-party-slf4j-api/pom.xml index 15cd56ff80ef..8cf6fd4c4905 100644 --- a/third-party/third-party-slf4j-api/pom.xml +++ b/third-party/third-party-slf4j-api/pom.xml @@ -20,7 +20,7 @@ third-party software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/utils-lite/pom.xml b/utils-lite/pom.xml index bdba282cd2fe..966b36b69ed6 100644 --- a/utils-lite/pom.xml +++ b/utils-lite/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT utils-lite AWS Java SDK :: Utils Lite diff --git a/utils/pom.xml b/utils/pom.xml index 1ae75fc04504..b7a1c7c312ae 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT 4.0.0 diff --git a/v2-migration/pom.xml b/v2-migration/pom.xml index 75df91a8c5d8..e2cc6d2805e7 100644 --- a/v2-migration/pom.xml +++ b/v2-migration/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.43.3-SNAPSHOT + 2.44.0-SNAPSHOT ../pom.xml From 6e459be971f7216d34693399e46045c8a1d14305 Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Thu, 30 Apr 2026 13:06:57 -0700 Subject: [PATCH 16/18] Change retries 2.1 builder param to nullable (#6927) This will allow us to better track opt-in behavior in the UA. --- .../awscore/retry/AwsRetryStrategy.java | 10 +++++----- .../awssdk/retries/AdaptiveRetryStrategy.java | 20 ++++++++++--------- .../awssdk/retries/DefaultRetryStrategy.java | 4 ++-- .../awssdk/retries/StandardRetryStrategy.java | 20 ++++++++++--------- .../DefaultStandardRetryStrategy.java | 14 ++++++++----- 5 files changed, 38 insertions(+), 30 deletions(-) diff --git a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategy.java b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategy.java index 93f9aec6bbc5..ee694dd370f2 100644 --- a/core/aws-core/src/main/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategy.java +++ b/core/aws-core/src/main/java/software/amazon/awssdk/awscore/retry/AwsRetryStrategy.java @@ -82,7 +82,7 @@ public static RetryStrategy forRetryMode(RetryMode mode) { * @param newRetries2026Enabled Whether retries 2.1 behavior is enabled. * @return A retry strategy for the given retry mode. */ - public static RetryStrategy forRetryMode(RetryMode mode, boolean newRetries2026Enabled) { + public static RetryStrategy forRetryMode(RetryMode mode, Boolean newRetries2026Enabled) { switch (mode) { case STANDARD: return standardRetryStrategy(newRetries2026Enabled); @@ -135,7 +135,7 @@ public static StandardRetryStrategy standardRetryStrategy() { * @param newRetries2026Enabled Whether retries 2.1 behavior is enabled. * @return A {@link StandardRetryStrategy} with AWS-specific conditions added. */ - public static StandardRetryStrategy standardRetryStrategy(boolean newRetries2026Enabled) { + public static StandardRetryStrategy standardRetryStrategy(Boolean newRetries2026Enabled) { StandardRetryStrategy.Builder builder = SdkDefaultRetryStrategy.standardRetryStrategyBuilder(newRetries2026Enabled); return configure(builder, newRetries2026Enabled).build(); } @@ -167,7 +167,7 @@ public static AdaptiveRetryStrategy adaptiveRetryStrategy() { * @param newRetries2026Enabled Whether retries 2.1 behavior is enabled. * @return An {@link AdaptiveRetryStrategy} with AWS-specific conditions added. */ - public static AdaptiveRetryStrategy adaptiveRetryStrategy(boolean newRetries2026Enabled) { + public static AdaptiveRetryStrategy adaptiveRetryStrategy(Boolean newRetries2026Enabled) { AdaptiveRetryStrategy.Builder builder = SdkDefaultRetryStrategy.adaptiveRetryStrategyBuilder(newRetries2026Enabled); return configure(builder, newRetries2026Enabled) .build(); @@ -191,9 +191,9 @@ public static AdaptiveRetryStrategy adaptiveRetryStrategy(boolean newRetries2026 * @param The type of the builder extending {@link RetryStrategy.Builder} * @return The given builder */ - private static > T configure(T builder, boolean newRetries2026Enabled) { + private static > T configure(T builder, Boolean newRetries2026Enabled) { builder.retryOnException(AwsRetryStrategy::retryOnAwsRetryableErrors); - if (newRetries2026Enabled) { + if (Boolean.TRUE.equals(newRetries2026Enabled)) { builder.retryOnException(AwsRetryStrategy::isLimitExceededErrorCode); builder.treatAsThrottling(AwsRetryStrategy::treatAsThrottlingV21); } diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/AdaptiveRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/AdaptiveRetryStrategy.java index b398201841bd..d9b6ce7f3c95 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/AdaptiveRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/AdaptiveRetryStrategy.java @@ -71,17 +71,19 @@ static AdaptiveRetryStrategy.Builder builder() { /** * Create a new {@link AdaptiveRetryStrategy.Builder} with v2.0 or v2.1 retry constants. * - * @param retries2026Enabled when {@code true}, uses v2.1 constants (50ms base delay, differentiated token costs); - * when {@code false}, uses v2.0 constants (100ms base delay, uniform token costs) + * @param retries2026Enabled when {@code true}, uses v2.1 constants (50ms base delay, differentiated token costs); when + * {@code false}, uses v2.0 constants (100ms base delay, uniform token costs) */ - static AdaptiveRetryStrategy.Builder builder(boolean retries2026Enabled) { - Duration baseDelay = retries2026Enabled ? DefaultRetryStrategy.Standard.BASE_DELAY_V21 - : DefaultRetryStrategy.Standard.BASE_DELAY_V20; - int exceptionCost = retries2026Enabled ? DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST_V21 - : DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST_V20; + static AdaptiveRetryStrategy.Builder builder(Boolean retries2026Enabled) { + boolean retries21 = Boolean.TRUE.equals(retries2026Enabled); + + Duration baseDelay = retries21 ? DefaultRetryStrategy.Standard.BASE_DELAY_V21 + : DefaultRetryStrategy.Standard.BASE_DELAY_V20; + int exceptionCost = retries21 ? DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST_V21 + : DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST_V20; // v2.0 does not treat throttling exceptions differently from others - int throttlingCost = retries2026Enabled ? DefaultRetryStrategy.Standard.THROTTLING_EXCEPTION_TOKEN_COST_V21 - : exceptionCost; + int throttlingCost = retries21 ? DefaultRetryStrategy.Standard.THROTTLING_EXCEPTION_TOKEN_COST_V21 + : exceptionCost; return DefaultAdaptiveRetryStrategy .builder() .maxAttempts(DefaultRetryStrategy.Adaptive.MAX_ATTEMPTS) diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/DefaultRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/DefaultRetryStrategy.java index 84540992b04c..d39291ada5ce 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/DefaultRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/DefaultRetryStrategy.java @@ -67,7 +67,7 @@ public static StandardRetryStrategy.Builder standardStrategyBuilder() { * * @param retries2026Enabled Whether retries 2.1 behavior is used. */ - public static StandardRetryStrategy.Builder standardStrategyBuilder(boolean retries2026Enabled) { + public static StandardRetryStrategy.Builder standardStrategyBuilder(Boolean retries2026Enabled) { return StandardRetryStrategy.builder(retries2026Enabled); } @@ -117,7 +117,7 @@ public static AdaptiveRetryStrategy.Builder adaptiveStrategyBuilder() { * * @param retries2026Enabled Whether retries 2.1 behavior is used. */ - public static AdaptiveRetryStrategy.Builder adaptiveStrategyBuilder(boolean retries2026Enabled) { + public static AdaptiveRetryStrategy.Builder adaptiveStrategyBuilder(Boolean retries2026Enabled) { return AdaptiveRetryStrategy.builder(retries2026Enabled); } diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/StandardRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/StandardRetryStrategy.java index 7bf0bef22db7..bd5fb50c1c6e 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/StandardRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/StandardRetryStrategy.java @@ -63,17 +63,19 @@ static Builder builder() { /** * Create a new {@link StandardRetryStrategy.Builder} with v2.0 or v2.1 retry constants. * - * @param retries2026Enabled when {@code true}, uses v2.1 constants (50ms base delay, differentiated token costs); - * when {@code false}, uses v2.0 constants (100ms base delay, uniform token costs) + * @param retries2026Enabled when {@code true}, uses v2.1 constants (50ms base delay, differentiated token costs); when + * {@code false}, uses v2.0 constants (100ms base delay, uniform token costs) */ - static Builder builder(boolean retries2026Enabled) { - Duration baseDelay = retries2026Enabled ? DefaultRetryStrategy.Standard.BASE_DELAY_V21 - : DefaultRetryStrategy.Standard.BASE_DELAY_V20; - int exceptionCost = retries2026Enabled ? DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST_V21 - : DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST_V20; + static Builder builder(Boolean retries2026Enabled) { + boolean retries21 = Boolean.TRUE.equals(retries2026Enabled); + + Duration baseDelay = retries21 ? DefaultRetryStrategy.Standard.BASE_DELAY_V21 + : DefaultRetryStrategy.Standard.BASE_DELAY_V20; + int exceptionCost = retries21 ? DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST_V21 + : DefaultRetryStrategy.Standard.DEFAULT_EXCEPTION_TOKEN_COST_V20; // v2.0 does not treat throttling exceptions differently from others - int throttlingCost = retries2026Enabled ? DefaultRetryStrategy.Standard.THROTTLING_EXCEPTION_TOKEN_COST_V21 - : exceptionCost; + int throttlingCost = retries21 ? DefaultRetryStrategy.Standard.THROTTLING_EXCEPTION_TOKEN_COST_V21 + : exceptionCost; return DefaultStandardRetryStrategy .builder() .retries2026Enabled(retries2026Enabled) diff --git a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java index 92b24421b57d..8742bba4a194 100644 --- a/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java +++ b/core/retries/src/main/java/software/amazon/awssdk/retries/internal/DefaultStandardRetryStrategy.java @@ -30,7 +30,7 @@ public final class DefaultStandardRetryStrategy extends BaseRetryStrategy implements StandardRetryStrategy { private static final Logger LOG = Logger.loggerFor(DefaultStandardRetryStrategy.class); private static final Duration FIVE_SECONDS = Duration.ofSeconds(5); - private final boolean retries2026Enabled; + private final Boolean retries2026Enabled; DefaultStandardRetryStrategy(Builder builder) { super(LOG, builder); @@ -48,7 +48,7 @@ public static Builder builder() { @Override protected Duration computeAcquireFailureBackoff(RefreshRetryTokenRequest request) { - if (!retries2026Enabled || !request.isLongPolling()) { + if (!isRetries2026Enabled() || !request.isLongPolling()) { return super.computeAcquireFailureBackoff(request); } @@ -60,7 +60,7 @@ protected Duration computeAcquireFailureBackoff(RefreshRetryTokenRequest request @Override protected Duration computeBackoff(RefreshRetryTokenRequest request, DefaultRetryToken token) { - if (!retries2026Enabled) { + if (!isRetries2026Enabled()) { return super.computeBackoff(request, token); } @@ -90,8 +90,12 @@ protected Duration computeBackoff(RefreshRetryTokenRequest request, DefaultRetry return backoff; } + private boolean isRetries2026Enabled() { + return Boolean.TRUE.equals(retries2026Enabled); + } + public static class Builder extends BaseRetryStrategy.Builder implements StandardRetryStrategy.Builder { - private boolean retries2026Enabled; + private Boolean retries2026Enabled; Builder() { } @@ -160,7 +164,7 @@ public Builder useClientDefaults(boolean useClientDefaults) { /** * Whether retries 2.1 behavior is enabled. */ - public Builder retries2026Enabled(boolean retries2026Enabled) { + public Builder retries2026Enabled(Boolean retries2026Enabled) { this.retries2026Enabled = retries2026Enabled; return this; } From 5db9f3d9ef3c645ee2e4962d26f034ad2c2ad3b1 Mon Sep 17 00:00:00 2001 From: Dongie Agnir <261310+dagnir@users.noreply.github.com> Date: Thu, 30 Apr 2026 14:07:32 -0700 Subject: [PATCH 17/18] Retry on IDPCommunicationError (#6923) This commit adds a fix to STS to retry on IDPCommunicationError. This is implemented as a customization for the retry strategy lookup for the client. This is gated behind the AWS_NEW_RETRIES_2026 flag. --- services/sts/pom.xml | 6 + .../sts/internal/StsRetryStrategy.java | 68 +++++++++++ .../codegen-resources/customization.config | 4 +- .../sts/internal/StsRetryStrategyTest.java | 111 ++++++++++++++++++ 4 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 services/sts/src/main/java/software/amazon/awssdk/services/sts/internal/StsRetryStrategy.java create mode 100644 services/sts/src/test/java/software/amazon/awssdk/services/sts/internal/StsRetryStrategyTest.java diff --git a/services/sts/pom.xml b/services/sts/pom.xml index aefd6760fbc6..cc58373c4151 100644 --- a/services/sts/pom.xml +++ b/services/sts/pom.xml @@ -63,6 +63,12 @@ + + software.amazon.awssdk + retries + ${awsjavasdk.version} + test + iam software.amazon.awssdk diff --git a/services/sts/src/main/java/software/amazon/awssdk/services/sts/internal/StsRetryStrategy.java b/services/sts/src/main/java/software/amazon/awssdk/services/sts/internal/StsRetryStrategy.java new file mode 100644 index 000000000000..f531cb4c94f6 --- /dev/null +++ b/services/sts/src/main/java/software/amazon/awssdk/services/sts/internal/StsRetryStrategy.java @@ -0,0 +1,68 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.services.sts.internal; + +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.awscore.retry.AwsRetryStrategy; +import software.amazon.awssdk.core.client.config.SdkClientConfiguration; +import software.amazon.awssdk.core.client.config.SdkClientOption; +import software.amazon.awssdk.core.retry.NewRetries2026Resolver; +import software.amazon.awssdk.core.retry.RetryMode; +import software.amazon.awssdk.retries.api.RetryStrategy; +import software.amazon.awssdk.services.sts.model.IdpCommunicationErrorException; + +/** + * Specialized retry strategy resolution for STS to enable retrying for {@link IdpCommunicationErrorException}. + */ +@SdkInternalApi +public final class StsRetryStrategy { + + private StsRetryStrategy() { + } + + public static RetryStrategy resolveRetryStrategy(SdkClientConfiguration config) { + RetryStrategy configuredRetryStrategy = config.option(SdkClientOption.RETRY_STRATEGY); + if (configuredRetryStrategy != null) { + return configuredRetryStrategy; + } + + // Just return null and let the normal retry strategy resolution occur + if (!isNewRetries2026Enabled(config)) { + return null; + } + + RetryMode retryMode = resolveRetryMode(config); + + return AwsRetryStrategy.forRetryMode(retryMode, true) + .toBuilder() + .retryOnException(IdpCommunicationErrorException.class) + .build(); + } + + private static RetryMode resolveRetryMode(SdkClientConfiguration config) { + return RetryMode.resolver() + .profileFile(config.option(SdkClientOption.PROFILE_FILE_SUPPLIER)) + .profileName(config.option(SdkClientOption.PROFILE_NAME)) + .defaultRetryMode(config.option(SdkClientOption.DEFAULT_RETRY_MODE)) + .defaultNewRetries2026(config.option(SdkClientOption.DEFAULT_NEW_RETRIES_2026)) + .resolve(); + } + + private static boolean isNewRetries2026Enabled(SdkClientConfiguration config) { + Boolean defaultNewRetries2026 = config.option(SdkClientOption.DEFAULT_NEW_RETRIES_2026); + return new NewRetries2026Resolver().defaultNewRetries2026(defaultNewRetries2026).resolve(); + } +} \ No newline at end of file diff --git a/services/sts/src/main/resources/codegen-resources/customization.config b/services/sts/src/main/resources/codegen-resources/customization.config index a48f004b088a..26879092eaa6 100644 --- a/services/sts/src/main/resources/codegen-resources/customization.config +++ b/services/sts/src/main/resources/codegen-resources/customization.config @@ -21,6 +21,6 @@ "UseGlobalEndpoint with legacy region `us-west-2`": "V2 does not support setting UseGlobalEndpoint. It's regional only/by default" }, - "enableGenerateCompiledEndpointRules": true - + "enableGenerateCompiledEndpointRules": true, + "customRetryStrategy" : "software.amazon.awssdk.services.sts.internal.StsRetryStrategy" } diff --git a/services/sts/src/test/java/software/amazon/awssdk/services/sts/internal/StsRetryStrategyTest.java b/services/sts/src/test/java/software/amazon/awssdk/services/sts/internal/StsRetryStrategyTest.java new file mode 100644 index 000000000000..8535205bf933 --- /dev/null +++ b/services/sts/src/test/java/software/amazon/awssdk/services/sts/internal/StsRetryStrategyTest.java @@ -0,0 +1,111 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.services.sts.internal; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +import java.time.Duration; +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import software.amazon.awssdk.awscore.exception.AwsErrorDetails; +import software.amazon.awssdk.core.SdkSystemSetting; +import software.amazon.awssdk.core.client.config.SdkClientConfiguration; +import software.amazon.awssdk.core.client.config.SdkClientOption; +import software.amazon.awssdk.retries.AdaptiveRetryStrategy; +import software.amazon.awssdk.retries.LegacyRetryStrategy; +import software.amazon.awssdk.retries.StandardRetryStrategy; +import software.amazon.awssdk.retries.api.AcquireInitialTokenRequest; +import software.amazon.awssdk.retries.api.RefreshRetryTokenRequest; +import software.amazon.awssdk.retries.api.RetryStrategy; +import software.amazon.awssdk.retries.api.RetryToken; +import software.amazon.awssdk.services.sts.model.IdpCommunicationErrorException; + +public class StsRetryStrategyTest { + @Test + void resolveRetryStrategy_preexistingStrategy_returnsPreexisting() { + RetryStrategy strategy = mock(RetryStrategy.class); + SdkClientConfiguration config = SdkClientConfiguration.builder() + .option(SdkClientOption.RETRY_STRATEGY, strategy) + .build(); + + assertThat(StsRetryStrategy.resolveRetryStrategy(config)).isSameAs(strategy); + } + + @Test + void resolveRetryStrategy_defaultNewRetries2026False_returnsNull() { + SdkClientConfiguration config = SdkClientConfiguration.builder() + .option(SdkClientOption.DEFAULT_NEW_RETRIES_2026, false) + .build(); + + assertThat(StsRetryStrategy.resolveRetryStrategy(config)).isNull(); + } + + @Test + void resolveRetryStrategy_newRetries2026False_returnsNull() { + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), "false"); + try { + SdkClientConfiguration config = SdkClientConfiguration.builder().build(); + assertThat(StsRetryStrategy.resolveRetryStrategy(config)).isNull(); + } finally { + System.clearProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()); + } + } + + @ParameterizedTest + @MethodSource("retryModeResolutionCases") + void resolveRetryStrategy_returnsCorrectStrategyBasedOnMode(String mode, Class expected) { + System.setProperty(SdkSystemSetting.AWS_RETRY_MODE.property(), mode); + System.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), "true"); + try { + SdkClientConfiguration config = SdkClientConfiguration.builder().build(); + RetryStrategy resolved = StsRetryStrategy.resolveRetryStrategy(config); + assertThat(resolved).isInstanceOf(expected); + assertRetriesOnIdpCommunicationException(resolved); + } finally { + System.clearProperty(SdkSystemSetting.AWS_RETRY_MODE.property()); + System.clearProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property()); + } + } + + void assertRetriesOnIdpCommunicationException(RetryStrategy strategy) { + RetryToken token = strategy.acquireInitialToken(AcquireInitialTokenRequest.create("test")).token(); + + AwsErrorDetails errorDetails = AwsErrorDetails.builder() + .errorCode("IDPCommunicationError") + .build(); + + IdpCommunicationErrorException failure = IdpCommunicationErrorException.builder() + .awsErrorDetails(errorDetails) + .build(); + RefreshRetryTokenRequest refresh = RefreshRetryTokenRequest.builder() + .token(token) + .failure(failure) + .build(); + assertThat(strategy.refreshRetryToken(refresh).delay()).isGreaterThan(Duration.ZERO); + } + + private static Stream retryModeResolutionCases() { + return Stream.of( + Arguments.of("standard", StandardRetryStrategy.class), + Arguments.of("legacy", LegacyRetryStrategy.class), + Arguments.of("adaptive", AdaptiveRetryStrategy.class) + ); + } +} From 412ce7cc822d506231ee5e0dc9747590705319b8 Mon Sep 17 00:00:00 2001 From: Dongie Agnir Date: Thu, 30 Apr 2026 14:31:59 -0700 Subject: [PATCH 18/18] Update changelog --- ...47f8f.json => feature-AWSSDKforJavav2-new-retries-2026.json} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .changes/next-release/{feature-AWSSDKforJavav2-8b47f8f.json => feature-AWSSDKforJavav2-new-retries-2026.json} (65%) diff --git a/.changes/next-release/feature-AWSSDKforJavav2-8b47f8f.json b/.changes/next-release/feature-AWSSDKforJavav2-new-retries-2026.json similarity index 65% rename from .changes/next-release/feature-AWSSDKforJavav2-8b47f8f.json rename to .changes/next-release/feature-AWSSDKforJavav2-new-retries-2026.json index 78b925a87e57..ec4bca3d7b35 100644 --- a/.changes/next-release/feature-AWSSDKforJavav2-8b47f8f.json +++ b/.changes/next-release/feature-AWSSDKforJavav2-new-retries-2026.json @@ -2,5 +2,5 @@ "type": "feature", "category": "AWS SDK for Java v2", "contributor": "", - "description": "Added support for v2.1 retry behavior behind the `AWS_NEW_RETRIES_2026` feature gate. When enabled via environment variable `AWS_NEW_RETRIES_2026=true` or system property `-Daws.newRetries2026=true`, the SDK applies the following changes:\n\n- Uses `STANDARD` as the default retry mode\n- Reduces base backoff delay from 100ms to 50ms\n- Differentiates token costs between transient and throttling errors\n- Honors the `max_attempts` profile property\n- Uses the `x-amz-retry-after` response header for server-suggested delays\n- Retries on `LimitExceededException` as a throttling error\n- Retries on STS `IdpCommunicationErrorException`\n\nExample usage:\n```java\nSystem.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), \"true\");\nDynamoDbClient ddb = DynamoDbClient.create();\n```" + "description": "Added support for v2.1 retry behavior behind the `AWS_NEW_RETRIES_2026` feature gate. When enabled via environment variable `AWS_NEW_RETRIES_2026=true` or system property `-Daws.newRetries2026=true`, the SDK applies the following changes:\n\n- Uses `STANDARD` as the default retry mode\n- Reduces base backoff delay from 100ms to 50ms\n- Differentiates token costs between transient and throttling errors\n- Honors the `max_attempts` profile property\n- Uses the `x-amz-retry-after` response header for server-suggested delays\n- Retries on `LimitExceededException` as a throttling error\n- Retries on STS `IdpCommunicationErrorException`\n- Reduces DynamoDB default max attempts from 9 to 4\n- Backs off before failing long-polling operations (e.g., SQS `ReceiveMessage`) when the retry token bucket is exhausted, instead of failing immediately\n\nExample usage:\n```java\nSystem.setProperty(SdkSystemSetting.AWS_NEW_RETRIES_2026.property(), \"true\");\nDynamoDbClient ddb = DynamoDbClient.create();\n```" }