diff --git a/.changes/next-release/feature-AWSCRTHTTPClient-358f18b.json b/.changes/next-release/feature-AWSCRTHTTPClient-358f18b.json new file mode 100644 index 000000000000..fd2ad9f12633 --- /dev/null +++ b/.changes/next-release/feature-AWSCRTHTTPClient-358f18b.json @@ -0,0 +1,6 @@ +{ + "type": "feature", + "category": "AWS CRT HTTP Client", + "contributor": "", + "description": "Release AWS CRT synchrounouse HTTP client. See [#3343](https://github.com/aws/aws-sdk-java-v2/issues/3343)" +} diff --git a/.changes/next-release/feature-AWSSDKforJavav2-0090bf8.json b/.changes/next-release/feature-AWSSDKforJavav2-0090bf8.json new file mode 100644 index 000000000000..67b27f294b99 --- /dev/null +++ b/.changes/next-release/feature-AWSSDKforJavav2-0090bf8.json @@ -0,0 +1,6 @@ +{ + "type": "feature", + "category": "AWS SDK for Java v2", + "contributor": "", + "description": "If an HTTP client or HTTP client builder is not specified explicitly on the SDK client AND there are multiple HTTP client implementations on the classpath, the SDK will choose the one that has the highest priority instead of throwing exception. ApacheHttpClient and NettyNioAsyncHttpClient have the highest priority in sync and async SDK client respectively for now." +} diff --git a/archetypes/archetype-app-quickstart/pom.xml b/archetypes/archetype-app-quickstart/pom.xml index 84e427b3de82..85e2574b690e 100644 --- a/archetypes/archetype-app-quickstart/pom.xml +++ b/archetypes/archetype-app-quickstart/pom.xml @@ -20,7 +20,7 @@ archetypes software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/archetypes/archetype-lambda/pom.xml b/archetypes/archetype-lambda/pom.xml index 94a13ddf8fb0..924c71547dcf 100644 --- a/archetypes/archetype-lambda/pom.xml +++ b/archetypes/archetype-lambda/pom.xml @@ -20,7 +20,7 @@ archetypes software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 archetype-lambda diff --git a/archetypes/archetype-tools/pom.xml b/archetypes/archetype-tools/pom.xml index dcd34b3b12c7..0d89ffb442e3 100644 --- a/archetypes/archetype-tools/pom.xml +++ b/archetypes/archetype-tools/pom.xml @@ -20,7 +20,7 @@ archetypes software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/archetypes/pom.xml b/archetypes/pom.xml index a90f94621340..b69afb23986a 100644 --- a/archetypes/pom.xml +++ b/archetypes/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 archetypes diff --git a/aws-sdk-java/pom.xml b/aws-sdk-java/pom.xml index 15f610733c6e..72145ebba029 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../pom.xml aws-sdk-java diff --git a/bom-internal/pom.xml b/bom-internal/pom.xml index 192e8984b088..a7751c757917 100644 --- a/bom-internal/pom.xml +++ b/bom-internal/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/bom/pom.xml b/bom/pom.xml index b52e8fc05dcc..a7994b45f6cf 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../pom.xml bom diff --git a/bundle-logging-bridge/pom.xml b/bundle-logging-bridge/pom.xml index 9296fdb79e08..7b72c9fd9a4b 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT bundle-logging-bridge jar diff --git a/bundle-sdk/pom.xml b/bundle-sdk/pom.xml index ff6127f892df..684b99a611e0 100644 --- a/bundle-sdk/pom.xml +++ b/bundle-sdk/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT bundle-sdk jar diff --git a/bundle/pom.xml b/bundle/pom.xml index 731c965c1f6a..35bcf1ed51aa 100644 --- a/bundle/pom.xml +++ b/bundle/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT bundle jar diff --git a/codegen-lite-maven-plugin/pom.xml b/codegen-lite-maven-plugin/pom.xml index 230345c67f4a..92e2655037e6 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../pom.xml codegen-lite-maven-plugin diff --git a/codegen-lite/pom.xml b/codegen-lite/pom.xml index 12a938b5060e..4429834607e5 100644 --- a/codegen-lite/pom.xml +++ b/codegen-lite/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.21.47-SNAPSHOT + 2.22.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 495a67db5d9a..36ccf90c6a07 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../pom.xml codegen-maven-plugin diff --git a/codegen/pom.xml b/codegen/pom.xml index 3e1425bc2996..be28e8a41fb8 100644 --- a/codegen/pom.xml +++ b/codegen/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT codegen AWS Java SDK :: Code Generator diff --git a/core/annotations/pom.xml b/core/annotations/pom.xml index 608f40fc8cc9..1af8960555b2 100644 --- a/core/annotations/pom.xml +++ b/core/annotations/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/core/arns/pom.xml b/core/arns/pom.xml index 3d0d2e9f1ca2..bc62a6d582d8 100644 --- a/core/arns/pom.xml +++ b/core/arns/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/core/auth-crt/pom.xml b/core/auth-crt/pom.xml index cfd44f57e04a..f269ff1dd043 100644 --- a/core/auth-crt/pom.xml +++ b/core/auth-crt/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT auth-crt diff --git a/core/auth/pom.xml b/core/auth/pom.xml index 2222290a6fc2..75369aceda87 100644 --- a/core/auth/pom.xml +++ b/core/auth/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT auth diff --git a/core/aws-core/pom.xml b/core/aws-core/pom.xml index e5d18b7f8f54..7e1489edab4c 100644 --- a/core/aws-core/pom.xml +++ b/core/aws-core/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT aws-core diff --git a/core/checksums-spi/pom.xml b/core/checksums-spi/pom.xml index a42aa79af886..3fa240b21c36 100644 --- a/core/checksums-spi/pom.xml +++ b/core/checksums-spi/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT checksums-spi diff --git a/core/checksums/pom.xml b/core/checksums/pom.xml index bce1f01312df..ffebb9191988 100644 --- a/core/checksums/pom.xml +++ b/core/checksums/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT checksums diff --git a/core/crt-core/pom.xml b/core/crt-core/pom.xml index 90e21828da6a..8fec83cb4a6d 100644 --- a/core/crt-core/pom.xml +++ b/core/crt-core/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk core - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT crt-core diff --git a/core/endpoints-spi/pom.xml b/core/endpoints-spi/pom.xml index 78de28cee4c9..f99f7ebe66fc 100644 --- a/core/endpoints-spi/pom.xml +++ b/core/endpoints-spi/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/core/http-auth-aws-crt/pom.xml b/core/http-auth-aws-crt/pom.xml index fac8315524b9..ca230bf49171 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.21.47-SNAPSHOT + 2.22.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 5021de91be92..85ba569db1ac 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT http-auth-aws-eventstream diff --git a/core/http-auth-aws/pom.xml b/core/http-auth-aws/pom.xml index 139a2d55924e..079644e31f66 100644 --- a/core/http-auth-aws/pom.xml +++ b/core/http-auth-aws/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT http-auth-aws diff --git a/core/http-auth-spi/pom.xml b/core/http-auth-spi/pom.xml index 8266116bd666..4da454f2ed1f 100644 --- a/core/http-auth-spi/pom.xml +++ b/core/http-auth-spi/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT http-auth-spi diff --git a/core/http-auth/pom.xml b/core/http-auth/pom.xml index 37b2c58d00da..015a644490ad 100644 --- a/core/http-auth/pom.xml +++ b/core/http-auth/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT http-auth diff --git a/core/identity-spi/pom.xml b/core/identity-spi/pom.xml index 786739fd8113..3ea63ff635dd 100644 --- a/core/identity-spi/pom.xml +++ b/core/identity-spi/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT identity-spi diff --git a/core/imds/pom.xml b/core/imds/pom.xml index e187575f5a23..db76d3388716 100644 --- a/core/imds/pom.xml +++ b/core/imds/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 imds diff --git a/core/json-utils/pom.xml b/core/json-utils/pom.xml index b55ce3772f59..4e26f92ded4e 100644 --- a/core/json-utils/pom.xml +++ b/core/json-utils/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/core/metrics-spi/pom.xml b/core/metrics-spi/pom.xml index 6367086be57e..eb5734f80333 100644 --- a/core/metrics-spi/pom.xml +++ b/core/metrics-spi/pom.xml @@ -5,7 +5,7 @@ core software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/core/pom.xml b/core/pom.xml index ed417149c5df..87070c49f980 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -21,7 +21,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT core diff --git a/core/profiles/pom.xml b/core/profiles/pom.xml index 73355ee106fb..4d2e746c2297 100644 --- a/core/profiles/pom.xml +++ b/core/profiles/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT profiles diff --git a/core/protocols/aws-cbor-protocol/pom.xml b/core/protocols/aws-cbor-protocol/pom.xml index ae4af753f892..406e4db281bb 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/core/protocols/aws-json-protocol/pom.xml b/core/protocols/aws-json-protocol/pom.xml index 283092d79e62..be726059d51d 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/core/protocols/aws-query-protocol/pom.xml b/core/protocols/aws-query-protocol/pom.xml index 135748728985..338fb77f0154 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/core/protocols/aws-xml-protocol/pom.xml b/core/protocols/aws-xml-protocol/pom.xml index 5795efa9f8ac..45bfa2efb8d3 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/core/protocols/pom.xml b/core/protocols/pom.xml index fdc5d1067f4a..38fd2697733b 100644 --- a/core/protocols/pom.xml +++ b/core/protocols/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/core/protocols/protocol-core/pom.xml b/core/protocols/protocol-core/pom.xml index ed2121a6674a..4256233584db 100644 --- a/core/protocols/protocol-core/pom.xml +++ b/core/protocols/protocol-core/pom.xml @@ -20,7 +20,7 @@ protocols software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/core/regions/pom.xml b/core/regions/pom.xml index 3ab07923d8c3..63f665698ca9 100644 --- a/core/regions/pom.xml +++ b/core/regions/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT regions diff --git a/core/sdk-core/pom.xml b/core/sdk-core/pom.xml index af1b80c3c5e4..0ecae72e5c99 100644 --- a/core/sdk-core/pom.xml +++ b/core/sdk-core/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk core - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT sdk-core AWS Java SDK :: SDK Core diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/loader/ClasspathSdkHttpServiceProvider.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/loader/ClasspathSdkHttpServiceProvider.java index 0f71d54a866f..468adab2cb3f 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/loader/ClasspathSdkHttpServiceProvider.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/loader/ClasspathSdkHttpServiceProvider.java @@ -15,66 +15,90 @@ package software.amazon.awssdk.core.internal.http.loader; -import java.util.List; +import java.util.Comparator; +import java.util.Map; import java.util.Optional; +import java.util.PriorityQueue; +import java.util.Queue; import java.util.ServiceLoader; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; +import java.util.StringJoiner; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.annotations.SdkTestInternalApi; -import software.amazon.awssdk.core.SdkSystemSetting; -import software.amazon.awssdk.core.exception.SdkClientException; import software.amazon.awssdk.http.SdkHttpService; import software.amazon.awssdk.http.async.SdkAsyncHttpService; -import software.amazon.awssdk.utils.SystemSetting; +import software.amazon.awssdk.utils.ImmutableMap; +import software.amazon.awssdk.utils.Logger; /** * {@link SdkHttpServiceProvider} implementation that uses {@link ServiceLoader} to find HTTP implementations on the - * classpath. If more than one implementation is found on the classpath then an exception is thrown. + * classpath. If more than one implementation is found on the classpath, then the SDK will choose based on priority order. */ @SdkInternalApi final class ClasspathSdkHttpServiceProvider implements SdkHttpServiceProvider { + static final Map SYNC_HTTP_SERVICES_PRIORITY = + ImmutableMap.builder() + .put("software.amazon.awssdk.http.apache.ApacheSdkHttpService", 1) + .put("software.amazon.awssdk.http.urlconnection.UrlConnectionSdkHttpService", 2) + .put("software.amazon.awssdk.http.crt.AwsCrtSdkHttpService", 3) + .build(); + + static final Map ASYNC_HTTP_SERVICES_PRIORITY = + ImmutableMap.builder() + .put("software.amazon.awssdk.http.nio.netty.NettySdkAsyncHttpService", 1) + .put("software.amazon.awssdk.http.crt.AwsCrtSdkHttpService", 2) + .build(); + + private static final Logger log = Logger.loggerFor(ClasspathSdkHttpServiceProvider.class); + + private final Map httpServicesPriority; + private final SdkServiceLoader serviceLoader; - private final SystemSetting implSystemProperty; private final Class serviceClass; @SdkTestInternalApi - ClasspathSdkHttpServiceProvider(SdkServiceLoader serviceLoader, SystemSetting implSystemProperty, Class serviceClass) { + ClasspathSdkHttpServiceProvider(SdkServiceLoader serviceLoader, + Class serviceClass, + Map httpServicesPriority) { this.serviceLoader = serviceLoader; - this.implSystemProperty = implSystemProperty; this.serviceClass = serviceClass; + this.httpServicesPriority = httpServicesPriority; } @Override public Optional loadService() { + Queue impls = new PriorityQueue<>( + Comparator.comparingInt(o -> httpServicesPriority.getOrDefault(o.getClass().getName(), + Integer.MAX_VALUE))); Iterable iterable = () -> serviceLoader.loadServices(serviceClass); - List impls = StreamSupport - .stream(iterable.spliterator(), false) - .collect(Collectors.toList()); + iterable.forEach(impl -> impls.add(impl)); if (impls.isEmpty()) { return Optional.empty(); } - if (impls.size() > 1) { - - String implText = - impls.stream() - .map(clazz -> clazz.getClass().getName()) - .collect(Collectors.joining(",", "[", "]")); + log.debug(() -> logServices(impls)); + return Optional.of(impls.poll()); + } - throw SdkClientException.builder().message( - String.format( - "Multiple HTTP implementations were found on the classpath. To avoid non-deterministic loading " + - "implementations, please explicitly provide an HTTP client via the client builders, set the %s " + - "system property with the FQCN of the HTTP service to use as the default, or remove all but one " + - "HTTP implementation from the classpath. The multiple implementations found were: %s", - implSystemProperty.property(), implText)) - .build(); + private String logServices(Queue impls) { + StringJoiner joiner = new StringJoiner(",", "[", "]"); + int count = 0; + for (T clazz : impls) { + String name = clazz.getClass().getName(); + joiner.add(name); + count++; } + String implText = joiner.toString(); + T impl = impls.peek(); + String message = count == 1 ? "The HTTP implementation loaded is " + impl : + String.format( + "Multiple HTTP implementations were found on the classpath. The SDK will use %s since it has the " + + "highest priority. The multiple implementations found were: %s", + impl, + implText); - return impls.stream().findFirst(); + return message; } /** @@ -82,8 +106,8 @@ public Optional loadService() { */ static SdkHttpServiceProvider syncProvider() { return new ClasspathSdkHttpServiceProvider<>(SdkServiceLoader.INSTANCE, - SdkSystemSetting.SYNC_HTTP_SERVICE_IMPL, - SdkHttpService.class); + SdkHttpService.class, + SYNC_HTTP_SERVICES_PRIORITY); } /** @@ -91,8 +115,7 @@ static SdkHttpServiceProvider syncProvider() { */ static SdkHttpServiceProvider asyncProvider() { return new ClasspathSdkHttpServiceProvider<>(SdkServiceLoader.INSTANCE, - SdkSystemSetting.ASYNC_HTTP_SERVICE_IMPL, - SdkAsyncHttpService.class); + SdkAsyncHttpService.class, + ASYNC_HTTP_SERVICES_PRIORITY); } - } diff --git a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/loader/ClasspathSdkHttpServiceProviderTest.java b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/loader/ClasspathSdkHttpServiceProviderTest.java index c5f4760fa7af..03e25c388625 100644 --- a/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/loader/ClasspathSdkHttpServiceProviderTest.java +++ b/core/sdk-core/src/test/java/software/amazon/awssdk/core/internal/http/loader/ClasspathSdkHttpServiceProviderTest.java @@ -19,6 +19,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static software.amazon.awssdk.core.internal.http.loader.ClasspathSdkHttpServiceProvider.ASYNC_HTTP_SERVICES_PRIORITY; +import static software.amazon.awssdk.core.internal.http.loader.ClasspathSdkHttpServiceProvider.SYNC_HTTP_SERVICES_PRIORITY; import java.util.Arrays; import java.util.Iterator; @@ -27,9 +29,10 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; -import software.amazon.awssdk.core.SdkSystemSetting; -import software.amazon.awssdk.core.exception.SdkClientException; import software.amazon.awssdk.http.SdkHttpService; +import software.amazon.awssdk.http.apache.ApacheSdkHttpService; +import software.amazon.awssdk.http.async.SdkAsyncHttpService; +import software.amazon.awssdk.http.nio.netty.NettySdkAsyncHttpService; @RunWith(MockitoJUnitRunner.class) public class ClasspathSdkHttpServiceProviderTest { @@ -39,11 +42,17 @@ public class ClasspathSdkHttpServiceProviderTest { private SdkHttpServiceProvider provider; + private SdkHttpServiceProvider asyncProvider; + @Before public void setup() { provider = new ClasspathSdkHttpServiceProvider<>(serviceLoader, - SdkSystemSetting.SYNC_HTTP_SERVICE_IMPL, - SdkHttpService.class); + SdkHttpService.class, + SYNC_HTTP_SERVICES_PRIORITY); + + asyncProvider = new ClasspathSdkHttpServiceProvider<>(serviceLoader, + SdkAsyncHttpService.class, + ASYNC_HTTP_SERVICES_PRIORITY); } @Test @@ -60,11 +69,36 @@ public void oneImplementationsFound_ReturnsFulfilledOptional() { assertThat(provider.loadService()).isPresent(); } - @Test(expected = SdkClientException.class) - public void multipleImplementationsFound_ThrowsException() { + @Test + public void multipleSyncImplementationsFound_ReturnHighestPriority() { + ApacheSdkHttpService apacheSdkHttpService = new ApacheSdkHttpService(); + SdkHttpService mock = mock(SdkHttpService.class); + + when(serviceLoader.loadServices(SdkHttpService.class)) + .thenReturn(iteratorOf(mock, apacheSdkHttpService)); + assertThat(provider.loadService()).contains(apacheSdkHttpService); + + SdkHttpService mock1 = mock(SdkHttpService.class); + SdkHttpService mock2 = mock(SdkHttpService.class); when(serviceLoader.loadServices(SdkHttpService.class)) - .thenReturn(iteratorOf(mock(SdkHttpService.class), mock(SdkHttpService.class))); - provider.loadService(); + .thenReturn(iteratorOf(mock1, mock2)); + assertThat(provider.loadService()).contains(mock1); + } + + @Test + public void multipleAsyncImplementationsFound_ReturnHighestPriority() { + NettySdkAsyncHttpService netty = new NettySdkAsyncHttpService(); + SdkAsyncHttpService mock = mock(SdkAsyncHttpService.class); + + when(serviceLoader.loadServices(SdkAsyncHttpService.class)) + .thenReturn(iteratorOf(mock, netty)); + assertThat(asyncProvider.loadService()).contains(netty); + + SdkAsyncHttpService mock1 = mock(SdkAsyncHttpService.class); + SdkAsyncHttpService mock2 = mock(SdkAsyncHttpService.class); + when(serviceLoader.loadServices(SdkAsyncHttpService.class)) + .thenReturn(iteratorOf(mock1, mock2)); + assertThat(asyncProvider.loadService()).contains(mock1); } @SafeVarargs diff --git a/http-client-spi/pom.xml b/http-client-spi/pom.xml index e7231b850b53..04698936bf19 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT http-client-spi AWS Java SDK :: HTTP Client Interface diff --git a/http-client-spi/src/main/java/software/amazon/awssdk/http/HttpExecuteResponse.java b/http-client-spi/src/main/java/software/amazon/awssdk/http/HttpExecuteResponse.java index f8db3f2cd250..8f183be3e408 100644 --- a/http-client-spi/src/main/java/software/amazon/awssdk/http/HttpExecuteResponse.java +++ b/http-client-spi/src/main/java/software/amazon/awssdk/http/HttpExecuteResponse.java @@ -38,7 +38,7 @@ public SdkHttpResponse httpResponse() { } /** - * /** Get the {@link AbortableInputStream} associated with this response. + * Get the {@link AbortableInputStream} associated with this response. * *

Always close the "responseBody" input stream to release the underlying HTTP connection. * Even for error responses, the SDK creates an input stream for reading error data. It is essential to close the input stream diff --git a/http-clients/apache-client/pom.xml b/http-clients/apache-client/pom.xml index 3cc5fc7b46e9..a2be356b598e 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT apache-client diff --git a/http-clients/aws-crt-client/pom.xml b/http-clients/aws-crt-client/pom.xml index 6aeb6b14045b..3dcab0d7e683 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 @@ -151,12 +151,6 @@ ${awsjavasdk.version} test - - software.amazon.awssdk - s3 - ${awsjavasdk.version} - test - software.amazon.awssdk auth diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.java index ad13d787f17f..64ffd3dabb3a 100644 --- a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.java +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.java @@ -15,44 +15,21 @@ package software.amazon.awssdk.http.crt; -import static software.amazon.awssdk.crtcore.CrtConfigurationUtils.resolveHttpMonitoringOptions; -import static software.amazon.awssdk.crtcore.CrtConfigurationUtils.resolveProxy; import static software.amazon.awssdk.http.HttpMetric.HTTP_CLIENT_NAME; -import static software.amazon.awssdk.http.SdkHttpConfigurationOption.PROTOCOL; -import static software.amazon.awssdk.http.crt.internal.AwsCrtConfigurationUtils.buildSocketOptions; -import static software.amazon.awssdk.http.crt.internal.AwsCrtConfigurationUtils.resolveCipherPreference; -import static software.amazon.awssdk.utils.FunctionalUtils.invokeSafely; import static software.amazon.awssdk.utils.Validate.paramNotNull; -import java.net.URI; import java.time.Duration; -import java.util.LinkedList; -import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; import software.amazon.awssdk.annotations.SdkPublicApi; -import software.amazon.awssdk.crt.CrtResource; import software.amazon.awssdk.crt.http.HttpClientConnectionManager; -import software.amazon.awssdk.crt.http.HttpClientConnectionManagerOptions; -import software.amazon.awssdk.crt.http.HttpMonitoringOptions; -import software.amazon.awssdk.crt.http.HttpProxyOptions; -import software.amazon.awssdk.crt.io.ClientBootstrap; -import software.amazon.awssdk.crt.io.SocketOptions; -import software.amazon.awssdk.crt.io.TlsContext; -import software.amazon.awssdk.crt.io.TlsContextOptions; -import software.amazon.awssdk.http.Protocol; import software.amazon.awssdk.http.SdkHttpConfigurationOption; -import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.http.async.AsyncExecuteRequest; import software.amazon.awssdk.http.async.SdkAsyncHttpClient; -import software.amazon.awssdk.http.crt.internal.CrtRequestContext; +import software.amazon.awssdk.http.crt.internal.AwsCrtClientBuilderBase; +import software.amazon.awssdk.http.crt.internal.CrtAsyncRequestContext; import software.amazon.awssdk.http.crt.internal.CrtRequestExecutor; -import software.amazon.awssdk.metrics.NoOpMetricCollector; import software.amazon.awssdk.utils.AttributeMap; -import software.amazon.awssdk.utils.IoUtils; -import software.amazon.awssdk.utils.Logger; -import software.amazon.awssdk.utils.Validate; /** * An implementation of {@link SdkAsyncHttpClient} that uses the AWS Common Runtime (CRT) Http Client to communicate with @@ -69,67 +46,14 @@ * */ @SdkPublicApi -public final class AwsCrtAsyncHttpClient implements SdkAsyncHttpClient { - private static final Logger log = Logger.loggerFor(AwsCrtAsyncHttpClient.class); +public final class AwsCrtAsyncHttpClient extends AwsCrtHttpClientBase implements SdkAsyncHttpClient { - private static final String AWS_COMMON_RUNTIME = "AwsCommonRuntime"; - private static final long DEFAULT_STREAM_WINDOW_SIZE = 16L * 1024L * 1024L; // 16 MB - - private final Map connectionPools = new ConcurrentHashMap<>(); - private final LinkedList ownedSubResources = new LinkedList<>(); - private final ClientBootstrap bootstrap; - private final SocketOptions socketOptions; - private final TlsContext tlsContext; - private final HttpProxyOptions proxyOptions; - private final HttpMonitoringOptions monitoringOptions; - private final long maxConnectionIdleInMilliseconds; - private final long readBufferSize; - private final int maxConnectionsPerEndpoint; - private boolean isClosed = false; - - private AwsCrtAsyncHttpClient(DefaultBuilder builder, AttributeMap config) { - if (config.get(PROTOCOL) == Protocol.HTTP2) { - throw new UnsupportedOperationException("HTTP/2 is not supported in AwsCrtAsyncHttpClient yet. Use " - + "NettyNioAsyncHttpClient instead."); - } - - try (ClientBootstrap clientBootstrap = new ClientBootstrap(null, null); - SocketOptions clientSocketOptions = buildSocketOptions(builder.tcpKeepAliveConfiguration, - config.get(SdkHttpConfigurationOption.CONNECTION_TIMEOUT)); - TlsContextOptions clientTlsContextOptions = - TlsContextOptions.createDefaultClient() - .withCipherPreference(resolveCipherPreference(builder.postQuantumTlsEnabled)) - .withVerifyPeer(!config.get(SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES)); - TlsContext clientTlsContext = new TlsContext(clientTlsContextOptions)) { - - this.bootstrap = registerOwnedResource(clientBootstrap); - this.socketOptions = registerOwnedResource(clientSocketOptions); - this.tlsContext = registerOwnedResource(clientTlsContext); - this.readBufferSize = builder.readBufferSize == null ? DEFAULT_STREAM_WINDOW_SIZE : builder.readBufferSize; - this.maxConnectionsPerEndpoint = config.get(SdkHttpConfigurationOption.MAX_CONNECTIONS); - this.monitoringOptions = resolveHttpMonitoringOptions(builder.connectionHealthConfiguration).orElse(null); - this.maxConnectionIdleInMilliseconds = config.get(SdkHttpConfigurationOption.CONNECTION_MAX_IDLE_TIMEOUT).toMillis(); - this.proxyOptions = resolveProxy(builder.proxyConfiguration, tlsContext).orElse(null); - } + private AwsCrtAsyncHttpClient(DefaultAsyncBuilder builder, AttributeMap config) { + super(builder, config); } - /** - * Marks a Native CrtResource as owned by the current Java Object. - * - * @param subresource The Resource to own. - * @param The CrtResource Type - * @return The CrtResource passed in - */ - private T registerOwnedResource(T subresource) { - if (subresource != null) { - subresource.addRef(); - ownedSubResources.push(subresource); - } - return subresource; - } - - public static Builder builder() { - return new DefaultBuilder(); + public static AwsCrtAsyncHttpClient.Builder builder() { + return new DefaultAsyncBuilder(); } /** @@ -138,57 +62,12 @@ public static Builder builder() { * @return an {@link SdkAsyncHttpClient} */ public static SdkAsyncHttpClient create() { - return new DefaultBuilder().build(); + return new DefaultAsyncBuilder().build(); } @Override public String clientName() { - return AWS_COMMON_RUNTIME; - } - - private HttpClientConnectionManager createConnectionPool(URI uri) { - log.debug(() -> "Creating ConnectionPool for: URI:" + uri + ", MaxConns: " + maxConnectionsPerEndpoint); - - HttpClientConnectionManagerOptions options = new HttpClientConnectionManagerOptions() - .withClientBootstrap(bootstrap) - .withSocketOptions(socketOptions) - .withTlsContext(tlsContext) - .withUri(uri) - .withWindowSize(readBufferSize) - .withMaxConnections(maxConnectionsPerEndpoint) - .withManualWindowManagement(true) - .withProxyOptions(proxyOptions) - .withMonitoringOptions(monitoringOptions) - .withMaxConnectionIdleInMilliseconds(maxConnectionIdleInMilliseconds); - - return HttpClientConnectionManager.create(options); - } - - /* - * Callers of this function MUST account for the addRef() on the pool before returning. - * Every execution path consuming the return value must guarantee an associated close(). - * Currently this function is only used by execute(), which guarantees a matching close - * via the try-with-resources block. - * - * This guarantees that a returned pool will not get closed (by closing the http client) during - * the time it takes to submit a request to the pool. Acquisition requests submitted to the pool will - * be properly failed if the http client is closed before the acquisition completes. - * - * This additional complexity means we only have to keep a lock for the scope of this function, as opposed to - * the scope of calling execute(). This function will almost always just be a hash lookup and the return of an - * existing pool. If we add all of execute() to the scope, we include, at minimum a JNI call to the native - * pool implementation. - */ - private HttpClientConnectionManager getOrCreateConnectionPool(URI uri) { - synchronized (this) { - if (isClosed) { - throw new IllegalStateException("Client is closed. No more requests can be made with this client."); - } - - HttpClientConnectionManager connPool = connectionPools.computeIfAbsent(uri, this::createConnectionPool); - connPool.addRef(); - return connPool; - } + return super.clientName(); } @Override @@ -200,7 +79,6 @@ public CompletableFuture execute(AsyncExecuteRequest asyncRequest) { paramNotNull(asyncRequest.responseHandler(), "ResponseHandler"); asyncRequest.metricCollector() - .filter(metricCollector -> !(metricCollector instanceof NoOpMetricCollector)) .ifPresent(metricCollector -> metricCollector.reportMetric(HTTP_CLIENT_NAME, clientName())); /* @@ -213,39 +91,17 @@ public CompletableFuture execute(AsyncExecuteRequest asyncRequest) { * we have a pool and no one can destroy it underneath us until we've finished submitting the * request) */ - try (HttpClientConnectionManager crtConnPool = getOrCreateConnectionPool(poolKey(asyncRequest))) { - CrtRequestContext context = CrtRequestContext.builder() - .crtConnPool(crtConnPool) - .readBufferSize(readBufferSize) - .request(asyncRequest) - .build(); + try (HttpClientConnectionManager crtConnPool = getOrCreateConnectionPool(poolKey(asyncRequest.request()))) { + CrtAsyncRequestContext context = CrtAsyncRequestContext.builder() + .crtConnPool(crtConnPool) + .readBufferSize(this.readBufferSize) + .request(asyncRequest) + .build(); return new CrtRequestExecutor().execute(context); } } - private URI poolKey(AsyncExecuteRequest asyncRequest) { - SdkHttpRequest sdkRequest = asyncRequest.request(); - return invokeSafely(() -> new URI(sdkRequest.protocol(), null, sdkRequest.host(), - sdkRequest.port(), null, null, null)); - } - - @Override - public void close() { - synchronized (this) { - - if (isClosed) { - return; - } - - connectionPools.values().forEach(pool -> IoUtils.closeQuietly(pool, log.logger())); - ownedSubResources.forEach(r -> IoUtils.closeQuietly(r, log.logger())); - ownedSubResources.clear(); - - isClosed = true; - } - } - /** * Builder that allows configuration of the AWS CRT HTTP implementation. */ @@ -256,7 +112,7 @@ public interface Builder extends SdkAsyncHttpClient.Builder proxyConfigurationBuilderConsumer); + AwsCrtAsyncHttpClient.Builder proxyConfiguration(Consumer proxyConfigurationBuilderConsumer); /** * Configure the health checks for all connections established by this client. @@ -299,7 +155,7 @@ public interface Builder extends SdkAsyncHttpClient.Builder + AwsCrtAsyncHttpClient.Builder connectionHealthConfiguration(Consumer healthChecksConfigurationBuilder); /** @@ -317,14 +173,14 @@ Builder connectionHealthConfiguration(Consumer + AwsCrtAsyncHttpClient.Builder tcpKeepAliveConfiguration(Consumer tcpKeepAliveConfigurationBuilder); /** @@ -369,110 +225,27 @@ Builder tcpKeepAliveConfiguration(Consumer * @param postQuantumTlsEnabled whether to prefer Post Quantum TLS * @return The builder of the method chaining. */ - Builder postQuantumTlsEnabled(Boolean postQuantumTlsEnabled); + AwsCrtAsyncHttpClient.Builder postQuantumTlsEnabled(Boolean postQuantumTlsEnabled); } /** * Factory that allows more advanced configuration of the AWS CRT HTTP implementation. Use {@link #builder()} to * configure and construct an immutable instance of the factory. */ - private static final class DefaultBuilder implements Builder { - private final AttributeMap.Builder standardOptions = AttributeMap.builder(); - private Long readBufferSize; - private ProxyConfiguration proxyConfiguration; - private ConnectionHealthConfiguration connectionHealthConfiguration; - private TcpKeepAliveConfiguration tcpKeepAliveConfiguration; - private Boolean postQuantumTlsEnabled; - - private DefaultBuilder() { - } + private static final class DefaultAsyncBuilder + extends AwsCrtClientBuilderBase implements Builder { @Override public SdkAsyncHttpClient build() { - return new AwsCrtAsyncHttpClient(this, standardOptions.build() - .merge(SdkHttpConfigurationOption.GLOBAL_HTTP_DEFAULTS)); + return new AwsCrtAsyncHttpClient(this, getAttributeMap().build() + .merge(SdkHttpConfigurationOption.GLOBAL_HTTP_DEFAULTS)); } @Override public SdkAsyncHttpClient buildWithDefaults(AttributeMap serviceDefaults) { - return new AwsCrtAsyncHttpClient(this, standardOptions.build() - .merge(serviceDefaults) - .merge(SdkHttpConfigurationOption.GLOBAL_HTTP_DEFAULTS)); - } - - @Override - public Builder maxConcurrency(Integer maxConcurrency) { - Validate.isPositiveOrNull(maxConcurrency, "maxConcurrency"); - standardOptions.put(SdkHttpConfigurationOption.MAX_CONNECTIONS, maxConcurrency); - return this; - } - - @Override - public Builder readBufferSizeInBytes(Long readBufferSize) { - Validate.isPositiveOrNull(readBufferSize, "readBufferSize"); - this.readBufferSize = readBufferSize; - return this; - } - - @Override - public Builder proxyConfiguration(ProxyConfiguration proxyConfiguration) { - this.proxyConfiguration = proxyConfiguration; - return this; - } - - @Override - public Builder connectionHealthConfiguration(ConnectionHealthConfiguration monitoringOptions) { - this.connectionHealthConfiguration = monitoringOptions; - return this; - } - - @Override - public Builder connectionHealthConfiguration(Consumer - configurationBuilder) { - ConnectionHealthConfiguration.Builder builder = ConnectionHealthConfiguration.builder(); - configurationBuilder.accept(builder); - return connectionHealthConfiguration(builder.build()); - } - - @Override - public Builder connectionMaxIdleTime(Duration connectionMaxIdleTime) { - Validate.isPositive(connectionMaxIdleTime, "connectionMaxIdleTime"); - standardOptions.put(SdkHttpConfigurationOption.CONNECTION_MAX_IDLE_TIMEOUT, connectionMaxIdleTime); - return this; - } - - @Override - public Builder connectionTimeout(Duration connectionTimeout) { - Validate.isPositive(connectionTimeout, "connectionTimeout"); - standardOptions.put(SdkHttpConfigurationOption.CONNECTION_TIMEOUT, connectionTimeout); - return this; - } - - @Override - public Builder tcpKeepAliveConfiguration(TcpKeepAliveConfiguration tcpKeepAliveConfiguration) { - this.tcpKeepAliveConfiguration = tcpKeepAliveConfiguration; - return this; - } - - @Override - public Builder tcpKeepAliveConfiguration(Consumer - tcpKeepAliveConfigurationBuilder) { - TcpKeepAliveConfiguration.Builder builder = TcpKeepAliveConfiguration.builder(); - tcpKeepAliveConfigurationBuilder.accept(builder); - return tcpKeepAliveConfiguration(builder.build()); - } - - @Override - public Builder postQuantumTlsEnabled(Boolean postQuantumTlsEnabled) { - this.postQuantumTlsEnabled = postQuantumTlsEnabled; - return this; - } - - @Override - public Builder proxyConfiguration(Consumer proxyConfigurationBuilderConsumer) { - ProxyConfiguration.Builder builder = ProxyConfiguration.builder(); - proxyConfigurationBuilderConsumer.accept(builder); - return proxyConfiguration(builder.build()); + return new AwsCrtAsyncHttpClient(this, getAttributeMap().build() + .merge(serviceDefaults) + .merge(SdkHttpConfigurationOption.GLOBAL_HTTP_DEFAULTS)); } } } diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtHttpClient.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtHttpClient.java new file mode 100644 index 000000000000..3ee178abeb9a --- /dev/null +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtHttpClient.java @@ -0,0 +1,292 @@ +/* + * 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.http.crt; + +import static software.amazon.awssdk.http.HttpMetric.HTTP_CLIENT_NAME; + +import java.io.IOException; +import java.time.Duration; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +import java.util.function.Consumer; +import software.amazon.awssdk.annotations.SdkPublicApi; +import software.amazon.awssdk.crt.http.HttpClientConnectionManager; +import software.amazon.awssdk.crt.http.HttpException; +import software.amazon.awssdk.http.ExecutableHttpRequest; +import software.amazon.awssdk.http.HttpExecuteRequest; +import software.amazon.awssdk.http.HttpExecuteResponse; +import software.amazon.awssdk.http.SdkHttpClient; +import software.amazon.awssdk.http.SdkHttpConfigurationOption; +import software.amazon.awssdk.http.SdkHttpFullResponse; +import software.amazon.awssdk.http.crt.internal.AwsCrtClientBuilderBase; +import software.amazon.awssdk.http.crt.internal.CrtRequestContext; +import software.amazon.awssdk.http.crt.internal.CrtRequestExecutor; +import software.amazon.awssdk.utils.AttributeMap; +import software.amazon.awssdk.utils.CompletableFutureUtils; + +/** + * An implementation of {@link SdkHttpClient} that uses the AWS Common Runtime (CRT) Http Client to communicate with + * Http Web Services. This client has a synchronous interface, but uses non-blocking IO. + * + *

This can be created via {@link #builder()}

+ * {@snippet : + * SdkHttpClient client = AwsCrtHttpClient.builder() + * .maxConcurrency(100) + * .connectionTimeout(Duration.ofSeconds(1)) + * .connectionMaxIdleTime(Duration.ofSeconds(5)) + * .build(); + *} + * + */ +@SdkPublicApi +public final class AwsCrtHttpClient extends AwsCrtHttpClientBase implements SdkHttpClient { + + private AwsCrtHttpClient(DefaultBuilder builder, AttributeMap config) { + super(builder, config); + } + + public static AwsCrtHttpClient.Builder builder() { + return new DefaultBuilder(); + } + + /** + * Create a {@link AwsCrtHttpClient} client with the default configuration + * + * @return an {@link SdkHttpClient} + */ + public static SdkHttpClient create() { + return new DefaultBuilder().build(); + } + + @Override + public String clientName() { + return super.clientName(); + } + + @Override + public ExecutableHttpRequest prepareRequest(HttpExecuteRequest request) { + request.metricCollector() + .ifPresent(metricCollector -> metricCollector.reportMetric(HTTP_CLIENT_NAME, clientName())); + + /* + * See the note on getOrCreateConnectionPool() + * + * In particular, this returns a ref-counted object and calling getOrCreateConnectionPool + * increments the ref count by one. We add a try-with-resources to release our ref + * once we have successfully submitted a request. In this way, we avoid a race condition + * when close/shutdown is called from another thread while this function is executing (i.e. + * we have a pool and no one can destroy it underneath us until we've finished submitting the + * request) + */ + try (HttpClientConnectionManager crtConnPool = getOrCreateConnectionPool(poolKey(request.httpRequest()))) { + CrtRequestContext context = CrtRequestContext.builder() + .crtConnPool(crtConnPool) + .readBufferSize(this.readBufferSize) + .request(request) + .build(); + return new CrtHttpRequest(context); + } + } + + private static final class CrtHttpRequest implements ExecutableHttpRequest { + private final CrtRequestContext context; + private volatile CompletableFuture responseFuture; + + private CrtHttpRequest(CrtRequestContext context) { + this.context = context; + } + + @Override + public HttpExecuteResponse call() throws IOException { + HttpExecuteResponse.Builder builder = HttpExecuteResponse.builder(); + + try { + responseFuture = new CrtRequestExecutor().execute(context); + SdkHttpFullResponse response = CompletableFutureUtils.joinInterruptibly(responseFuture); + builder.response(response); + builder.responseBody(response.content().orElse(null)); + return builder.build(); + } catch (CompletionException e) { + Throwable cause = e.getCause(); + if (cause instanceof IOException) { + throw (IOException) cause; + } + + if (cause instanceof HttpException) { + throw (HttpException) cause; + } + + throw new RuntimeException(e.getCause()); + } + } + + @Override + public void abort() { + if (responseFuture != null) { + responseFuture.cancel(true); + } + } + } + + /** + * Builder that allows configuration of the AWS CRT HTTP implementation. + */ + public interface Builder extends SdkHttpClient.Builder { + + /** + * The Maximum number of allowed concurrent requests. For HTTP/1.1 this is the same as max connections. + * @param maxConcurrency maximum concurrency per endpoint + * @return The builder of the method chaining. + */ + AwsCrtHttpClient.Builder maxConcurrency(Integer maxConcurrency); + + /** + * Configures the number of unread bytes that can be buffered in the + * client before we stop reading from the underlying TCP socket and wait for the Subscriber + * to read more data. + * + * @param readBufferSize The number of bytes that can be buffered. + * @return The builder of the method chaining. + */ + AwsCrtHttpClient.Builder readBufferSizeInBytes(Long readBufferSize); + + /** + * Sets the http proxy configuration to use for this client. + * @param proxyConfiguration The http proxy configuration to use + * @return The builder of the method chaining. + */ + AwsCrtHttpClient.Builder proxyConfiguration(ProxyConfiguration proxyConfiguration); + + /** + * Sets the http proxy configuration to use for this client. + * + * @param proxyConfigurationBuilderConsumer The consumer of the proxy configuration builder object. + * @return the builder for method chaining. + */ + AwsCrtHttpClient.Builder proxyConfiguration(Consumer proxyConfigurationBuilderConsumer); + + /** + * Configure the health checks for all connections established by this client. + * + *

+ * You can set a throughput threshold for a connection to be considered healthy. + * If a connection falls below this threshold ({@link ConnectionHealthConfiguration#minimumThroughputInBps() + * }) for the configurable amount + * of time ({@link ConnectionHealthConfiguration#minimumThroughputTimeout()}), + * then the connection is considered unhealthy and will be shut down. + * + *

+ * By default, monitoring options are disabled. You can enable {@code healthChecks} by providing this configuration + * and specifying the options for monitoring for the connection manager. + * @param healthChecksConfiguration The health checks config to use + * @return The builder of the method chaining. + */ + AwsCrtHttpClient.Builder connectionHealthConfiguration(ConnectionHealthConfiguration healthChecksConfiguration); + + /** + * A convenience method that creates an instance of the {@link ConnectionHealthConfiguration} builder, avoiding the + * need to create one manually via {@link ConnectionHealthConfiguration#builder()}. + * + * @param healthChecksConfigurationBuilder The health checks config builder to use + * @return The builder of the method chaining. + * @see #connectionHealthConfiguration(ConnectionHealthConfiguration) + */ + AwsCrtHttpClient.Builder connectionHealthConfiguration(Consumer + healthChecksConfigurationBuilder); + + /** + * Configure the maximum amount of time that a connection should be allowed to remain open while idle. + * @param connectionMaxIdleTime the maximum amount of connection idle time + * @return The builder of the method chaining. + */ + AwsCrtHttpClient.Builder connectionMaxIdleTime(Duration connectionMaxIdleTime); + + /** + * The amount of time to wait when initially establishing a connection before giving up and timing out. + * @param connectionTimeout timeout + * @return The builder of the method chaining. + */ + AwsCrtHttpClient.Builder connectionTimeout(Duration connectionTimeout); + + /** + * Configure whether to enable {@code tcpKeepAlive} and relevant configuration for all connections established by this + * client. + * + *

+ * By default, tcpKeepAlive is disabled. You can enable {@code tcpKeepAlive} by providing this configuration + * and specifying periodic TCP keepalive packet intervals and timeouts. This may be required for certain connections for + * longer durations than default socket timeouts. + * + * @param tcpKeepAliveConfiguration The TCP keep-alive configuration to use + * @return The builder of the method chaining. + */ + AwsCrtHttpClient.Builder tcpKeepAliveConfiguration(TcpKeepAliveConfiguration tcpKeepAliveConfiguration); + + /** + * Configure whether to enable {@code tcpKeepAlive} and relevant configuration for all connections established by this + * client. + * + *

+ * A convenience method that creates an instance of the {@link TcpKeepAliveConfiguration} builder, avoiding the + * need to create one manually via {@link TcpKeepAliveConfiguration#builder()}. + * + * @param tcpKeepAliveConfigurationBuilder The TCP keep-alive configuration builder to use + * @return The builder of the method chaining. + * @see #tcpKeepAliveConfiguration(TcpKeepAliveConfiguration) + */ + AwsCrtHttpClient.Builder tcpKeepAliveConfiguration(Consumer + tcpKeepAliveConfigurationBuilder); + + /** + * Configure whether to enable a hybrid post-quantum key exchange option for the Transport Layer Security (TLS) network + * encryption protocol when communicating with services that support Post Quantum TLS. If Post Quantum cipher suites are + * not supported on the platform, the SDK will use the default TLS cipher suites. + * + *

+ * See Using hybrid post-quantum TLS with AWS KMS + * + *

+ * It's disabled by default. + * + * @param postQuantumTlsEnabled whether to prefer Post Quantum TLS + * @return The builder of the method chaining. + */ + AwsCrtHttpClient.Builder postQuantumTlsEnabled(Boolean postQuantumTlsEnabled); + } + + /** + * Factory that allows more advanced configuration of the AWS CRT HTTP implementation. + * Use {@link #builder()} to configure and construct an immutable instance of the factory. + */ + private static final class DefaultBuilder + extends AwsCrtClientBuilderBase implements AwsCrtHttpClient.Builder { + + + @Override + public AwsCrtHttpClient build() { + return new AwsCrtHttpClient(this, getAttributeMap().build() + .merge(SdkHttpConfigurationOption.GLOBAL_HTTP_DEFAULTS)); + } + + @Override + public AwsCrtHttpClient buildWithDefaults(AttributeMap serviceDefaults) { + return new AwsCrtHttpClient(this, getAttributeMap().build() + .merge(serviceDefaults) + .merge(SdkHttpConfigurationOption.GLOBAL_HTTP_DEFAULTS)); + } + } + +} diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientBase.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientBase.java new file mode 100644 index 000000000000..4ae9f93c1955 --- /dev/null +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientBase.java @@ -0,0 +1,181 @@ +/* + * 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.http.crt; + +import static software.amazon.awssdk.crtcore.CrtConfigurationUtils.resolveHttpMonitoringOptions; +import static software.amazon.awssdk.crtcore.CrtConfigurationUtils.resolveProxy; +import static software.amazon.awssdk.http.SdkHttpConfigurationOption.PROTOCOL; +import static software.amazon.awssdk.http.crt.internal.AwsCrtConfigurationUtils.buildSocketOptions; +import static software.amazon.awssdk.http.crt.internal.AwsCrtConfigurationUtils.resolveCipherPreference; +import static software.amazon.awssdk.utils.FunctionalUtils.invokeSafely; + +import java.net.URI; +import java.util.LinkedList; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import software.amazon.awssdk.annotations.SdkProtectedApi; +import software.amazon.awssdk.crt.CrtResource; +import software.amazon.awssdk.crt.http.HttpClientConnectionManager; +import software.amazon.awssdk.crt.http.HttpClientConnectionManagerOptions; +import software.amazon.awssdk.crt.http.HttpMonitoringOptions; +import software.amazon.awssdk.crt.http.HttpProxyOptions; +import software.amazon.awssdk.crt.io.ClientBootstrap; +import software.amazon.awssdk.crt.io.SocketOptions; +import software.amazon.awssdk.crt.io.TlsContext; +import software.amazon.awssdk.crt.io.TlsContextOptions; +import software.amazon.awssdk.http.Protocol; +import software.amazon.awssdk.http.SdkHttpConfigurationOption; +import software.amazon.awssdk.http.SdkHttpRequest; +import software.amazon.awssdk.http.crt.internal.AwsCrtClientBuilderBase; +import software.amazon.awssdk.utils.AttributeMap; +import software.amazon.awssdk.utils.IoUtils; +import software.amazon.awssdk.utils.Logger; +import software.amazon.awssdk.utils.SdkAutoCloseable; + +/** + * Common functionality and configuration for the CRT Http clients. + */ +@SdkProtectedApi +abstract class AwsCrtHttpClientBase implements SdkAutoCloseable { + private static final Logger log = Logger.loggerFor(AwsCrtHttpClientBase.class); + + private static final String AWS_COMMON_RUNTIME = "AwsCommonRuntime"; + private static final long DEFAULT_STREAM_WINDOW_SIZE = 16L * 1024L * 1024L; // 16 MB + + protected final long readBufferSize; + private final Map connectionPools = new ConcurrentHashMap<>(); + private final LinkedList ownedSubResources = new LinkedList<>(); + private final ClientBootstrap bootstrap; + private final SocketOptions socketOptions; + private final TlsContext tlsContext; + private final HttpProxyOptions proxyOptions; + private final HttpMonitoringOptions monitoringOptions; + private final long maxConnectionIdleInMilliseconds; + private final int maxConnectionsPerEndpoint; + private boolean isClosed = false; + + AwsCrtHttpClientBase(AwsCrtClientBuilderBase builder, AttributeMap config) { + if (config.get(PROTOCOL) == Protocol.HTTP2) { + throw new UnsupportedOperationException("HTTP/2 is not supported in AwsCrtHttpClient yet. Use " + + "NettyNioAsyncHttpClient instead."); + } + + try (ClientBootstrap clientBootstrap = new ClientBootstrap(null, null); + SocketOptions clientSocketOptions = buildSocketOptions(builder.getTcpKeepAliveConfiguration(), + config.get(SdkHttpConfigurationOption.CONNECTION_TIMEOUT)); + TlsContextOptions clientTlsContextOptions = + TlsContextOptions.createDefaultClient() + .withCipherPreference(resolveCipherPreference(builder.getPostQuantumTlsEnabled())) + .withVerifyPeer(!config.get(SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES)); + TlsContext clientTlsContext = new TlsContext(clientTlsContextOptions)) { + + this.bootstrap = registerOwnedResource(clientBootstrap); + this.socketOptions = registerOwnedResource(clientSocketOptions); + this.tlsContext = registerOwnedResource(clientTlsContext); + this.readBufferSize = builder.getReadBufferSizeInBytes() == null ? + DEFAULT_STREAM_WINDOW_SIZE : builder.getReadBufferSizeInBytes(); + this.maxConnectionsPerEndpoint = config.get(SdkHttpConfigurationOption.MAX_CONNECTIONS); + this.monitoringOptions = resolveHttpMonitoringOptions(builder.getConnectionHealthConfiguration()).orElse(null); + this.maxConnectionIdleInMilliseconds = config.get(SdkHttpConfigurationOption.CONNECTION_MAX_IDLE_TIMEOUT).toMillis(); + this.proxyOptions = resolveProxy(builder.getProxyConfiguration(), tlsContext).orElse(null); + } + } + + /** + * Marks a Native CrtResource as owned by the current Java Object. + * + * @param subresource The Resource to own. + * @param The CrtResource Type + * @return The CrtResource passed in + */ + private T registerOwnedResource(T subresource) { + if (subresource != null) { + subresource.addRef(); + ownedSubResources.push(subresource); + } + return subresource; + } + + String clientName() { + return AWS_COMMON_RUNTIME; + } + + private HttpClientConnectionManager createConnectionPool(URI uri) { + log.debug(() -> "Creating ConnectionPool for: URI:" + uri + ", MaxConns: " + maxConnectionsPerEndpoint); + + HttpClientConnectionManagerOptions options = new HttpClientConnectionManagerOptions() + .withClientBootstrap(bootstrap) + .withSocketOptions(socketOptions) + .withTlsContext(tlsContext) + .withUri(uri) + .withWindowSize(readBufferSize) + .withMaxConnections(maxConnectionsPerEndpoint) + .withManualWindowManagement(true) + .withProxyOptions(proxyOptions) + .withMonitoringOptions(monitoringOptions) + .withMaxConnectionIdleInMilliseconds(maxConnectionIdleInMilliseconds); + + return HttpClientConnectionManager.create(options); + } + + /* + * Callers of this function MUST account for the addRef() on the pool before returning. + * Every execution path consuming the return value must guarantee an associated close(). + * Currently, this function is only used by execute(), which guarantees a matching close + * via the try-with-resources block. + * + * This guarantees that a returned pool will not get closed (by closing the http client) during + * the time it takes to submit a request to the pool. Acquisition requests submitted to the pool will + * be properly failed if the http client is closed before the acquisition completes. + * + * This additional complexity means we only have to keep a lock for the scope of this function, as opposed to + * the scope of calling execute(). This function will almost always just be a hash lookup and the return of an + * existing pool. If we add all of execute() to the scope, we include, at minimum a JNI call to the native + * pool implementation. + */ + HttpClientConnectionManager getOrCreateConnectionPool(URI uri) { + synchronized (this) { + if (isClosed) { + throw new IllegalStateException("Client is closed. No more requests can be made with this client."); + } + + HttpClientConnectionManager connPool = connectionPools.computeIfAbsent(uri, this::createConnectionPool); + connPool.addRef(); + return connPool; + } + } + + URI poolKey(SdkHttpRequest sdkRequest) { + return invokeSafely(() -> new URI(sdkRequest.protocol(), null, sdkRequest.host(), + sdkRequest.port(), null, null, null)); + } + + @Override + public void close() { + synchronized (this) { + + if (isClosed) { + return; + } + + connectionPools.values().forEach(pool -> IoUtils.closeQuietly(pool, log.logger())); + ownedSubResources.forEach(r -> IoUtils.closeQuietly(r, log.logger())); + ownedSubResources.clear(); + + isClosed = true; + } + } +} diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtSdkHttpService.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtSdkHttpService.java index b94946e49de8..c38d1fe06deb 100644 --- a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtSdkHttpService.java +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtSdkHttpService.java @@ -16,7 +16,7 @@ package software.amazon.awssdk.http.crt; import software.amazon.awssdk.annotations.SdkPublicApi; -import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.SdkHttpService; import software.amazon.awssdk.http.async.SdkAsyncHttpService; /** @@ -25,9 +25,14 @@ * */ @SdkPublicApi -public class AwsCrtSdkHttpService implements SdkAsyncHttpService { +public class AwsCrtSdkHttpService implements SdkAsyncHttpService, SdkHttpService { @Override - public SdkAsyncHttpClient.Builder createAsyncHttpClientFactory() { + public AwsCrtAsyncHttpClient.Builder createAsyncHttpClientFactory() { return AwsCrtAsyncHttpClient.builder(); } + + @Override + public AwsCrtHttpClient.Builder createHttpClientBuilder() { + return AwsCrtHttpClient.builder(); + } } diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtClientBuilderBase.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtClientBuilderBase.java new file mode 100644 index 000000000000..5fb70b7e2512 --- /dev/null +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtClientBuilderBase.java @@ -0,0 +1,135 @@ +/* + * 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.http.crt.internal; + +import java.time.Duration; +import java.util.function.Consumer; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.http.SdkHttpConfigurationOption; +import software.amazon.awssdk.http.crt.ConnectionHealthConfiguration; +import software.amazon.awssdk.http.crt.ProxyConfiguration; +import software.amazon.awssdk.http.crt.TcpKeepAliveConfiguration; +import software.amazon.awssdk.utils.AttributeMap; +import software.amazon.awssdk.utils.Validate; + +@SdkInternalApi +public class AwsCrtClientBuilderBase { + private final AttributeMap.Builder standardOptions = AttributeMap.builder(); + private Long readBufferSize; + private ProxyConfiguration proxyConfiguration; + private ConnectionHealthConfiguration connectionHealthConfiguration; + private TcpKeepAliveConfiguration tcpKeepAliveConfiguration; + private Boolean postQuantumTlsEnabled; + + protected AwsCrtClientBuilderBase() { + } + + protected AttributeMap.Builder getAttributeMap() { + return standardOptions; + } + + private BuilderT thisBuilder() { + return (BuilderT) this; + } + + public BuilderT maxConcurrency(Integer maxConcurrency) { + Validate.isPositiveOrNull(maxConcurrency, "maxConcurrency"); + standardOptions.put(SdkHttpConfigurationOption.MAX_CONNECTIONS, maxConcurrency); + return thisBuilder(); + } + + public BuilderT readBufferSizeInBytes(Long readBufferSize) { + Validate.isPositiveOrNull(readBufferSize, "readBufferSize"); + this.readBufferSize = readBufferSize; + return thisBuilder(); + } + + public Long getReadBufferSizeInBytes() { + return this.readBufferSize; + } + + + public BuilderT proxyConfiguration(ProxyConfiguration proxyConfiguration) { + this.proxyConfiguration = proxyConfiguration; + return thisBuilder(); + } + + public ProxyConfiguration getProxyConfiguration() { + return this.proxyConfiguration; + } + + public BuilderT connectionHealthConfiguration(ConnectionHealthConfiguration monitoringOptions) { + this.connectionHealthConfiguration = monitoringOptions; + return thisBuilder(); + } + + public ConnectionHealthConfiguration getConnectionHealthConfiguration() { + return this.connectionHealthConfiguration; + } + + public BuilderT connectionHealthConfiguration(Consumer + configurationBuilder) { + ConnectionHealthConfiguration.Builder builder = ConnectionHealthConfiguration.builder(); + configurationBuilder.accept(builder); + connectionHealthConfiguration(builder.build()); + return thisBuilder(); + } + + public BuilderT connectionMaxIdleTime(Duration connectionMaxIdleTime) { + Validate.isPositive(connectionMaxIdleTime, "connectionMaxIdleTime"); + standardOptions.put(SdkHttpConfigurationOption.CONNECTION_MAX_IDLE_TIMEOUT, connectionMaxIdleTime); + return thisBuilder(); + } + + public BuilderT connectionTimeout(Duration connectionTimeout) { + Validate.isPositive(connectionTimeout, "connectionTimeout"); + standardOptions.put(SdkHttpConfigurationOption.CONNECTION_TIMEOUT, connectionTimeout); + return thisBuilder(); + } + + public BuilderT tcpKeepAliveConfiguration(TcpKeepAliveConfiguration tcpKeepAliveConfiguration) { + this.tcpKeepAliveConfiguration = tcpKeepAliveConfiguration; + return thisBuilder(); + } + + public TcpKeepAliveConfiguration getTcpKeepAliveConfiguration() { + return this.tcpKeepAliveConfiguration; + } + + public BuilderT tcpKeepAliveConfiguration(Consumer + tcpKeepAliveConfigurationBuilder) { + TcpKeepAliveConfiguration.Builder builder = TcpKeepAliveConfiguration.builder(); + tcpKeepAliveConfigurationBuilder.accept(builder); + tcpKeepAliveConfiguration(builder.build()); + return thisBuilder(); + } + + public BuilderT postQuantumTlsEnabled(Boolean postQuantumTlsEnabled) { + this.postQuantumTlsEnabled = postQuantumTlsEnabled; + return thisBuilder(); + } + + public Boolean getPostQuantumTlsEnabled() { + return this.postQuantumTlsEnabled; + } + + public BuilderT proxyConfiguration(Consumer proxyConfigurationBuilderConsumer) { + ProxyConfiguration.Builder builder = ProxyConfiguration.builder(); + proxyConfigurationBuilderConsumer.accept(builder); + proxyConfiguration(builder.build()); + return thisBuilder(); + } +} \ No newline at end of file diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtAsyncRequestContext.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtAsyncRequestContext.java new file mode 100644 index 000000000000..69db7cb3c5b9 --- /dev/null +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtAsyncRequestContext.java @@ -0,0 +1,84 @@ +/* + * 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.http.crt.internal; + +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.crt.http.HttpClientConnectionManager; +import software.amazon.awssdk.http.async.AsyncExecuteRequest; +import software.amazon.awssdk.metrics.MetricCollector; + +@SdkInternalApi +public final class CrtAsyncRequestContext { + private final AsyncExecuteRequest request; + private final long readBufferSize; + private final HttpClientConnectionManager crtConnPool; + private final MetricCollector metricCollector; + + private CrtAsyncRequestContext(Builder builder) { + this.request = builder.request; + this.readBufferSize = builder.readBufferSize; + this.crtConnPool = builder.crtConnPool; + this.metricCollector = request.metricCollector().orElse(null); + } + + public static Builder builder() { + return new Builder(); + } + + public AsyncExecuteRequest sdkRequest() { + return request; + } + + public long readBufferSize() { + return readBufferSize; + } + + public HttpClientConnectionManager crtConnPool() { + return crtConnPool; + } + + public MetricCollector metricCollector() { + return metricCollector; + } + + public static final class Builder { + private AsyncExecuteRequest request; + private long readBufferSize; + private HttpClientConnectionManager crtConnPool; + + private Builder() { + } + + public Builder request(AsyncExecuteRequest request) { + this.request = request; + return this; + } + + public Builder readBufferSize(long readBufferSize) { + this.readBufferSize = readBufferSize; + return this; + } + + public Builder crtConnPool(HttpClientConnectionManager crtConnPool) { + this.crtConnPool = crtConnPool; + return this; + } + + public CrtAsyncRequestContext build() { + return new CrtAsyncRequestContext(this); + } + } +} diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestContext.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestContext.java index 26e6d3556e4c..420f12e31f44 100644 --- a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestContext.java +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestContext.java @@ -17,12 +17,12 @@ import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.crt.http.HttpClientConnectionManager; -import software.amazon.awssdk.http.async.AsyncExecuteRequest; +import software.amazon.awssdk.http.HttpExecuteRequest; import software.amazon.awssdk.metrics.MetricCollector; @SdkInternalApi public final class CrtRequestContext { - private final AsyncExecuteRequest request; + private final HttpExecuteRequest request; private final long readBufferSize; private final HttpClientConnectionManager crtConnPool; private final MetricCollector metricCollector; @@ -38,7 +38,7 @@ public static Builder builder() { return new Builder(); } - public AsyncExecuteRequest sdkRequest() { + public HttpExecuteRequest sdkRequest() { return request; } @@ -54,15 +54,15 @@ public MetricCollector metricCollector() { return metricCollector; } - public static class Builder { - private AsyncExecuteRequest request; + public static final class Builder { + private HttpExecuteRequest request; private long readBufferSize; private HttpClientConnectionManager crtConnPool; private Builder() { } - public Builder request(AsyncExecuteRequest request) { + public Builder request(HttpExecuteRequest request) { this.request = request; return this; } diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutor.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutor.java index ad4e09bbfe9f..146233beb189 100644 --- a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutor.java +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutor.java @@ -20,11 +20,13 @@ import static software.amazon.awssdk.http.HttpMetric.LEASED_CONCURRENCY; import static software.amazon.awssdk.http.HttpMetric.MAX_CONCURRENCY; import static software.amazon.awssdk.http.HttpMetric.PENDING_CONCURRENCY_ACQUIRES; +import static software.amazon.awssdk.http.crt.internal.CrtUtils.wrapWithIoExceptionIfRetryable; import static software.amazon.awssdk.utils.NumericUtils.saturatedCast; import java.io.IOException; import java.time.Duration; import java.util.concurrent.CompletableFuture; +import javax.net.ssl.SSLHandshakeException; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.crt.CrtRuntimeException; import software.amazon.awssdk.crt.http.HttpClientConnection; @@ -34,19 +36,75 @@ import software.amazon.awssdk.crt.http.HttpRequest; import software.amazon.awssdk.crt.http.HttpStreamResponseHandler; import software.amazon.awssdk.http.SdkCancellationException; +import software.amazon.awssdk.http.SdkHttpFullResponse; import software.amazon.awssdk.http.async.AsyncExecuteRequest; import software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler; import software.amazon.awssdk.http.crt.internal.request.CrtRequestAdapter; import software.amazon.awssdk.http.crt.internal.response.CrtResponseAdapter; +import software.amazon.awssdk.http.crt.internal.response.InputStreamAdaptingHttpStreamResponseHandler; import software.amazon.awssdk.metrics.MetricCollector; import software.amazon.awssdk.metrics.NoOpMetricCollector; import software.amazon.awssdk.utils.Logger; @SdkInternalApi public final class CrtRequestExecutor { + public static final int CRT_TLS_NEGOTIATION_ERROR_CODE = 1029; + private static final Logger log = Logger.loggerFor(CrtRequestExecutor.class); - public CompletableFuture execute(CrtRequestContext executionContext) { + public CompletableFuture execute(CrtRequestContext executionContext) { + // go ahead and get a reference to the metricCollector since multiple futures will + // need it regardless. + MetricCollector metricCollector = executionContext.metricCollector(); + boolean shouldPublishMetrics = metricCollector != null && !(metricCollector instanceof NoOpMetricCollector); + + long acquireStartTime = 0; + + if (shouldPublishMetrics) { + // go ahead and get acquireStartTime for the concurrency timer as early as possible, + // so it's as accurate as possible, but only do it in a branch since clock_gettime() + // results in a full sys call barrier (multiple mutexes and a hw interrupt). + acquireStartTime = System.nanoTime(); + } + + CompletableFuture requestFuture = new CompletableFuture<>(); + + // When a Connection is ready from the Connection Pool, schedule the Request on the connection + CompletableFuture httpClientConnectionCompletableFuture = + executionContext.crtConnPool().acquireConnection(); + + long finalAcquireStartTime = acquireStartTime; + + httpClientConnectionCompletableFuture.whenComplete((crtConn, throwable) -> { + if (shouldPublishMetrics) { + reportMetrics(executionContext.crtConnPool(), metricCollector, finalAcquireStartTime); + } + + // If we didn't get a connection for some reason, fail the request + if (throwable != null) { + Throwable toThrow; + if (throwable instanceof HttpException) { + HttpException httpException = (HttpException) throwable; + + if (httpException.getErrorCode() == CRT_TLS_NEGOTIATION_ERROR_CODE) { + toThrow = new SSLHandshakeException(httpException.getMessage()); + } else { + toThrow = new IOException(httpException.getMessage(), httpException); + } + } else { + toThrow = new IOException("An exception occurred when acquiring a connection", throwable); + } + requestFuture.completeExceptionally(toThrow); + return; + } + + executeRequest(executionContext, requestFuture, crtConn); + }); + + return requestFuture; + } + + public CompletableFuture execute(CrtAsyncRequestContext executionContext) { // go ahead and get a reference to the metricCollector since multiple futures will // need it regardless. MetricCollector metricCollector = executionContext.metricCollector(); @@ -61,7 +119,7 @@ public CompletableFuture execute(CrtRequestContext executionContext) { acquireStartTime = System.nanoTime(); } - CompletableFuture requestFuture = createExecutionFuture(executionContext.sdkRequest()); + CompletableFuture requestFuture = createAsyncExecutionFuture(executionContext.sdkRequest()); // When a Connection is ready from the Connection Pool, schedule the Request on the connection CompletableFuture httpClientConnectionCompletableFuture = @@ -73,15 +131,21 @@ public CompletableFuture execute(CrtRequestContext executionContext) { AsyncExecuteRequest asyncRequest = executionContext.sdkRequest(); if (shouldPublishMetrics) { - reportMetrics(executionContext, metricCollector, finalAcquireStartTime); + reportMetrics(executionContext.crtConnPool(), metricCollector, finalAcquireStartTime); } // If we didn't get a connection for some reason, fail the request if (throwable != null) { - reportFailure(crtConn, - new IOException("An exception occurred when acquiring a connection", throwable), - requestFuture, - asyncRequest.responseHandler()); + Throwable toThrow = new IOException("An exception occurred when acquiring a connection", throwable); + if (throwable instanceof HttpException) { + HttpException httpException = (HttpException) throwable; + + if (httpException.getErrorCode() == CRT_TLS_NEGOTIATION_ERROR_CODE) { + toThrow = new SSLHandshakeException(httpException.getMessage()); + } + } + + reportAsyncFailure(crtConn, toThrow, requestFuture, asyncRequest.responseHandler()); return; } @@ -91,12 +155,11 @@ public CompletableFuture execute(CrtRequestContext executionContext) { return requestFuture; } - private static void reportMetrics(CrtRequestContext executionContext, MetricCollector metricCollector, - long acquireStartTime) { + private static void reportMetrics(HttpClientConnectionManager connManager, MetricCollector metricCollector, + long acquireStartTime) { long acquireCompletionTime = System.nanoTime(); Duration acquireTimeTaken = Duration.ofNanos(acquireCompletionTime - acquireStartTime); metricCollector.reportMetric(CONCURRENCY_ACQUIRE_DURATION, acquireTimeTaken); - HttpClientConnectionManager connManager = executionContext.crtConnPool(); HttpManagerMetrics managerMetrics = connManager.getManagerMetrics(); // currently this executor only handles HTTP 1.1. Until H2 is added, the max concurrency settings are 1:1 with TCP // connections. When H2 is added, this code needs to be updated to handle stream multiplexing @@ -106,11 +169,11 @@ private static void reportMetrics(CrtRequestContext executionContext, MetricColl metricCollector.reportMetric(PENDING_CONCURRENCY_ACQUIRES, saturatedCast(managerMetrics.getPendingConcurrencyAcquires())); } - private void executeRequest(CrtRequestContext executionContext, + private void executeRequest(CrtAsyncRequestContext executionContext, CompletableFuture requestFuture, HttpClientConnection crtConn, AsyncExecuteRequest asyncRequest) { - HttpRequest crtRequest = CrtRequestAdapter.toCrtRequest(executionContext); + HttpRequest crtRequest = CrtRequestAdapter.toAsyncCrtRequest(executionContext); HttpStreamResponseHandler crtResponseHandler = CrtResponseAdapter.toCrtResponseHandler(crtConn, requestFuture, asyncRequest.responseHandler()); @@ -118,29 +181,46 @@ private void executeRequest(CrtRequestContext executionContext, try { crtConn.makeRequest(crtRequest, crtResponseHandler).activate(); } catch (HttpException e) { - Throwable toThrow = e; - if (HttpClientConnection.isErrorRetryable(e)) { - // IOExceptions get retried, and if the CRT says this error is retryable, - // it's semantically an IOException anyway. - toThrow = new IOException(e); - } - reportFailure(crtConn, + Throwable toThrow = wrapWithIoExceptionIfRetryable(e); + reportAsyncFailure(crtConn, toThrow, requestFuture, asyncRequest.responseHandler()); } catch (IllegalStateException | CrtRuntimeException e) { // CRT throws IllegalStateException if the connection is closed - reportFailure(crtConn, new IOException("An exception occurred when making the request", e), + reportAsyncFailure(crtConn, new IOException("An exception occurred when making the request", e), requestFuture, asyncRequest.responseHandler()); } } + private void executeRequest(CrtRequestContext executionContext, + CompletableFuture requestFuture, + HttpClientConnection crtConn) { + HttpRequest crtRequest = CrtRequestAdapter.toCrtRequest(executionContext); + + try { + HttpStreamResponseHandler crtResponseHandler = new InputStreamAdaptingHttpStreamResponseHandler(crtConn, + requestFuture); + + // Submit the request on the connection + crtConn.makeRequest(crtRequest, crtResponseHandler).activate(); + } catch (HttpException e) { + crtConn.close(); + + Throwable toThrow = wrapWithIoExceptionIfRetryable(e); + requestFuture.completeExceptionally(toThrow); + } catch (IllegalStateException | CrtRuntimeException e) { + crtConn.close(); + requestFuture.completeExceptionally(e); + } + } + /** * Create the execution future and set up the cancellation logic. * @return The created execution future. */ - private CompletableFuture createExecutionFuture(AsyncExecuteRequest request) { + private CompletableFuture createAsyncExecutionFuture(AsyncExecuteRequest request) { CompletableFuture future = new CompletableFuture<>(); future.whenComplete((r, t) -> { @@ -160,7 +240,7 @@ private CompletableFuture createExecutionFuture(AsyncExecuteRequest reques /** * Notify the provided response handler and future of the failure. */ - private void reportFailure(HttpClientConnection crtConn, + private void reportAsyncFailure(HttpClientConnection crtConn, Throwable cause, CompletableFuture executeFuture, SdkAsyncHttpResponseHandler responseHandler) { diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtUtils.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtUtils.java new file mode 100644 index 000000000000..48405ac682aa --- /dev/null +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtUtils.java @@ -0,0 +1,38 @@ +/* + * 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.http.crt.internal; + +import java.io.IOException; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.crt.http.HttpClientConnection; +import software.amazon.awssdk.crt.http.HttpException; + +@SdkInternalApi +public final class CrtUtils { + + private CrtUtils() { + } + + public static Throwable wrapWithIoExceptionIfRetryable(HttpException httpException) { + Throwable toThrow = httpException; + if (HttpClientConnection.isErrorRetryable(httpException)) { + // IOExceptions get retried, and if the CRT says this error is retryable, + // it's semantically an IOException anyway. + toThrow = new IOException(httpException); + } + return toThrow; + } +} diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestAdapter.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestAdapter.java index f2a221ba6997..10b658a835df 100644 --- a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestAdapter.java +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestAdapter.java @@ -23,8 +23,10 @@ import software.amazon.awssdk.crt.http.HttpHeader; import software.amazon.awssdk.crt.http.HttpRequest; import software.amazon.awssdk.http.Header; +import software.amazon.awssdk.http.HttpExecuteRequest; import software.amazon.awssdk.http.SdkHttpRequest; import software.amazon.awssdk.http.async.AsyncExecuteRequest; +import software.amazon.awssdk.http.crt.internal.CrtAsyncRequestContext; import software.amazon.awssdk.http.crt.internal.CrtRequestContext; @SdkInternalApi @@ -32,7 +34,7 @@ public final class CrtRequestAdapter { private CrtRequestAdapter() { } - public static HttpRequest toCrtRequest(CrtRequestContext request) { + public static HttpRequest toAsyncCrtRequest(CrtAsyncRequestContext request) { AsyncExecuteRequest sdkExecuteRequest = request.sdkRequest(); SdkHttpRequest sdkRequest = sdkExecuteRequest.request(); @@ -46,7 +48,7 @@ public static HttpRequest toCrtRequest(CrtRequestContext request) { .map(value -> "?" + value) .orElse(""); - HttpHeader[] crtHeaderArray = asArray(createHttpHeaderList(sdkRequest.getUri(), sdkExecuteRequest)); + HttpHeader[] crtHeaderArray = asArray(createAsyncHttpHeaderList(sdkRequest.getUri(), sdkExecuteRequest)); return new HttpRequest(method, encodedPath + encodedQueryString, @@ -55,11 +57,39 @@ public static HttpRequest toCrtRequest(CrtRequestContext request) { request.readBufferSize())); } + public static HttpRequest toCrtRequest(CrtRequestContext request) { + + HttpExecuteRequest sdkExecuteRequest = request.sdkRequest(); + SdkHttpRequest sdkRequest = sdkExecuteRequest.httpRequest(); + + String method = sdkRequest.method().name(); + String encodedPath = sdkRequest.encodedPath(); + if (encodedPath == null || encodedPath.isEmpty()) { + encodedPath = "/"; + } + + String encodedQueryString = sdkRequest.encodedQueryParameters() + .map(value -> "?" + value) + .orElse(""); + + HttpHeader[] crtHeaderArray = asArray(createHttpHeaderList(sdkRequest.getUri(), sdkExecuteRequest)); + + String finalEncodedPath = encodedPath + encodedQueryString; + return sdkExecuteRequest.contentStreamProvider() + .map(provider -> new HttpRequest(method, + finalEncodedPath, + crtHeaderArray, + new CrtRequestInputStreamAdapter(provider))) + .orElse(new HttpRequest(method, + finalEncodedPath, + crtHeaderArray, null)); + } + private static HttpHeader[] asArray(List crtHeaderList) { return crtHeaderList.toArray(new HttpHeader[0]); } - private static List createHttpHeaderList(URI uri, AsyncExecuteRequest sdkExecuteRequest) { + private static List createAsyncHttpHeaderList(URI uri, AsyncExecuteRequest sdkExecuteRequest) { SdkHttpRequest sdkRequest = sdkExecuteRequest.request(); // worst case we may add 3 more headers here List crtHeaderList = new ArrayList<>(sdkRequest.numHeaders() + 3); @@ -81,9 +111,30 @@ private static List createHttpHeaderList(URI uri, AsyncExecuteReques } // Add the rest of the Headers - sdkRequest.forEachHeader((key, value) -> { - value.stream().map(val -> new HttpHeader(key, val)).forEach(crtHeaderList::add); - }); + sdkRequest.forEachHeader((key, value) -> value.stream().map(val -> new HttpHeader(key, val)).forEach(crtHeaderList::add)); + + return crtHeaderList; + } + + private static List createHttpHeaderList(URI uri, HttpExecuteRequest sdkExecuteRequest) { + SdkHttpRequest sdkRequest = sdkExecuteRequest.httpRequest(); + // worst case we may add 3 more headers here + List crtHeaderList = new ArrayList<>(sdkRequest.numHeaders() + 3); + + // Set Host Header if needed + if (!sdkRequest.firstMatchingHeader(Header.HOST).isPresent()) { + crtHeaderList.add(new HttpHeader(Header.HOST, uri.getHost())); + } + + // Add Connection Keep Alive Header to reuse this Http Connection as long as possible + if (!sdkRequest.firstMatchingHeader(Header.CONNECTION).isPresent()) { + crtHeaderList.add(new HttpHeader(Header.CONNECTION, Header.KEEP_ALIVE_VALUE)); + } + + // We assume content length was set by the caller if a stream was present, so don't set it here. + + // Add the rest of the Headers + sdkRequest.forEachHeader((key, value) -> value.stream().map(val -> new HttpHeader(key, val)).forEach(crtHeaderList::add)); return crtHeaderList; } diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestInputStreamAdapter.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestInputStreamAdapter.java new file mode 100644 index 000000000000..68f418b9e1df --- /dev/null +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/request/CrtRequestInputStreamAdapter.java @@ -0,0 +1,78 @@ +/* + * 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.http.crt.internal.request; + +import static java.lang.Math.min; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.crt.http.HttpRequestBodyStream; +import software.amazon.awssdk.http.ContentStreamProvider; + +@SdkInternalApi +final class CrtRequestInputStreamAdapter implements HttpRequestBodyStream { + private static final int READ_BUFFER_SIZE = 16 * 1024; + + private final ContentStreamProvider provider; + private volatile InputStream providerStream; + private final byte[] readBuffer = new byte[READ_BUFFER_SIZE]; + + CrtRequestInputStreamAdapter(ContentStreamProvider provider) { + this.provider = provider; + } + + @Override + public boolean sendRequestBody(ByteBuffer bodyBytesOut) { + int read; + + try { + if (providerStream == null) { + createNewStream(); + } + + int toRead = min(READ_BUFFER_SIZE, bodyBytesOut.remaining()); + read = providerStream.read(readBuffer, 0, toRead); + + if (read > 0) { + bodyBytesOut.put(readBuffer, 0, read); + } + } catch (IOException ioe) { + throw new RuntimeException(ioe); + } + + return read < 0; + } + + @Override + public boolean resetPosition() { + try { + createNewStream(); + } catch (IOException ioe) { + throw new RuntimeException(ioe); + } + + return true; + } + + private void createNewStream() throws IOException { + if (providerStream != null) { + providerStream.close(); + } + providerStream = provider.newStream(); + } +} diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/CrtResponseAdapter.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/CrtResponseAdapter.java index 081b002fff07..b2865ac49531 100644 --- a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/CrtResponseAdapter.java +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/CrtResponseAdapter.java @@ -15,7 +15,8 @@ package software.amazon.awssdk.http.crt.internal.response; -import java.io.IOException; +import static software.amazon.awssdk.http.crt.internal.CrtUtils.wrapWithIoExceptionIfRetryable; + import java.nio.ByteBuffer; import java.util.concurrent.CompletableFuture; import software.amazon.awssdk.annotations.SdkInternalApi; @@ -29,11 +30,14 @@ import software.amazon.awssdk.http.HttpStatusFamily; import software.amazon.awssdk.http.SdkHttpResponse; import software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler; +import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient; import software.amazon.awssdk.utils.Logger; import software.amazon.awssdk.utils.Validate; import software.amazon.awssdk.utils.async.SimplePublisher; /** + * Response handler adaptor for {@link AwsCrtAsyncHttpClient}. + *

* Implements the CrtHttpStreamHandler API and converts CRT callbacks into calls to SDK AsyncExecuteRequest methods */ @SdkInternalApi @@ -129,14 +133,7 @@ private void onSuccessfulResponseComplete(HttpStream stream) { private void onFailedResponseComplete(HttpStream stream, HttpException error) { log.debug(() -> "HTTP response encountered an error.", error); - Throwable toThrow = error; - - if (HttpClientConnection.isErrorRetryable(error)) { - // IOExceptions get retried, and if the CRT says this error is retryable, - // it's semantically an IOException anyway. - toThrow = new IOException(error); - } - + Throwable toThrow = wrapWithIoExceptionIfRetryable(error);; responsePublisher.error(toThrow); failResponseHandlerAndFuture(stream, toThrow); } diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/InputStreamAdaptingHttpStreamResponseHandler.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/InputStreamAdaptingHttpStreamResponseHandler.java new file mode 100644 index 000000000000..b1bf4462be89 --- /dev/null +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/response/InputStreamAdaptingHttpStreamResponseHandler.java @@ -0,0 +1,136 @@ +/* + * 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.http.crt.internal.response; + +import static software.amazon.awssdk.http.crt.internal.CrtUtils.wrapWithIoExceptionIfRetryable; + +import java.nio.ByteBuffer; +import java.util.concurrent.CompletableFuture; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.crt.CRT; +import software.amazon.awssdk.crt.http.HttpClientConnection; +import software.amazon.awssdk.crt.http.HttpException; +import software.amazon.awssdk.crt.http.HttpHeader; +import software.amazon.awssdk.crt.http.HttpHeaderBlock; +import software.amazon.awssdk.crt.http.HttpStream; +import software.amazon.awssdk.crt.http.HttpStreamResponseHandler; +import software.amazon.awssdk.http.AbortableInputStream; +import software.amazon.awssdk.http.HttpStatusFamily; +import software.amazon.awssdk.http.SdkHttpFullResponse; +import software.amazon.awssdk.http.crt.AwsCrtHttpClient; +import software.amazon.awssdk.utils.async.InputStreamSubscriber; +import software.amazon.awssdk.utils.async.SimplePublisher; + +/** + * Response handler adaptor for {@link AwsCrtHttpClient}. + */ +@SdkInternalApi +public final class InputStreamAdaptingHttpStreamResponseHandler implements HttpStreamResponseHandler { + private final SdkHttpFullResponse.Builder responseBuilder = SdkHttpFullResponse.builder(); + private volatile InputStreamSubscriber inputStreamSubscriber; + private final SimplePublisher simplePublisher = new SimplePublisher<>(); + + private final CompletableFuture requestCompletionFuture; + private final HttpClientConnection crtConn; + + public InputStreamAdaptingHttpStreamResponseHandler(HttpClientConnection crtConn, + CompletableFuture requestCompletionFuture) { + this.crtConn = crtConn; + this.requestCompletionFuture = requestCompletionFuture; + } + + @Override + public void onResponseHeaders(HttpStream stream, int responseStatusCode, int blockType, + HttpHeader[] nextHeaders) { + if (blockType == HttpHeaderBlock.MAIN.getValue()) { + for (HttpHeader h : nextHeaders) { + responseBuilder.appendHeader(h.getName(), h.getValue()); + } + } + + responseBuilder.statusCode(responseStatusCode); + } + + @Override + public int onResponseBody(HttpStream stream, byte[] bodyBytesIn) { + if (inputStreamSubscriber == null) { + inputStreamSubscriber = new InputStreamSubscriber(); + simplePublisher.subscribe(inputStreamSubscriber); + // For response with a payload, we need to complete the future here to allow downstream to retrieve the data from + // the stream directly. + responseBuilder.content(AbortableInputStream.create(inputStreamSubscriber)); + requestCompletionFuture.complete(responseBuilder.build()); + } + + CompletableFuture writeFuture = simplePublisher.send(ByteBuffer.wrap(bodyBytesIn)); + + if (writeFuture.isDone() && !writeFuture.isCompletedExceptionally()) { + // Optimization: If write succeeded immediately, return non-zero to avoid the extra call back into the CRT. + return bodyBytesIn.length; + } + + writeFuture.whenComplete((result, failure) -> { + if (failure != null) { + failFutureAndCloseConnection(stream, failure); + return; + } + + // increment the window upon buffer consumption. + stream.incrementWindow(bodyBytesIn.length); + }); + + // the bodyBytesIn have not cleared the queues yet, so do let backpressure do its thing. + return 0; + } + + @Override + public void onResponseComplete(HttpStream stream, int errorCode) { + if (errorCode == CRT.AWS_CRT_SUCCESS) { + onSuccessfulResponseComplete(stream); + } else { + onFailedResponseComplete(stream, errorCode); + } + } + + private void failFutureAndCloseConnection(HttpStream stream, Throwable failure) { + requestCompletionFuture.completeExceptionally(failure); + crtConn.shutdown(); + crtConn.close(); + stream.close(); + } + + private void onFailedResponseComplete(HttpStream stream, int errorCode) { + Throwable toThrow = + wrapWithIoExceptionIfRetryable(new HttpException(errorCode)); + + simplePublisher.error(toThrow); + failFutureAndCloseConnection(stream, toThrow); + } + + private void onSuccessfulResponseComplete(HttpStream stream) { + // always close the connection on a 5XX response code. + if (HttpStatusFamily.of(responseBuilder.statusCode()) == HttpStatusFamily.SERVER_ERROR) { + crtConn.shutdown(); + } + + // For response without a payload, for example, S3 PutObjectResponse, we need to complete the future + // in onResponseComplete callback since onResponseBody will never be invoked. + requestCompletionFuture.complete(responseBuilder.build()); + simplePublisher.complete(); + crtConn.close(); + stream.close(); + } +} diff --git a/http-clients/aws-crt-client/src/main/resources/META-INF/services/software.amazon.awssdk.http.SdkHttpService b/http-clients/aws-crt-client/src/main/resources/META-INF/services/software.amazon.awssdk.http.SdkHttpService new file mode 100644 index 000000000000..f0312a3b901d --- /dev/null +++ b/http-clients/aws-crt-client/src/main/resources/META-INF/services/software.amazon.awssdk.http.SdkHttpService @@ -0,0 +1,16 @@ +# +# 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. +# + +software.amazon.awssdk.http.crt.AwsCrtSdkHttpService diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClientSpiVerificationTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClientSpiVerificationTest.java new file mode 100644 index 000000000000..45de4ba201f0 --- /dev/null +++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClientSpiVerificationTest.java @@ -0,0 +1,318 @@ +/* + * 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.http.crt; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.any; +import static com.github.tomakehurst.wiremock.client.WireMock.binaryEqualTo; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static java.util.Collections.emptyMap; +import static org.apache.commons.codec.digest.DigestUtils.sha256Hex; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static software.amazon.awssdk.http.HttpTestUtils.createProvider; +import static software.amazon.awssdk.http.crt.CrtHttpClientTestUtils.createRequest; + +import com.github.tomakehurst.wiremock.http.Fault; +import com.github.tomakehurst.wiremock.junit.WireMockRule; +import java.io.IOException; +import java.net.URI; +import java.nio.ByteBuffer; +import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.reactivestreams.Publisher; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; +import software.amazon.awssdk.crt.CrtResource; +import software.amazon.awssdk.crt.Log; +import software.amazon.awssdk.crt.http.HttpException; +import software.amazon.awssdk.http.RecordingResponseHandler; +import software.amazon.awssdk.http.SdkHttpMethod; +import software.amazon.awssdk.http.SdkHttpRequest; +import software.amazon.awssdk.http.SdkHttpResponse; +import software.amazon.awssdk.http.async.AsyncExecuteRequest; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler; + +public class AwsCrtAsyncHttpClientSpiVerificationTest { + private static final int TEST_BODY_LEN = 1024; + + @Rule + public WireMockRule mockServer = new WireMockRule(wireMockConfig() + .dynamicPort() + .dynamicHttpsPort()); + + private static SdkAsyncHttpClient client; + + @BeforeClass + public static void setup() throws Exception { + System.setProperty("aws.crt.debugnative", "true"); + Log.initLoggingToStdout(Log.LogLevel.Warn); + client = AwsCrtAsyncHttpClient.builder() + .connectionHealthConfiguration(b -> b.minimumThroughputInBps(4068L) + .minimumThroughputTimeout(Duration.ofSeconds(3))) + .build(); + } + + @AfterClass + public static void tearDown() { + client.close(); + CrtResource.waitForNoResources(); + } + + private byte[] generateRandomBody(int size) { + byte[] randomData = new byte[size]; + new Random().nextBytes(randomData); + return randomData; + } + + @Test + public void signalsErrorViaOnErrorAndFuture() throws Exception { + stubFor(any(urlEqualTo("/")).willReturn(aResponse().withFault(Fault.RANDOM_DATA_THEN_CLOSE))); + + CompletableFuture errorSignaled = new CompletableFuture<>(); + + SdkAsyncHttpResponseHandler handler = new TestResponseHandler() { + @Override + public void onError(Throwable error) { + errorSignaled.complete(true); + } + }; + + SdkHttpRequest request = createRequest(URI.create("http://localhost:" + mockServer.port())); + + CompletableFuture executeFuture = client.execute(AsyncExecuteRequest.builder() + .request(request) + .responseHandler(handler) + .requestContentPublisher(new EmptyPublisher()) + .build()); + + assertThat(errorSignaled.get(1, TimeUnit.SECONDS)).isTrue(); + assertThatThrownBy(executeFuture::join).hasCauseInstanceOf(IOException.class).hasRootCauseInstanceOf(HttpException.class); + } + + @Test + public void requestFailed_connectionTimeout_shouldWrapException() { + try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.builder().connectionTimeout(Duration.ofNanos(1)).build()) { + URI uri = URI.create("http://localhost:" + mockServer.port()); + stubFor(any(urlPathEqualTo("/")).willReturn(aResponse().withFault(Fault.RANDOM_DATA_THEN_CLOSE))); + SdkHttpRequest request = createRequest(uri); + RecordingResponseHandler recorder = new RecordingResponseHandler(); + client.execute(AsyncExecuteRequest.builder().request(request).requestContentPublisher(createProvider("")).responseHandler(recorder).build()); + assertThatThrownBy(() -> recorder.completeFuture().get(5, TimeUnit.SECONDS)).hasCauseInstanceOf(IOException.class) + .hasRootCauseInstanceOf(HttpException.class); + } + } + + @Test + public void requestFailed_notRetryable_shouldNotWrapException() { + try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.builder().build()) { + URI uri = URI.create("http://localhost:" + mockServer.port()); + // make it invalid by doing a non-zero content length with no request body... + Map> headers = new HashMap<>(); + headers.put("host", Collections.singletonList(uri.getHost())); + + List contentLengthValues = new LinkedList<>(); + contentLengthValues.add("1"); + headers.put("content-length", contentLengthValues); + + SdkHttpRequest request = createRequest(uri).toBuilder().headers(headers).build(); + + RecordingResponseHandler recorder = new RecordingResponseHandler(); + client.execute(AsyncExecuteRequest.builder().request(request).requestContentPublisher(new EmptyPublisher()).responseHandler(recorder).build()); + // invalid request should have returned an HttpException and not an IOException. + assertThatThrownBy(() -> recorder.completeFuture().get(5, TimeUnit.SECONDS)) + .hasCauseInstanceOf(HttpException.class).hasMessageContaining("does not match the previously declared length"); + } + } + + @Test + public void callsOnStreamForEmptyResponseContent() throws Exception { + stubFor(any(urlEqualTo("/")).willReturn(aResponse().withStatus(204).withHeader("foo", "bar"))); + + CompletableFuture streamReceived = new CompletableFuture<>(); + AtomicReference response = new AtomicReference<>(null); + + SdkAsyncHttpResponseHandler handler = new TestResponseHandler() { + @Override + public void onHeaders(SdkHttpResponse headers) { + response.compareAndSet(null, headers); + } + @Override + public void onStream(Publisher stream) { + super.onStream(stream); + streamReceived.complete(true); + } + }; + + SdkHttpRequest request = createRequest(URI.create("http://localhost:" + mockServer.port())); + + CompletableFuture future = client.execute(AsyncExecuteRequest.builder() + .request(request) + .responseHandler(handler) + .requestContentPublisher(new EmptyPublisher()) + .build()); + + future.get(60, TimeUnit.SECONDS); + assertThat(streamReceived.get(1, TimeUnit.SECONDS)).isTrue(); + assertThat(response.get() != null).isTrue(); + assertThat(response.get().statusCode() == 204).isTrue(); + assertThat(response.get().headers().get("foo").isEmpty()).isFalse(); + } + + @Test + public void testGetRequest() throws Exception { + String path = "/testGetRequest"; + byte[] body = generateRandomBody(TEST_BODY_LEN); + String expectedBodyHash = sha256Hex(body).toUpperCase(); + stubFor(any(urlEqualTo(path)).willReturn(aResponse().withStatus(200) + .withHeader("Content-Length", Integer.toString(TEST_BODY_LEN)) + .withHeader("foo", "bar") + .withBody(body))); + + CompletableFuture streamReceived = new CompletableFuture<>(); + AtomicReference response = new AtomicReference<>(null); + Sha256BodySubscriber bodySha256Subscriber = new Sha256BodySubscriber(); + AtomicReference error = new AtomicReference<>(null); + + SdkAsyncHttpResponseHandler handler = new SdkAsyncHttpResponseHandler() { + @Override + public void onHeaders(SdkHttpResponse headers) { + response.compareAndSet(null, headers); + } + @Override + public void onStream(Publisher stream) { + stream.subscribe(bodySha256Subscriber); + streamReceived.complete(true); + } + + @Override + public void onError(Throwable t) { + error.compareAndSet(null, t); + } + }; + + URI uri = URI.create("http://localhost:" + mockServer.port()); + SdkHttpRequest request = createRequest(uri, path, null, SdkHttpMethod.GET, emptyMap()); + + CompletableFuture future = client.execute(AsyncExecuteRequest.builder() + .request(request) + .responseHandler(handler) + .requestContentPublisher(new EmptyPublisher()) + .build()); + + future.get(60, TimeUnit.SECONDS); + assertThat(error.get()).isNull(); + assertThat(streamReceived.get(1, TimeUnit.SECONDS)).isTrue(); + assertThat(bodySha256Subscriber.getFuture().get(60, TimeUnit.SECONDS)).isEqualTo(expectedBodyHash); + assertThat(response.get().statusCode()).isEqualTo(200); + assertThat(response.get().headers().get("foo").isEmpty()).isFalse(); + } + + + private void makePutRequest(String path, byte[] reqBody, int expectedStatus) throws Exception { + CompletableFuture streamReceived = new CompletableFuture<>(); + AtomicReference response = new AtomicReference<>(null); + AtomicReference error = new AtomicReference<>(null); + + Subscriber subscriber = CrtHttpClientTestUtils.createDummySubscriber(); + + SdkAsyncHttpResponseHandler handler = CrtHttpClientTestUtils.createTestResponseHandler(response, + streamReceived, error, subscriber); + + URI uri = URI.create("http://localhost:" + mockServer.port()); + SdkHttpRequest request = createRequest(uri, path, reqBody, SdkHttpMethod.PUT, emptyMap()); + + CompletableFuture future = client.execute(AsyncExecuteRequest.builder() + .request(request) + .responseHandler(handler) + .requestContentPublisher(new SdkTestHttpContentPublisher(reqBody)) + .build()); + future.get(60, TimeUnit.SECONDS); + assertThat(error.get()).isNull(); + assertThat(streamReceived.get(60, TimeUnit.SECONDS)).isTrue(); + assertThat(response.get().statusCode()).isEqualTo(expectedStatus); + } + + + @Test + public void testPutRequest() throws Exception { + String pathExpect200 = "/testPutRequest/return_200_on_exact_match"; + byte[] expectedBody = generateRandomBody(TEST_BODY_LEN); + stubFor(any(urlEqualTo(pathExpect200)).withRequestBody(binaryEqualTo(expectedBody)).willReturn(aResponse().withStatus(200))); + makePutRequest(pathExpect200, expectedBody, 200); + + String pathExpect404 = "/testPutRequest/return_404_always"; + byte[] randomBody = generateRandomBody(TEST_BODY_LEN); + stubFor(any(urlEqualTo(pathExpect404)).willReturn(aResponse().withStatus(404))); + makePutRequest(pathExpect404, randomBody, 404); + } + + + + private static class TestResponseHandler implements SdkAsyncHttpResponseHandler { + @Override + public void onHeaders(SdkHttpResponse headers) { + } + + @Override + public void onStream(Publisher stream) { + stream.subscribe(new DrainingSubscriber<>()); + } + + @Override + public void onError(Throwable error) { + } + } + + private static class DrainingSubscriber implements Subscriber { + private Subscription subscription; + + @Override + public void onSubscribe(Subscription subscription) { + this.subscription = subscription; + this.subscription.request(Long.MAX_VALUE); + } + + @Override + public void onNext(T t) { + this.subscription.request(1); + } + + @Override + public void onError(Throwable throwable) { + } + + @Override + public void onComplete() { + } + } +} diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClientWireMockTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClientWireMockTest.java new file mode 100644 index 000000000000..eecfb533ec0c --- /dev/null +++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClientWireMockTest.java @@ -0,0 +1,128 @@ +/* + * 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.http.crt; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.any; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static software.amazon.awssdk.http.HttpTestUtils.createProvider; +import static software.amazon.awssdk.http.SdkHttpConfigurationOption.PROTOCOL; +import static software.amazon.awssdk.http.crt.CrtHttpClientTestUtils.createRequest; + +import com.github.tomakehurst.wiremock.junit.WireMockRule; +import java.net.URI; +import java.util.concurrent.TimeUnit; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import software.amazon.awssdk.crt.CrtResource; +import software.amazon.awssdk.crt.Log; +import software.amazon.awssdk.http.HttpMetric; +import software.amazon.awssdk.http.Protocol; +import software.amazon.awssdk.http.RecordingResponseHandler; +import software.amazon.awssdk.http.SdkHttpRequest; +import software.amazon.awssdk.http.async.AsyncExecuteRequest; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.metrics.MetricCollection; +import software.amazon.awssdk.utils.AttributeMap; + +public class AwsCrtAsyncHttpClientWireMockTest { + @Rule + public WireMockRule mockServer = new WireMockRule(wireMockConfig() + .dynamicPort()); + + @BeforeClass + public static void setup() { + System.setProperty("aws.crt.debugnative", "true"); + Log.initLoggingToStdout(Log.LogLevel.Warn); + } + + @AfterClass + public static void tearDown() { + // Verify there is no resource leak. + CrtResource.waitForNoResources(); + } + + @Test + public void closeClient_reuse_throwException() { + SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.create(); + + client.close(); + assertThatThrownBy(() -> makeSimpleRequest(client)).hasMessageContaining("is closed"); + } + + @Test + public void invalidProtocol_shouldThrowException() { + AttributeMap attributeMap = AttributeMap.builder() + .put(PROTOCOL, Protocol.HTTP2) + .build(); + assertThatThrownBy(() -> AwsCrtAsyncHttpClient.builder().buildWithDefaults(attributeMap)) + .isInstanceOf(UnsupportedOperationException.class); + } + + @Test + public void sendRequest_withCollector_shouldCollectMetrics() throws Exception { + + try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.builder().maxConcurrency(10).build()) { + RecordingResponseHandler recorder = makeSimpleRequest(client); + MetricCollection metrics = recorder.collector().collect(); + + assertThat(metrics.metricValues(HttpMetric.HTTP_CLIENT_NAME)).containsExactly("AwsCommonRuntime"); + assertThat(metrics.metricValues(HttpMetric.MAX_CONCURRENCY)).containsExactly(10); + assertThat(metrics.metricValues(HttpMetric.PENDING_CONCURRENCY_ACQUIRES)).containsExactly(0); + assertThat(metrics.metricValues(HttpMetric.LEASED_CONCURRENCY)).containsExactly(1); + assertThat(metrics.metricValues(HttpMetric.AVAILABLE_CONCURRENCY)).containsExactly(0); + } + } + + @Test + public void sharedEventLoopGroup_closeOneClient_shouldNotAffectOtherClients() throws Exception { + try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.create()) { + makeSimpleRequest(client); + } + + try (SdkAsyncHttpClient anotherClient = AwsCrtAsyncHttpClient.create()) { + makeSimpleRequest(anotherClient); + } + } + + /** + * Make a simple async request and wait for it to finish. + * + * @param client Client to make request with. + */ + private RecordingResponseHandler makeSimpleRequest(SdkAsyncHttpClient client) throws Exception { + String body = randomAlphabetic(10); + URI uri = URI.create("http://localhost:" + mockServer.port()); + stubFor(any(urlPathEqualTo("/")).willReturn(aResponse().withBody(body))); + SdkHttpRequest request = createRequest(uri); + RecordingResponseHandler recorder = new RecordingResponseHandler(); + client.execute(AsyncExecuteRequest.builder() + .request(request) + .requestContentPublisher(createProvider("")) + .responseHandler(recorder) + .metricCollector(recorder.collector()) + .build()); + recorder.completeFuture().get(5, TimeUnit.SECONDS); + return recorder; + } +} diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientSpiVerificationTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientSpiVerificationTest.java index 3d0ccab3fd7c..0777525c83ca 100644 --- a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientSpiVerificationTest.java +++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientSpiVerificationTest.java @@ -23,17 +23,14 @@ import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; import static java.util.Collections.emptyMap; -import static org.apache.commons.codec.digest.DigestUtils.sha256Hex; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static software.amazon.awssdk.http.HttpTestUtils.createProvider; import static software.amazon.awssdk.http.crt.CrtHttpClientTestUtils.createRequest; import com.github.tomakehurst.wiremock.http.Fault; import com.github.tomakehurst.wiremock.junit.WireMockRule; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.URI; -import java.nio.ByteBuffer; import java.time.Duration; import java.util.Collections; import java.util.HashMap; @@ -41,29 +38,21 @@ import java.util.List; import java.util.Map; import java.util.Random; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; -import org.reactivestreams.Publisher; -import org.reactivestreams.Subscriber; -import org.reactivestreams.Subscription; import software.amazon.awssdk.crt.CrtResource; +import software.amazon.awssdk.crt.Log; import software.amazon.awssdk.crt.http.HttpException; -import software.amazon.awssdk.http.RecordingResponseHandler; +import software.amazon.awssdk.http.ExecutableHttpRequest; +import software.amazon.awssdk.http.HttpExecuteRequest; +import software.amazon.awssdk.http.HttpExecuteResponse; +import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.SdkHttpMethod; import software.amazon.awssdk.http.SdkHttpRequest; -import software.amazon.awssdk.http.SdkHttpResponse; -import software.amazon.awssdk.http.async.AsyncExecuteRequest; -import software.amazon.awssdk.http.async.SdkAsyncHttpClient; -import software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler; -import software.amazon.awssdk.utils.Logger; public class AwsCrtHttpClientSpiVerificationTest { - private static final Logger log = Logger.loggerFor(AwsCrtHttpClientSpiVerificationTest.class); private static final int TEST_BODY_LEN = 1024; @Rule @@ -71,14 +60,16 @@ public class AwsCrtHttpClientSpiVerificationTest { .dynamicPort() .dynamicHttpsPort()); - private static SdkAsyncHttpClient client; + private static SdkHttpClient client; @BeforeClass public static void setup() throws Exception { - client = AwsCrtAsyncHttpClient.builder() - .connectionHealthConfiguration(b -> b.minimumThroughputInBps(4068L) + System.setProperty("aws.crt.debugnative", "true"); + Log.initLoggingToStdout(Log.LogLevel.Warn); + client = AwsCrtHttpClient.builder() + .connectionHealthConfiguration(b -> b.minimumThroughputInBps(4068L) .minimumThroughputTimeout(Duration.ofSeconds(3))) - .build(); + .build(); } @AfterClass @@ -93,47 +84,25 @@ private byte[] generateRandomBody(int size) { return randomData; } - @Test - public void signalsErrorViaOnErrorAndFuture() throws Exception { - stubFor(any(urlEqualTo("/")).willReturn(aResponse().withFault(Fault.RANDOM_DATA_THEN_CLOSE))); - - CompletableFuture errorSignaled = new CompletableFuture<>(); - - SdkAsyncHttpResponseHandler handler = new TestResponseHandler() { - @Override - public void onError(Throwable error) { - errorSignaled.complete(true); - } - }; - - SdkHttpRequest request = CrtHttpClientTestUtils.createRequest(URI.create("http://localhost:" + mockServer.port())); - - CompletableFuture executeFuture = client.execute(AsyncExecuteRequest.builder() - .request(request) - .responseHandler(handler) - .requestContentPublisher(new EmptyPublisher()) - .build()); - - assertThat(errorSignaled.get(1, TimeUnit.SECONDS)).isTrue(); - assertThatThrownBy(executeFuture::join).hasCauseInstanceOf(IOException.class).hasRootCauseInstanceOf(HttpException.class); - } - @Test - public void requestFailed_connectionTimeout_shouldWrapException() { - try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.builder().connectionTimeout(Duration.ofNanos(1)).build()) { + @Test(expected = IOException.class) + public void requestFailed_connectionTimeout_shouldWrapException() throws IOException { + try (SdkHttpClient client = AwsCrtHttpClient.builder().connectionTimeout(Duration.ofNanos(1)).build()) { URI uri = URI.create("http://localhost:" + mockServer.port()); stubFor(any(urlPathEqualTo("/")).willReturn(aResponse().withFault(Fault.RANDOM_DATA_THEN_CLOSE))); SdkHttpRequest request = createRequest(uri); - RecordingResponseHandler recorder = new RecordingResponseHandler(); - client.execute(AsyncExecuteRequest.builder().request(request).requestContentPublisher(createProvider("")).responseHandler(recorder).build()); - assertThatThrownBy(() -> recorder.completeFuture().get(5, TimeUnit.SECONDS)).hasCauseInstanceOf(IOException.class) - .hasRootCauseInstanceOf(HttpException.class); + HttpExecuteRequest.Builder executeRequestBuilder = HttpExecuteRequest.builder(); + executeRequestBuilder.request(request); + ExecutableHttpRequest executableRequest = client.prepareRequest(executeRequestBuilder.build()); + + executableRequest.call(); } } - @Test - public void requestFailed_notRetryable_shouldNotWrapException() { - try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.builder().build()) { + + @Test(expected = HttpException.class) + public void requestFailed_notRetryable_shouldNotWrapException() throws IOException { + try (SdkHttpClient client = AwsCrtHttpClient.builder().build()) { URI uri = URI.create("http://localhost:" + mockServer.port()); // make it invalid by doing a non-zero content length with no request body... Map> headers = new HashMap<>(); @@ -145,123 +114,62 @@ public void requestFailed_notRetryable_shouldNotWrapException() { SdkHttpRequest request = createRequest(uri).toBuilder().headers(headers).build(); - RecordingResponseHandler recorder = new RecordingResponseHandler(); - client.execute(AsyncExecuteRequest.builder().request(request).requestContentPublisher(new EmptyPublisher()).responseHandler(recorder).build()); - // invalid request should have returned an HttpException and not an IOException. - assertThatThrownBy(() -> recorder.completeFuture().get(5, TimeUnit.SECONDS)) - .hasCauseInstanceOf(HttpException.class).hasMessageContaining("does not match the previously declared length"); + HttpExecuteRequest.Builder executeRequestBuilder = HttpExecuteRequest.builder(); + executeRequestBuilder.request(request); + executeRequestBuilder.contentStreamProvider(() -> new ByteArrayInputStream(new byte[0])); + ExecutableHttpRequest executableRequest = client.prepareRequest(executeRequestBuilder.build()); + executableRequest.call(); } } - @Test - public void callsOnStreamForEmptyResponseContent() throws Exception { - stubFor(any(urlEqualTo("/")).willReturn(aResponse().withStatus(204).withHeader("foo", "bar"))); - - CompletableFuture streamReceived = new CompletableFuture<>(); - AtomicReference response = new AtomicReference<>(null); - - SdkAsyncHttpResponseHandler handler = new TestResponseHandler() { - @Override - public void onHeaders(SdkHttpResponse headers) { - response.compareAndSet(null, headers); - } - @Override - public void onStream(Publisher stream) { - super.onStream(stream); - streamReceived.complete(true); - } - }; - - SdkHttpRequest request = CrtHttpClientTestUtils.createRequest(URI.create("http://localhost:" + mockServer.port())); - - CompletableFuture future = client.execute(AsyncExecuteRequest.builder() - .request(request) - .responseHandler(handler) - .requestContentPublisher(new EmptyPublisher()) - .build()); - - future.get(60, TimeUnit.SECONDS); - assertThat(streamReceived.get(1, TimeUnit.SECONDS)).isTrue(); - assertThat(response.get() != null).isTrue(); - assertThat(response.get().statusCode() == 204).isTrue(); - assertThat(response.get().headers().get("foo").isEmpty()).isFalse(); - } + // the following test is commented out but here because I want anyone coming to this file to find out why I removed this test + // to know why. The SdkHttpClient interface has a different invariant regarding when a response stream is present than does + // the async subscriber model. SdkHttpClientTestSuite.validateResponse() asserts that the response stream is null + // on head requests. To meet that contract, we'd have to be null here as well. However, this test is supposed to + // check the exact opposite of that invariant. Since this test was ported from the async tests, we're going to assume + // this is an oversight between the sync and async APIs. However. that is why this test is removed. + // + //public void callsOnStreamForEmptyResponseContent(); @Test public void testGetRequest() throws Exception { String path = "/testGetRequest"; byte[] body = generateRandomBody(TEST_BODY_LEN); - String expectedBodyHash = sha256Hex(body).toUpperCase(); stubFor(any(urlEqualTo(path)).willReturn(aResponse().withStatus(200) .withHeader("Content-Length", Integer.toString(TEST_BODY_LEN)) .withHeader("foo", "bar") .withBody(body))); - CompletableFuture streamReceived = new CompletableFuture<>(); - AtomicReference response = new AtomicReference<>(null); - Sha256BodySubscriber bodySha256Subscriber = new Sha256BodySubscriber(); - AtomicReference error = new AtomicReference<>(null); - - SdkAsyncHttpResponseHandler handler = new SdkAsyncHttpResponseHandler() { - @Override - public void onHeaders(SdkHttpResponse headers) { - response.compareAndSet(null, headers); - } - @Override - public void onStream(Publisher stream) { - stream.subscribe(bodySha256Subscriber); - streamReceived.complete(true); - } - - @Override - public void onError(Throwable t) { - error.compareAndSet(null, t); - } - }; - URI uri = URI.create("http://localhost:" + mockServer.port()); SdkHttpRequest request = CrtHttpClientTestUtils.createRequest(uri, path, null, SdkHttpMethod.GET, emptyMap()); - CompletableFuture future = client.execute(AsyncExecuteRequest.builder() - .request(request) - .responseHandler(handler) - .requestContentPublisher(new EmptyPublisher()) - .build()); - - future.get(60, TimeUnit.SECONDS); - assertThat(error.get()).isNull(); - assertThat(streamReceived.get(1, TimeUnit.SECONDS)).isTrue(); - assertThat(bodySha256Subscriber.getFuture().get(60, TimeUnit.SECONDS)).isEqualTo(expectedBodyHash); - assertThat(response.get().statusCode()).isEqualTo(200); - assertThat(response.get().headers().get("foo").isEmpty()).isFalse(); + HttpExecuteRequest.Builder executeRequestBuilder = HttpExecuteRequest.builder(); + executeRequestBuilder.request(request); + ExecutableHttpRequest executableRequest = client.prepareRequest(executeRequestBuilder.build()); + HttpExecuteResponse response = executableRequest.call(); + + assertThat(response.responseBody().isPresent()).isTrue(); + byte[] readBody = new byte[TEST_BODY_LEN]; + assertThat(response.responseBody().get().read(readBody)).isEqualTo(TEST_BODY_LEN); + assertThat(readBody).isEqualTo(body); + assertThat(response.httpResponse().statusCode()).isEqualTo(200); + assertThat(response.httpResponse().headers().get("foo").isEmpty()).isFalse(); } private void makePutRequest(String path, byte[] reqBody, int expectedStatus) throws Exception { - CompletableFuture streamReceived = new CompletableFuture<>(); - AtomicReference response = new AtomicReference<>(null); - AtomicReference error = new AtomicReference<>(null); - - Subscriber subscriber = CrtHttpClientTestUtils.createDummySubscriber(); - - SdkAsyncHttpResponseHandler handler = CrtHttpClientTestUtils.createTestResponseHandler(response, - streamReceived, error, subscriber); - URI uri = URI.create("http://localhost:" + mockServer.port()); SdkHttpRequest request = CrtHttpClientTestUtils.createRequest(uri, path, reqBody, SdkHttpMethod.PUT, emptyMap()); - - CompletableFuture future = client.execute(AsyncExecuteRequest.builder() - .request(request) - .responseHandler(handler) - .requestContentPublisher(new SdkTestHttpContentPublisher(reqBody)) - .build()); - future.get(60, TimeUnit.SECONDS); - assertThat(error.get()).isNull(); - assertThat(streamReceived.get(60, TimeUnit.SECONDS)).isTrue(); - assertThat(response.get().statusCode()).isEqualTo(expectedStatus); + HttpExecuteRequest.Builder executeRequestBuilder = HttpExecuteRequest.builder(); + executeRequestBuilder.request(request); + executeRequestBuilder.contentStreamProvider(() -> new ByteArrayInputStream(reqBody)); + ExecutableHttpRequest executableRequest = client.prepareRequest(executeRequestBuilder.build()); + HttpExecuteResponse response = executableRequest.call(); + + assertThat(response.responseBody().isPresent()).isFalse(); + assertThat(response.httpResponse().statusCode()).isEqualTo(expectedStatus); } - @Test public void testPutRequest() throws Exception { String pathExpect200 = "/testPutRequest/return_200_on_exact_match"; @@ -274,44 +182,4 @@ public void testPutRequest() throws Exception { stubFor(any(urlEqualTo(pathExpect404)).willReturn(aResponse().withStatus(404))); makePutRequest(pathExpect404, randomBody, 404); } - - - - private static class TestResponseHandler implements SdkAsyncHttpResponseHandler { - @Override - public void onHeaders(SdkHttpResponse headers) { - } - - @Override - public void onStream(Publisher stream) { - stream.subscribe(new DrainingSubscriber<>()); - } - - @Override - public void onError(Throwable error) { - } - } - - private static class DrainingSubscriber implements Subscriber { - private Subscription subscription; - - @Override - public void onSubscribe(Subscription subscription) { - this.subscription = subscription; - this.subscription.request(Long.MAX_VALUE); - } - - @Override - public void onNext(T t) { - this.subscription.request(1); - } - - @Override - public void onError(Throwable throwable) { - } - - @Override - public void onComplete() { - } - } } diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientTest.java new file mode 100644 index 000000000000..b77a7f1acdb2 --- /dev/null +++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientTest.java @@ -0,0 +1,61 @@ +/* + * 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.http.crt; + +import static software.amazon.awssdk.http.SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES; + + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import software.amazon.awssdk.crt.CrtResource; +import software.amazon.awssdk.crt.Log; +import software.amazon.awssdk.http.SdkHttpClient; +import software.amazon.awssdk.http.SdkHttpClientTestSuite; +import software.amazon.awssdk.utils.AttributeMap; + +/** + * Testing the scenario where h1 server sends 5xx errors. + */ +public class AwsCrtHttpClientTest extends SdkHttpClientTestSuite { + + @BeforeAll + public static void beforeAll() { + System.setProperty("aws.crt.debugnative", "true"); + Log.initLoggingToStdout(Log.LogLevel.Warn); + } + + @AfterAll + public static void afterAll() { + CrtResource.waitForNoResources(); + } + + @Override + protected SdkHttpClient createSdkHttpClient(SdkHttpClientOptions options) { + boolean trustAllCerts = options.trustAll(); + return AwsCrtHttpClient.builder() + .buildWithDefaults(AttributeMap.builder().put(TRUST_ALL_CERTIFICATES, trustAllCerts).build()); + } + + // Empty test; behavior not supported when using custom factory + @Override + public void testCustomTlsTrustManagerAndTrustAllFails() { + } + + // Empty test; behavior not supported when using custom factory + @Override + public void testCustomTlsTrustManager() { + } +} diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientWireMockTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientWireMockTest.java index e43e8d4b0721..e052f225a4c9 100644 --- a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientWireMockTest.java +++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientWireMockTest.java @@ -23,26 +23,27 @@ import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static software.amazon.awssdk.http.HttpTestUtils.createProvider; import static software.amazon.awssdk.http.SdkHttpConfigurationOption.PROTOCOL; import static software.amazon.awssdk.http.crt.CrtHttpClientTestUtils.createRequest; import com.github.tomakehurst.wiremock.junit.WireMockRule; +import java.io.ByteArrayInputStream; import java.net.URI; -import java.util.concurrent.TimeUnit; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import software.amazon.awssdk.crt.CrtResource; import software.amazon.awssdk.crt.Log; +import software.amazon.awssdk.http.ExecutableHttpRequest; +import software.amazon.awssdk.http.HttpExecuteRequest; +import software.amazon.awssdk.http.HttpExecuteResponse; import software.amazon.awssdk.http.HttpMetric; import software.amazon.awssdk.http.Protocol; -import software.amazon.awssdk.http.RecordingResponseHandler; +import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.SdkHttpRequest; -import software.amazon.awssdk.http.async.AsyncExecuteRequest; -import software.amazon.awssdk.http.async.SdkAsyncHttpClient; import software.amazon.awssdk.metrics.MetricCollection; +import software.amazon.awssdk.metrics.MetricCollector; import software.amazon.awssdk.utils.AttributeMap; public class AwsCrtHttpClientWireMockTest { @@ -63,11 +64,11 @@ public static void tearDown() { } @Test - public void closeClient_reuse_throwException() throws Exception { - SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.create(); + public void closeClient_reuse_throwException() { + SdkHttpClient client = AwsCrtHttpClient.create(); client.close(); - assertThatThrownBy(() -> makeSimpleRequest(client)).hasMessageContaining("is closed"); + assertThatThrownBy(() -> makeSimpleRequest(client, null)).hasMessageContaining("is closed"); } @Test @@ -75,16 +76,17 @@ public void invalidProtocol_shouldThrowException() { AttributeMap attributeMap = AttributeMap.builder() .put(PROTOCOL, Protocol.HTTP2) .build(); - assertThatThrownBy(() -> AwsCrtAsyncHttpClient.builder().buildWithDefaults(attributeMap)) + assertThatThrownBy(() -> AwsCrtHttpClient.builder().buildWithDefaults(attributeMap)) .isInstanceOf(UnsupportedOperationException.class); } @Test public void sendRequest_withCollector_shouldCollectMetrics() throws Exception { - try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.builder().maxConcurrency(10).build()) { - RecordingResponseHandler recorder = makeSimpleRequest(client); - MetricCollection metrics = recorder.collector().collect(); + try (SdkHttpClient client = AwsCrtHttpClient.builder().maxConcurrency(10).build()) { + MetricCollector collector = MetricCollector.create("test"); + makeSimpleRequest(client, collector); + MetricCollection metrics = collector.collect(); assertThat(metrics.metricValues(HttpMetric.HTTP_CLIENT_NAME)).containsExactly("AwsCommonRuntime"); assertThat(metrics.metricValues(HttpMetric.MAX_CONCURRENCY)).containsExactly(10); @@ -96,33 +98,31 @@ public void sendRequest_withCollector_shouldCollectMetrics() throws Exception { @Test public void sharedEventLoopGroup_closeOneClient_shouldNotAffectOtherClients() throws Exception { - try (SdkAsyncHttpClient client = AwsCrtAsyncHttpClient.create()) { - makeSimpleRequest(client); + try (SdkHttpClient client = AwsCrtHttpClient.create()) { + makeSimpleRequest(client, null); } - try (SdkAsyncHttpClient anotherClient = AwsCrtAsyncHttpClient.create()) { - makeSimpleRequest(anotherClient); + try (SdkHttpClient anotherClient = AwsCrtHttpClient.create()) { + makeSimpleRequest(anotherClient, null); } } /** - * Make a simple async request and wait for it to finish. + * Make a simple request and wait for it to finish. * * @param client Client to make request with. */ - private RecordingResponseHandler makeSimpleRequest(SdkAsyncHttpClient client) throws Exception { + private HttpExecuteResponse makeSimpleRequest(SdkHttpClient client, MetricCollector metricCollector) throws Exception { String body = randomAlphabetic(10); URI uri = URI.create("http://localhost:" + mockServer.port()); stubFor(any(urlPathEqualTo("/")).willReturn(aResponse().withBody(body))); SdkHttpRequest request = createRequest(uri); - RecordingResponseHandler recorder = new RecordingResponseHandler(); - client.execute(AsyncExecuteRequest.builder() - .request(request) - .requestContentPublisher(createProvider("")) - .responseHandler(recorder) - .metricCollector(recorder.collector()) - .build()); - recorder.completeFuture().get(5, TimeUnit.SECONDS); - return recorder; + + HttpExecuteRequest.Builder executeRequestBuilder = HttpExecuteRequest.builder(); + executeRequestBuilder.request(request) + .contentStreamProvider(() -> new ByteArrayInputStream(new byte[0])) + .metricCollector(metricCollector); + ExecutableHttpRequest executableRequest = client.prepareRequest(executeRequestBuilder.build()); + return executableRequest.call(); } } diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/H1ServerBehaviorTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/H1SAsyncServerBehaviorTest.java similarity index 95% rename from http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/H1ServerBehaviorTest.java rename to http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/H1SAsyncServerBehaviorTest.java index 072983d96ca9..a9cda00dccf1 100644 --- a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/H1ServerBehaviorTest.java +++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/H1SAsyncServerBehaviorTest.java @@ -28,7 +28,7 @@ /** * Testing the scenario where h1 server sends 5xx errors. */ -public class H1ServerBehaviorTest extends SdkAsyncHttpClientH1TestSuite { +public class H1SAsyncServerBehaviorTest extends SdkAsyncHttpClientH1TestSuite { @BeforeAll public static void beforeAll() { diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutorTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutorTest.java index 5ef7cacda5e7..47379bfc35f3 100644 --- a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutorTest.java +++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/internal/CrtRequestExecutorTest.java @@ -69,12 +69,12 @@ public void teardown() { @Test public void acquireConnectionThrowException_shouldInvokeOnError() { RuntimeException exception = new RuntimeException("error"); - CrtRequestContext context = CrtRequestContext.builder() - .crtConnPool(connectionManager) - .request(AsyncExecuteRequest.builder() + CrtAsyncRequestContext context = CrtAsyncRequestContext.builder() + .crtConnPool(connectionManager) + .request(AsyncExecuteRequest.builder() .responseHandler(responseHandler) .build()) - .build(); + .build(); CompletableFuture completableFuture = new CompletableFuture<>(); Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture); @@ -94,7 +94,7 @@ public void acquireConnectionThrowException_shouldInvokeOnError() { @Test public void makeRequestThrowException_shouldInvokeOnError() { CrtRuntimeException exception = new CrtRuntimeException(""); - CrtRequestContext context = crtRequestContext(); + CrtAsyncRequestContext context = crtRequestContext(); CompletableFuture completableFuture = new CompletableFuture<>(); Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture); @@ -116,7 +116,7 @@ public void makeRequestThrowException_shouldInvokeOnError() { @Test public void makeRequest_success() { - CrtRequestContext context = crtRequestContext(); + CrtAsyncRequestContext context = crtRequestContext(); CompletableFuture completableFuture = new CompletableFuture<>(); Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture); completableFuture.complete(httpClientConnection); @@ -127,12 +127,12 @@ public void makeRequest_success() { @Test public void cancelRequest_shouldInvokeOnError() { - CrtRequestContext context = CrtRequestContext.builder() - .crtConnPool(connectionManager) - .request(AsyncExecuteRequest.builder() + CrtAsyncRequestContext context = CrtAsyncRequestContext.builder() + .crtConnPool(connectionManager) + .request(AsyncExecuteRequest.builder() .responseHandler(responseHandler) .build()) - .build(); + .build(); CompletableFuture completableFuture = new CompletableFuture<>(); Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture); @@ -150,7 +150,7 @@ public void cancelRequest_shouldInvokeOnError() { @Test public void execute_AcquireConnectionFailure_shouldAlwaysWrapIOException() { - CrtRequestContext context = crtRequestContext(); + CrtAsyncRequestContext context = crtRequestContext(); RuntimeException exception = new RuntimeException("some failure"); CompletableFuture completableFuture = CompletableFutureUtils.failedFuture(exception); @@ -163,7 +163,7 @@ public void execute_AcquireConnectionFailure_shouldAlwaysWrapIOException() { @Test public void executeRequest_failedOfIllegalStateException_shouldWrapIOException() { IllegalStateException exception = new IllegalStateException("connection closed"); - CrtRequestContext context = crtRequestContext(); + CrtAsyncRequestContext context = crtRequestContext(); CompletableFuture completableFuture = new CompletableFuture<>(); Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture); @@ -185,7 +185,7 @@ public void executeRequest_failedOfIllegalStateException_shouldWrapIOException() @Test public void executeRequest_failedOfRetryableHttpException_shouldWrapIOException() { HttpException exception = new HttpException(0x080a); // AWS_ERROR_HTTP_CONNECTION_CLOSED - CrtRequestContext context = crtRequestContext(); + CrtAsyncRequestContext context = crtRequestContext(); CompletableFuture completableFuture = new CompletableFuture<>(); Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture); @@ -208,7 +208,7 @@ public void executeRequest_failedOfRetryableHttpException_shouldWrapIOException( @Test public void executeRequest_failedOfNonRetryableHttpException_shouldNotWrapIOException() { HttpException exception = new HttpException(0x0801); // AWS_ERROR_HTTP_HEADER_NOT_FOUND - CrtRequestContext context = crtRequestContext(); + CrtAsyncRequestContext context = crtRequestContext(); CompletableFuture completableFuture = new CompletableFuture<>(); Mockito.when(connectionManager.acquireConnection()).thenReturn(completableFuture); @@ -227,17 +227,17 @@ public void executeRequest_failedOfNonRetryableHttpException_shouldNotWrapIOExce assertThatThrownBy(executeFuture::join).hasCause(exception); } - private CrtRequestContext crtRequestContext() { + private CrtAsyncRequestContext crtRequestContext() { SdkHttpFullRequest request = createRequest(URI.create("http://localhost")); - return CrtRequestContext.builder() - .readBufferSize(2000) - .crtConnPool(connectionManager) - .request(AsyncExecuteRequest.builder() + return CrtAsyncRequestContext.builder() + .readBufferSize(2000) + .crtConnPool(connectionManager) + .request(AsyncExecuteRequest.builder() .request(request) .requestContentPublisher(createProvider("")) .responseHandler(responseHandler) .build()) - .build(); + .build(); } } diff --git a/http-clients/netty-nio-client/pom.xml b/http-clients/netty-nio-client/pom.xml index 2e09825e3c5a..a69a9b84be7f 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/http-clients/pom.xml b/http-clients/pom.xml index 161eaadbbc8c..626fc26c5540 100644 --- a/http-clients/pom.xml +++ b/http-clients/pom.xml @@ -21,7 +21,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/http-clients/url-connection-client/pom.xml b/http-clients/url-connection-client/pom.xml index 677795879887..84af550e10d7 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/http-clients/url-connection-client/src/test/java/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClientWireMockTest.java b/http-clients/url-connection-client/src/test/java/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClientWireMockTest.java index d6c18616c6b4..05fdd709b28d 100644 --- a/http-clients/url-connection-client/src/test/java/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClientWireMockTest.java +++ b/http-clients/url-connection-client/src/test/java/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClientWireMockTest.java @@ -100,7 +100,7 @@ public void hasTransferEncodingHeader_shouldBeSet() throws IOException { stubForMockRequest(200); - SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), SdkHttpMethod.POST); + SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), SdkHttpMethod.POST, true); req = req.toBuilder().putHeader(TRANSFER_ENCODING, CHUNKED).build(); HttpExecuteResponse rsp = client.prepareRequest(HttpExecuteRequest.builder() .request(req) diff --git a/http-clients/url-connection-client/src/test/resources/jetty-logging.properties b/http-clients/url-connection-client/src/test/resources/jetty-logging.properties new file mode 100644 index 000000000000..4ee410e7fa92 --- /dev/null +++ b/http-clients/url-connection-client/src/test/resources/jetty-logging.properties @@ -0,0 +1,18 @@ +# +# 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. +# + +# Set up logging implementation +org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog +org.eclipse.jetty.LEVEL=OFF diff --git a/http-clients/url-connection-client/src/test/resources/log4j2.properties b/http-clients/url-connection-client/src/test/resources/log4j2.properties new file mode 100644 index 000000000000..340e7c449d54 --- /dev/null +++ b/http-clients/url-connection-client/src/test/resources/log4j2.properties @@ -0,0 +1,38 @@ +# +# 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. +# + +status = warn + +appender.console.type = Console +appender.console.name = ConsoleAppender +appender.console.layout.type = PatternLayout +appender.console.layout.pattern = %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n%throwable + +rootLogger.level = debug +rootLogger.appenderRef.stdout.ref = ConsoleAppender + +# Uncomment below to enable more specific logging +# +#logger.sdk.name = software.amazon.awssdk +#logger.sdk.level = debug +# +#logger.request.name = software.amazon.awssdk.request +#logger.request.level = debug +# +#logger.apache.name = org.apache.http.wire +#logger.apache.level = debug +# +#logger.netty.name = io.netty.handler.logging +#logger.netty.level = debug diff --git a/metric-publishers/cloudwatch-metric-publisher/pom.xml b/metric-publishers/cloudwatch-metric-publisher/pom.xml index 8c3e60bbec7a..8cc8359608bb 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cloudwatch-metric-publisher diff --git a/metric-publishers/pom.xml b/metric-publishers/pom.xml index faa332f7c009..e37be54dad49 100644 --- a/metric-publishers/pom.xml +++ b/metric-publishers/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT metric-publishers diff --git a/pom.xml b/pom.xml index f0781b37ca30..1fd253b5a96a 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 4.0.0 software.amazon.awssdk aws-sdk-java-pom - 2.21.47-SNAPSHOT + 2.22.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 87534bb2f9a8..4f7653f542d9 100644 --- a/release-scripts/pom.xml +++ b/release-scripts/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../pom.xml release-scripts diff --git a/services-custom/dynamodb-enhanced/pom.xml b/services-custom/dynamodb-enhanced/pom.xml index 61cf7e345806..8cdc2b58adf2 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.21.47-SNAPSHOT + 2.22.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 537576e970db..7d3abdc348d6 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml iam-policy-builder diff --git a/services-custom/pom.xml b/services-custom/pom.xml index ba6fbc75c571..efccb46d8013 100644 --- a/services-custom/pom.xml +++ b/services-custom/pom.xml @@ -19,7 +19,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT services-custom AWS Java SDK :: Custom Services diff --git a/services-custom/s3-transfer-manager/pom.xml b/services-custom/s3-transfer-manager/pom.xml index 49fcbf8238c3..a6572d62c289 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml s3-transfer-manager diff --git a/services/accessanalyzer/pom.xml b/services/accessanalyzer/pom.xml index d996235284f5..3faab589501d 100644 --- a/services/accessanalyzer/pom.xml +++ b/services/accessanalyzer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT accessanalyzer AWS Java SDK :: Services :: AccessAnalyzer diff --git a/services/account/pom.xml b/services/account/pom.xml index a40c13117eda..88f4f93bd7f3 100644 --- a/services/account/pom.xml +++ b/services/account/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT account AWS Java SDK :: Services :: Account diff --git a/services/acm/pom.xml b/services/acm/pom.xml index d921fb9abe6d..e6df0761d193 100644 --- a/services/acm/pom.xml +++ b/services/acm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT acm AWS Java SDK :: Services :: AWS Certificate Manager diff --git a/services/acmpca/pom.xml b/services/acmpca/pom.xml index 128d9c8e0517..4fce1342ac5c 100644 --- a/services/acmpca/pom.xml +++ b/services/acmpca/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT acmpca AWS Java SDK :: Services :: ACM PCA diff --git a/services/alexaforbusiness/pom.xml b/services/alexaforbusiness/pom.xml index 5c5deb1ca369..274d8fde52da 100644 --- a/services/alexaforbusiness/pom.xml +++ b/services/alexaforbusiness/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 alexaforbusiness diff --git a/services/amp/pom.xml b/services/amp/pom.xml index fb5d30c777a5..3996aa8c0a06 100644 --- a/services/amp/pom.xml +++ b/services/amp/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT amp AWS Java SDK :: Services :: Amp diff --git a/services/amplify/pom.xml b/services/amplify/pom.xml index 72f5290991aa..0fe728e63d82 100644 --- a/services/amplify/pom.xml +++ b/services/amplify/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT amplify AWS Java SDK :: Services :: Amplify diff --git a/services/amplifybackend/pom.xml b/services/amplifybackend/pom.xml index 93291f1f5b51..00ed07333bbd 100644 --- a/services/amplifybackend/pom.xml +++ b/services/amplifybackend/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT amplifybackend AWS Java SDK :: Services :: Amplify Backend diff --git a/services/amplifyuibuilder/pom.xml b/services/amplifyuibuilder/pom.xml index e288cf7373d0..b3df2a57b81a 100644 --- a/services/amplifyuibuilder/pom.xml +++ b/services/amplifyuibuilder/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT amplifyuibuilder AWS Java SDK :: Services :: Amplify UI Builder diff --git a/services/apigateway/pom.xml b/services/apigateway/pom.xml index 11c3f0cb2e8b..9f721a5b0411 100644 --- a/services/apigateway/pom.xml +++ b/services/apigateway/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT apigateway AWS Java SDK :: Services :: Amazon API Gateway diff --git a/services/apigatewaymanagementapi/pom.xml b/services/apigatewaymanagementapi/pom.xml index 6e353eba5d7e..cf6c60135ebc 100644 --- a/services/apigatewaymanagementapi/pom.xml +++ b/services/apigatewaymanagementapi/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT apigatewaymanagementapi AWS Java SDK :: Services :: ApiGatewayManagementApi diff --git a/services/apigatewayv2/pom.xml b/services/apigatewayv2/pom.xml index d1b9dd78f139..78f3daf144ae 100644 --- a/services/apigatewayv2/pom.xml +++ b/services/apigatewayv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT apigatewayv2 AWS Java SDK :: Services :: ApiGatewayV2 diff --git a/services/appconfig/pom.xml b/services/appconfig/pom.xml index 2618a02e4dc8..0c57802b92e7 100644 --- a/services/appconfig/pom.xml +++ b/services/appconfig/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT appconfig AWS Java SDK :: Services :: AppConfig diff --git a/services/appconfigdata/pom.xml b/services/appconfigdata/pom.xml index c45134454e55..f85bbcd89403 100644 --- a/services/appconfigdata/pom.xml +++ b/services/appconfigdata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT appconfigdata AWS Java SDK :: Services :: App Config Data diff --git a/services/appfabric/pom.xml b/services/appfabric/pom.xml index 3fe43ce1e34e..5ca84fa1c154 100644 --- a/services/appfabric/pom.xml +++ b/services/appfabric/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT appfabric AWS Java SDK :: Services :: App Fabric diff --git a/services/appflow/pom.xml b/services/appflow/pom.xml index 321d020a3b96..7f3f795758ab 100644 --- a/services/appflow/pom.xml +++ b/services/appflow/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT appflow AWS Java SDK :: Services :: Appflow diff --git a/services/appintegrations/pom.xml b/services/appintegrations/pom.xml index 59b5fa44e50a..6308471c0855 100644 --- a/services/appintegrations/pom.xml +++ b/services/appintegrations/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT appintegrations AWS Java SDK :: Services :: App Integrations diff --git a/services/applicationautoscaling/pom.xml b/services/applicationautoscaling/pom.xml index a47220aacfe2..8c4f349cf48b 100644 --- a/services/applicationautoscaling/pom.xml +++ b/services/applicationautoscaling/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT applicationautoscaling AWS Java SDK :: Services :: AWS Application Auto Scaling diff --git a/services/applicationcostprofiler/pom.xml b/services/applicationcostprofiler/pom.xml index f1c17eb69b08..a6b8e3aaa49b 100644 --- a/services/applicationcostprofiler/pom.xml +++ b/services/applicationcostprofiler/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT applicationcostprofiler AWS Java SDK :: Services :: Application Cost Profiler diff --git a/services/applicationdiscovery/pom.xml b/services/applicationdiscovery/pom.xml index 71539930cbab..f9faf4d6e157 100644 --- a/services/applicationdiscovery/pom.xml +++ b/services/applicationdiscovery/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT applicationdiscovery AWS Java SDK :: Services :: AWS Application Discovery Service diff --git a/services/applicationinsights/pom.xml b/services/applicationinsights/pom.xml index 29c93df742ed..698fc8b14ae3 100644 --- a/services/applicationinsights/pom.xml +++ b/services/applicationinsights/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT applicationinsights AWS Java SDK :: Services :: Application Insights diff --git a/services/appmesh/pom.xml b/services/appmesh/pom.xml index 2713601a44c0..f2d5481920c6 100644 --- a/services/appmesh/pom.xml +++ b/services/appmesh/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT appmesh AWS Java SDK :: Services :: App Mesh diff --git a/services/apprunner/pom.xml b/services/apprunner/pom.xml index 08086a6cb179..3d7ff6afe495 100644 --- a/services/apprunner/pom.xml +++ b/services/apprunner/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT apprunner AWS Java SDK :: Services :: App Runner diff --git a/services/appstream/pom.xml b/services/appstream/pom.xml index 3c8aac2f2f07..41eabde2af49 100644 --- a/services/appstream/pom.xml +++ b/services/appstream/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT appstream AWS Java SDK :: Services :: Amazon AppStream diff --git a/services/appsync/pom.xml b/services/appsync/pom.xml index 242099154e5e..235a3ed8fdba 100644 --- a/services/appsync/pom.xml +++ b/services/appsync/pom.xml @@ -21,7 +21,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT appsync diff --git a/services/arczonalshift/pom.xml b/services/arczonalshift/pom.xml index 2bdb613eeaa6..1dfe46506b58 100644 --- a/services/arczonalshift/pom.xml +++ b/services/arczonalshift/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT arczonalshift AWS Java SDK :: Services :: ARC Zonal Shift diff --git a/services/athena/pom.xml b/services/athena/pom.xml index b7cef4acb720..edf0a883d87c 100644 --- a/services/athena/pom.xml +++ b/services/athena/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT athena AWS Java SDK :: Services :: Amazon Athena diff --git a/services/auditmanager/pom.xml b/services/auditmanager/pom.xml index a6537a5e2ee8..7d73b7367aa6 100644 --- a/services/auditmanager/pom.xml +++ b/services/auditmanager/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT auditmanager AWS Java SDK :: Services :: Audit Manager diff --git a/services/autoscaling/pom.xml b/services/autoscaling/pom.xml index 61cbeef801f7..40017fe99833 100644 --- a/services/autoscaling/pom.xml +++ b/services/autoscaling/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT autoscaling AWS Java SDK :: Services :: Auto Scaling diff --git a/services/autoscalingplans/pom.xml b/services/autoscalingplans/pom.xml index cbc5aa8c7aba..13239a228fc8 100644 --- a/services/autoscalingplans/pom.xml +++ b/services/autoscalingplans/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT autoscalingplans AWS Java SDK :: Services :: Auto Scaling Plans diff --git a/services/b2bi/pom.xml b/services/b2bi/pom.xml index d52008a1336a..5752e92580b2 100644 --- a/services/b2bi/pom.xml +++ b/services/b2bi/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT b2bi AWS Java SDK :: Services :: B2 Bi diff --git a/services/backup/pom.xml b/services/backup/pom.xml index 26fbe5545700..8bb04c3e61e9 100644 --- a/services/backup/pom.xml +++ b/services/backup/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT backup AWS Java SDK :: Services :: Backup diff --git a/services/backupgateway/pom.xml b/services/backupgateway/pom.xml index 5569d6e7b9b0..d940cb6f66ff 100644 --- a/services/backupgateway/pom.xml +++ b/services/backupgateway/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT backupgateway AWS Java SDK :: Services :: Backup Gateway diff --git a/services/backupstorage/pom.xml b/services/backupstorage/pom.xml index 0baf4d95aa80..113a675c2a10 100644 --- a/services/backupstorage/pom.xml +++ b/services/backupstorage/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT backupstorage AWS Java SDK :: Services :: Backup Storage diff --git a/services/batch/pom.xml b/services/batch/pom.xml index b5991a502a73..f2f0a9fae857 100644 --- a/services/batch/pom.xml +++ b/services/batch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT batch AWS Java SDK :: Services :: AWS Batch diff --git a/services/bcmdataexports/pom.xml b/services/bcmdataexports/pom.xml index c4036850f5d9..85f995c12698 100644 --- a/services/bcmdataexports/pom.xml +++ b/services/bcmdataexports/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT bcmdataexports AWS Java SDK :: Services :: BCM Data Exports diff --git a/services/bedrock/pom.xml b/services/bedrock/pom.xml index 2fec07928987..c60e50565285 100644 --- a/services/bedrock/pom.xml +++ b/services/bedrock/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT bedrock AWS Java SDK :: Services :: Bedrock diff --git a/services/bedrockagent/pom.xml b/services/bedrockagent/pom.xml index 53bb084c6993..d447675c0391 100644 --- a/services/bedrockagent/pom.xml +++ b/services/bedrockagent/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT bedrockagent AWS Java SDK :: Services :: Bedrock Agent diff --git a/services/bedrockagentruntime/pom.xml b/services/bedrockagentruntime/pom.xml index 86a7b747d2c6..c86531ed9576 100644 --- a/services/bedrockagentruntime/pom.xml +++ b/services/bedrockagentruntime/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT bedrockagentruntime AWS Java SDK :: Services :: Bedrock Agent Runtime diff --git a/services/bedrockruntime/pom.xml b/services/bedrockruntime/pom.xml index 248da9ef7b60..ef884d6186d9 100644 --- a/services/bedrockruntime/pom.xml +++ b/services/bedrockruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT bedrockruntime AWS Java SDK :: Services :: Bedrock Runtime diff --git a/services/billingconductor/pom.xml b/services/billingconductor/pom.xml index 40b5cb5b4bb6..25de7e2a6ec6 100644 --- a/services/billingconductor/pom.xml +++ b/services/billingconductor/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT billingconductor AWS Java SDK :: Services :: Billingconductor diff --git a/services/braket/pom.xml b/services/braket/pom.xml index ad5aef4a6b09..5efa282d8e9c 100644 --- a/services/braket/pom.xml +++ b/services/braket/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT braket AWS Java SDK :: Services :: Braket diff --git a/services/budgets/pom.xml b/services/budgets/pom.xml index ef18ae34072c..2d5e1cb3347a 100644 --- a/services/budgets/pom.xml +++ b/services/budgets/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT budgets AWS Java SDK :: Services :: AWS Budgets diff --git a/services/chime/pom.xml b/services/chime/pom.xml index 338c3c3af859..013227f1515d 100644 --- a/services/chime/pom.xml +++ b/services/chime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT chime AWS Java SDK :: Services :: Chime diff --git a/services/chimesdkidentity/pom.xml b/services/chimesdkidentity/pom.xml index 39cbe187d39c..1d28de3729bb 100644 --- a/services/chimesdkidentity/pom.xml +++ b/services/chimesdkidentity/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT chimesdkidentity AWS Java SDK :: Services :: Chime SDK Identity diff --git a/services/chimesdkmediapipelines/pom.xml b/services/chimesdkmediapipelines/pom.xml index a2fd811a6742..0da7af5a0458 100644 --- a/services/chimesdkmediapipelines/pom.xml +++ b/services/chimesdkmediapipelines/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT chimesdkmediapipelines AWS Java SDK :: Services :: Chime SDK Media Pipelines diff --git a/services/chimesdkmeetings/pom.xml b/services/chimesdkmeetings/pom.xml index 532a6d77ed54..be51dc90a64d 100644 --- a/services/chimesdkmeetings/pom.xml +++ b/services/chimesdkmeetings/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT chimesdkmeetings AWS Java SDK :: Services :: Chime SDK Meetings diff --git a/services/chimesdkmessaging/pom.xml b/services/chimesdkmessaging/pom.xml index ccf491819572..ef91e4cb15ee 100644 --- a/services/chimesdkmessaging/pom.xml +++ b/services/chimesdkmessaging/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT chimesdkmessaging AWS Java SDK :: Services :: Chime SDK Messaging diff --git a/services/chimesdkvoice/pom.xml b/services/chimesdkvoice/pom.xml index 84d1add94eb1..7ed619b7e3ad 100644 --- a/services/chimesdkvoice/pom.xml +++ b/services/chimesdkvoice/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT chimesdkvoice AWS Java SDK :: Services :: Chime SDK Voice diff --git a/services/cleanrooms/pom.xml b/services/cleanrooms/pom.xml index fe6643d5a395..55c86a3dd231 100644 --- a/services/cleanrooms/pom.xml +++ b/services/cleanrooms/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cleanrooms AWS Java SDK :: Services :: Clean Rooms diff --git a/services/cleanroomsml/pom.xml b/services/cleanroomsml/pom.xml index 15abed25d0b3..c1916efe558c 100644 --- a/services/cleanroomsml/pom.xml +++ b/services/cleanroomsml/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cleanroomsml AWS Java SDK :: Services :: Clean Rooms ML diff --git a/services/cloud9/pom.xml b/services/cloud9/pom.xml index 35e85e9a93d2..40e3a9abef3f 100644 --- a/services/cloud9/pom.xml +++ b/services/cloud9/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 cloud9 diff --git a/services/cloudcontrol/pom.xml b/services/cloudcontrol/pom.xml index f798194a169f..698a78d9273a 100644 --- a/services/cloudcontrol/pom.xml +++ b/services/cloudcontrol/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cloudcontrol AWS Java SDK :: Services :: Cloud Control diff --git a/services/clouddirectory/pom.xml b/services/clouddirectory/pom.xml index 15c09261cce1..4e2fc868a774 100644 --- a/services/clouddirectory/pom.xml +++ b/services/clouddirectory/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT clouddirectory AWS Java SDK :: Services :: Amazon CloudDirectory diff --git a/services/cloudformation/pom.xml b/services/cloudformation/pom.xml index 7c60164b0362..50ba63dfbae9 100644 --- a/services/cloudformation/pom.xml +++ b/services/cloudformation/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cloudformation AWS Java SDK :: Services :: AWS CloudFormation diff --git a/services/cloudfront/pom.xml b/services/cloudfront/pom.xml index bfc17b1df555..38307560929c 100644 --- a/services/cloudfront/pom.xml +++ b/services/cloudfront/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cloudfront AWS Java SDK :: Services :: Amazon CloudFront diff --git a/services/cloudfrontkeyvaluestore/pom.xml b/services/cloudfrontkeyvaluestore/pom.xml index ce0f7ee550f6..70cf4b907566 100644 --- a/services/cloudfrontkeyvaluestore/pom.xml +++ b/services/cloudfrontkeyvaluestore/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.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 b3364188ae49..07c1268b58f2 100644 --- a/services/cloudhsm/pom.xml +++ b/services/cloudhsm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cloudhsm AWS Java SDK :: Services :: AWS CloudHSM diff --git a/services/cloudhsmv2/pom.xml b/services/cloudhsmv2/pom.xml index 33888c8c693f..6e2a5bac5288 100644 --- a/services/cloudhsmv2/pom.xml +++ b/services/cloudhsmv2/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 cloudhsmv2 diff --git a/services/cloudsearch/pom.xml b/services/cloudsearch/pom.xml index f77f7a204da6..737c5e59f5c6 100644 --- a/services/cloudsearch/pom.xml +++ b/services/cloudsearch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cloudsearch AWS Java SDK :: Services :: Amazon CloudSearch diff --git a/services/cloudsearchdomain/pom.xml b/services/cloudsearchdomain/pom.xml index f07f41618dda..edb4353c1bec 100644 --- a/services/cloudsearchdomain/pom.xml +++ b/services/cloudsearchdomain/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cloudsearchdomain AWS Java SDK :: Services :: Amazon CloudSearch Domain diff --git a/services/cloudtrail/pom.xml b/services/cloudtrail/pom.xml index df6c9d8c0b35..34c8981ed8c8 100644 --- a/services/cloudtrail/pom.xml +++ b/services/cloudtrail/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cloudtrail AWS Java SDK :: Services :: AWS CloudTrail diff --git a/services/cloudtraildata/pom.xml b/services/cloudtraildata/pom.xml index a6d5ad84949a..63e64dec08a1 100644 --- a/services/cloudtraildata/pom.xml +++ b/services/cloudtraildata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cloudtraildata AWS Java SDK :: Services :: Cloud Trail Data diff --git a/services/cloudwatch/pom.xml b/services/cloudwatch/pom.xml index ece7b54aa1b9..c195c8d1b036 100644 --- a/services/cloudwatch/pom.xml +++ b/services/cloudwatch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cloudwatch AWS Java SDK :: Services :: Amazon CloudWatch diff --git a/services/cloudwatchevents/pom.xml b/services/cloudwatchevents/pom.xml index c70b78b714f9..a9c7781d18ad 100644 --- a/services/cloudwatchevents/pom.xml +++ b/services/cloudwatchevents/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cloudwatchevents AWS Java SDK :: Services :: Amazon CloudWatch Events diff --git a/services/cloudwatchlogs/pom.xml b/services/cloudwatchlogs/pom.xml index bbac2837211c..50767762d4b8 100644 --- a/services/cloudwatchlogs/pom.xml +++ b/services/cloudwatchlogs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cloudwatchlogs AWS Java SDK :: Services :: Amazon CloudWatch Logs diff --git a/services/codeartifact/pom.xml b/services/codeartifact/pom.xml index 2d64dfe3fcfc..4f7f3c50c5a4 100644 --- a/services/codeartifact/pom.xml +++ b/services/codeartifact/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT codeartifact AWS Java SDK :: Services :: Codeartifact diff --git a/services/codebuild/pom.xml b/services/codebuild/pom.xml index 488e5c857462..b37424782571 100644 --- a/services/codebuild/pom.xml +++ b/services/codebuild/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT codebuild AWS Java SDK :: Services :: AWS Code Build diff --git a/services/codecatalyst/pom.xml b/services/codecatalyst/pom.xml index 62b2eeca3d8c..82e4778821f4 100644 --- a/services/codecatalyst/pom.xml +++ b/services/codecatalyst/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT codecatalyst AWS Java SDK :: Services :: Code Catalyst diff --git a/services/codecommit/pom.xml b/services/codecommit/pom.xml index 7ef391e88cda..b2fbc246b8dd 100644 --- a/services/codecommit/pom.xml +++ b/services/codecommit/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT codecommit AWS Java SDK :: Services :: AWS CodeCommit diff --git a/services/codedeploy/pom.xml b/services/codedeploy/pom.xml index 1f9ac05a429b..5a66ace6a000 100644 --- a/services/codedeploy/pom.xml +++ b/services/codedeploy/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT codedeploy AWS Java SDK :: Services :: AWS CodeDeploy diff --git a/services/codeguruprofiler/pom.xml b/services/codeguruprofiler/pom.xml index 0e1f1efc7a21..548106ea617a 100644 --- a/services/codeguruprofiler/pom.xml +++ b/services/codeguruprofiler/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT codeguruprofiler AWS Java SDK :: Services :: CodeGuruProfiler diff --git a/services/codegurureviewer/pom.xml b/services/codegurureviewer/pom.xml index 36e3cc579d82..9629aa8a0ad4 100644 --- a/services/codegurureviewer/pom.xml +++ b/services/codegurureviewer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT codegurureviewer AWS Java SDK :: Services :: CodeGuru Reviewer diff --git a/services/codegurusecurity/pom.xml b/services/codegurusecurity/pom.xml index 1243bb9ed9e1..4c2c2b07793d 100644 --- a/services/codegurusecurity/pom.xml +++ b/services/codegurusecurity/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT codegurusecurity AWS Java SDK :: Services :: Code Guru Security diff --git a/services/codepipeline/pom.xml b/services/codepipeline/pom.xml index 7c1bda61fe29..3230ecfd5df7 100644 --- a/services/codepipeline/pom.xml +++ b/services/codepipeline/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT codepipeline AWS Java SDK :: Services :: AWS CodePipeline diff --git a/services/codestar/pom.xml b/services/codestar/pom.xml index 9a0d7bba91c8..a6d28657dd86 100644 --- a/services/codestar/pom.xml +++ b/services/codestar/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT codestar AWS Java SDK :: Services :: AWS CodeStar diff --git a/services/codestarconnections/pom.xml b/services/codestarconnections/pom.xml index f73084fec682..c2faf0d946b1 100644 --- a/services/codestarconnections/pom.xml +++ b/services/codestarconnections/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT codestarconnections AWS Java SDK :: Services :: CodeStar connections diff --git a/services/codestarnotifications/pom.xml b/services/codestarnotifications/pom.xml index 2613eece8b0b..8b208631069e 100644 --- a/services/codestarnotifications/pom.xml +++ b/services/codestarnotifications/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT codestarnotifications AWS Java SDK :: Services :: Codestar Notifications diff --git a/services/cognitoidentity/pom.xml b/services/cognitoidentity/pom.xml index a0aa5e43b460..c1d8b6c82abb 100644 --- a/services/cognitoidentity/pom.xml +++ b/services/cognitoidentity/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cognitoidentity AWS Java SDK :: Services :: Amazon Cognito Identity diff --git a/services/cognitoidentityprovider/pom.xml b/services/cognitoidentityprovider/pom.xml index 3e6174d09843..8842c9d449c3 100644 --- a/services/cognitoidentityprovider/pom.xml +++ b/services/cognitoidentityprovider/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.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 0798682a53e2..c7c48040f9c4 100644 --- a/services/cognitosync/pom.xml +++ b/services/cognitosync/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT cognitosync AWS Java SDK :: Services :: Amazon Cognito Sync diff --git a/services/comprehend/pom.xml b/services/comprehend/pom.xml index 2745969910bc..a84362f57937 100644 --- a/services/comprehend/pom.xml +++ b/services/comprehend/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 comprehend diff --git a/services/comprehendmedical/pom.xml b/services/comprehendmedical/pom.xml index d2c65c4fc877..81cf3b5e57bc 100644 --- a/services/comprehendmedical/pom.xml +++ b/services/comprehendmedical/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT comprehendmedical AWS Java SDK :: Services :: ComprehendMedical diff --git a/services/computeoptimizer/pom.xml b/services/computeoptimizer/pom.xml index 0aa9ed6a7fa9..f6dfbd2ea7f9 100644 --- a/services/computeoptimizer/pom.xml +++ b/services/computeoptimizer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT computeoptimizer AWS Java SDK :: Services :: Compute Optimizer diff --git a/services/config/pom.xml b/services/config/pom.xml index ef4e8f0124e7..18c8712138f6 100644 --- a/services/config/pom.xml +++ b/services/config/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT config AWS Java SDK :: Services :: AWS Config diff --git a/services/connect/pom.xml b/services/connect/pom.xml index 503244b1fe5c..57299c01f72e 100644 --- a/services/connect/pom.xml +++ b/services/connect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT connect AWS Java SDK :: Services :: Connect diff --git a/services/connectcampaigns/pom.xml b/services/connectcampaigns/pom.xml index 88de73347ff4..a610e097930d 100644 --- a/services/connectcampaigns/pom.xml +++ b/services/connectcampaigns/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT connectcampaigns AWS Java SDK :: Services :: Connect Campaigns diff --git a/services/connectcases/pom.xml b/services/connectcases/pom.xml index 33967d521fd2..11fd3e7b3a37 100644 --- a/services/connectcases/pom.xml +++ b/services/connectcases/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT connectcases AWS Java SDK :: Services :: Connect Cases diff --git a/services/connectcontactlens/pom.xml b/services/connectcontactlens/pom.xml index 7395e23aede0..4747756a0e4d 100644 --- a/services/connectcontactlens/pom.xml +++ b/services/connectcontactlens/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT connectcontactlens AWS Java SDK :: Services :: Connect Contact Lens diff --git a/services/connectparticipant/pom.xml b/services/connectparticipant/pom.xml index 484258a00ff6..134dcffff814 100644 --- a/services/connectparticipant/pom.xml +++ b/services/connectparticipant/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT connectparticipant AWS Java SDK :: Services :: ConnectParticipant diff --git a/services/controltower/pom.xml b/services/controltower/pom.xml index c26f19a21205..71b966bccf19 100644 --- a/services/controltower/pom.xml +++ b/services/controltower/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT controltower AWS Java SDK :: Services :: Control Tower diff --git a/services/costandusagereport/pom.xml b/services/costandusagereport/pom.xml index c0ece2f22752..69ceaa302a90 100644 --- a/services/costandusagereport/pom.xml +++ b/services/costandusagereport/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.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 e9209956fd52..35d48054a893 100644 --- a/services/costexplorer/pom.xml +++ b/services/costexplorer/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 costexplorer diff --git a/services/costoptimizationhub/pom.xml b/services/costoptimizationhub/pom.xml index 422155720f80..4761fa0bd334 100644 --- a/services/costoptimizationhub/pom.xml +++ b/services/costoptimizationhub/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT costoptimizationhub AWS Java SDK :: Services :: Cost Optimization Hub diff --git a/services/customerprofiles/pom.xml b/services/customerprofiles/pom.xml index ee9cb9a8b9d9..cb265457172e 100644 --- a/services/customerprofiles/pom.xml +++ b/services/customerprofiles/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT customerprofiles AWS Java SDK :: Services :: Customer Profiles diff --git a/services/databasemigration/pom.xml b/services/databasemigration/pom.xml index a62e06ccebcc..fed60a0a4b65 100644 --- a/services/databasemigration/pom.xml +++ b/services/databasemigration/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT databasemigration AWS Java SDK :: Services :: AWS Database Migration Service diff --git a/services/databrew/pom.xml b/services/databrew/pom.xml index 1308e34a2100..1a2c52f95064 100644 --- a/services/databrew/pom.xml +++ b/services/databrew/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT databrew AWS Java SDK :: Services :: Data Brew diff --git a/services/dataexchange/pom.xml b/services/dataexchange/pom.xml index 54061f5223f3..de2a8acc1a67 100644 --- a/services/dataexchange/pom.xml +++ b/services/dataexchange/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT dataexchange AWS Java SDK :: Services :: DataExchange diff --git a/services/datapipeline/pom.xml b/services/datapipeline/pom.xml index 3df691bd28e6..fe150ef0930b 100644 --- a/services/datapipeline/pom.xml +++ b/services/datapipeline/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT datapipeline AWS Java SDK :: Services :: AWS Data Pipeline diff --git a/services/datasync/pom.xml b/services/datasync/pom.xml index a572a54c8bfa..32fc9b3f9918 100644 --- a/services/datasync/pom.xml +++ b/services/datasync/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT datasync AWS Java SDK :: Services :: DataSync diff --git a/services/datazone/pom.xml b/services/datazone/pom.xml index 48c7043dea43..1261df2e6b05 100644 --- a/services/datazone/pom.xml +++ b/services/datazone/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT datazone AWS Java SDK :: Services :: Data Zone diff --git a/services/dax/pom.xml b/services/dax/pom.xml index 5dd3218f7385..4bee2f6bf6be 100644 --- a/services/dax/pom.xml +++ b/services/dax/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT dax AWS Java SDK :: Services :: Amazon DynamoDB Accelerator (DAX) diff --git a/services/detective/pom.xml b/services/detective/pom.xml index a3e39d94a1a9..d6bb565f8072 100644 --- a/services/detective/pom.xml +++ b/services/detective/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT detective AWS Java SDK :: Services :: Detective diff --git a/services/devicefarm/pom.xml b/services/devicefarm/pom.xml index 5ac2f767ed43..57a996396c88 100644 --- a/services/devicefarm/pom.xml +++ b/services/devicefarm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT devicefarm AWS Java SDK :: Services :: AWS Device Farm diff --git a/services/devopsguru/pom.xml b/services/devopsguru/pom.xml index 0d05d4afce2f..b20bdb74b31c 100644 --- a/services/devopsguru/pom.xml +++ b/services/devopsguru/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT devopsguru AWS Java SDK :: Services :: Dev Ops Guru diff --git a/services/directconnect/pom.xml b/services/directconnect/pom.xml index bc8d900862f4..1adc2501f533 100644 --- a/services/directconnect/pom.xml +++ b/services/directconnect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT directconnect AWS Java SDK :: Services :: AWS Direct Connect diff --git a/services/directory/pom.xml b/services/directory/pom.xml index 61cd0fbcfcfb..59edb099b9f2 100644 --- a/services/directory/pom.xml +++ b/services/directory/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT directory AWS Java SDK :: Services :: AWS Directory Service diff --git a/services/dlm/pom.xml b/services/dlm/pom.xml index 9f4727e90a3d..2c7477ba32b2 100644 --- a/services/dlm/pom.xml +++ b/services/dlm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT dlm AWS Java SDK :: Services :: DLM diff --git a/services/docdb/pom.xml b/services/docdb/pom.xml index 9b555732773e..356d5612bf99 100644 --- a/services/docdb/pom.xml +++ b/services/docdb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT docdb AWS Java SDK :: Services :: DocDB diff --git a/services/docdbelastic/pom.xml b/services/docdbelastic/pom.xml index 5ab66484f678..5db3693da2b6 100644 --- a/services/docdbelastic/pom.xml +++ b/services/docdbelastic/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT docdbelastic AWS Java SDK :: Services :: Doc DB Elastic diff --git a/services/drs/pom.xml b/services/drs/pom.xml index ed670ea27d94..fee3dc06bc5d 100644 --- a/services/drs/pom.xml +++ b/services/drs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT drs AWS Java SDK :: Services :: Drs diff --git a/services/dynamodb/pom.xml b/services/dynamodb/pom.xml index ba900e448d8c..b307a69bd69f 100644 --- a/services/dynamodb/pom.xml +++ b/services/dynamodb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT dynamodb AWS Java SDK :: Services :: Amazon DynamoDB diff --git a/services/ebs/pom.xml b/services/ebs/pom.xml index 98f74bf02908..7cf675801987 100644 --- a/services/ebs/pom.xml +++ b/services/ebs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ebs AWS Java SDK :: Services :: EBS diff --git a/services/ec2/pom.xml b/services/ec2/pom.xml index 0faeae5a3f4b..018a70e692f9 100644 --- a/services/ec2/pom.xml +++ b/services/ec2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ec2 AWS Java SDK :: Services :: Amazon EC2 diff --git a/services/ec2instanceconnect/pom.xml b/services/ec2instanceconnect/pom.xml index a9253b0cbb1b..6e5dfe87d880 100644 --- a/services/ec2instanceconnect/pom.xml +++ b/services/ec2instanceconnect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ec2instanceconnect AWS Java SDK :: Services :: EC2 Instance Connect diff --git a/services/ecr/pom.xml b/services/ecr/pom.xml index 07a27860f91e..5b6bda485917 100644 --- a/services/ecr/pom.xml +++ b/services/ecr/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ecr AWS Java SDK :: Services :: Amazon EC2 Container Registry diff --git a/services/ecrpublic/pom.xml b/services/ecrpublic/pom.xml index 31ff2612e28a..96cf0c71403b 100644 --- a/services/ecrpublic/pom.xml +++ b/services/ecrpublic/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ecrpublic AWS Java SDK :: Services :: ECR PUBLIC diff --git a/services/ecs/pom.xml b/services/ecs/pom.xml index 981ff1d698cc..8d84702883ab 100644 --- a/services/ecs/pom.xml +++ b/services/ecs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ecs AWS Java SDK :: Services :: Amazon EC2 Container Service diff --git a/services/efs/pom.xml b/services/efs/pom.xml index 01c073bc9c8d..71db4145531e 100644 --- a/services/efs/pom.xml +++ b/services/efs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT efs AWS Java SDK :: Services :: Amazon Elastic File System diff --git a/services/eks/pom.xml b/services/eks/pom.xml index 6883ce17133e..a78fda5c40f9 100644 --- a/services/eks/pom.xml +++ b/services/eks/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT eks AWS Java SDK :: Services :: EKS diff --git a/services/eksauth/pom.xml b/services/eksauth/pom.xml index ac1cda43a9ac..39017903bd85 100644 --- a/services/eksauth/pom.xml +++ b/services/eksauth/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT eksauth AWS Java SDK :: Services :: EKS Auth diff --git a/services/elasticache/pom.xml b/services/elasticache/pom.xml index ba290a749d39..2302fe447805 100644 --- a/services/elasticache/pom.xml +++ b/services/elasticache/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT elasticache AWS Java SDK :: Services :: Amazon ElastiCache diff --git a/services/elasticbeanstalk/pom.xml b/services/elasticbeanstalk/pom.xml index d5fc7be0b4a3..bdf19ef303fa 100644 --- a/services/elasticbeanstalk/pom.xml +++ b/services/elasticbeanstalk/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT elasticbeanstalk AWS Java SDK :: Services :: AWS Elastic Beanstalk diff --git a/services/elasticinference/pom.xml b/services/elasticinference/pom.xml index 079efb76f80d..8742a9ce3d84 100644 --- a/services/elasticinference/pom.xml +++ b/services/elasticinference/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT elasticinference AWS Java SDK :: Services :: Elastic Inference diff --git a/services/elasticloadbalancing/pom.xml b/services/elasticloadbalancing/pom.xml index bf139fb043cc..466e63e2b359 100644 --- a/services/elasticloadbalancing/pom.xml +++ b/services/elasticloadbalancing/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT elasticloadbalancing AWS Java SDK :: Services :: Elastic Load Balancing diff --git a/services/elasticloadbalancingv2/pom.xml b/services/elasticloadbalancingv2/pom.xml index 4742567cc488..55c007961fc6 100644 --- a/services/elasticloadbalancingv2/pom.xml +++ b/services/elasticloadbalancingv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT elasticloadbalancingv2 AWS Java SDK :: Services :: Elastic Load Balancing V2 diff --git a/services/elasticsearch/pom.xml b/services/elasticsearch/pom.xml index e9a9b2cdfecf..b58e5240f74e 100644 --- a/services/elasticsearch/pom.xml +++ b/services/elasticsearch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT elasticsearch AWS Java SDK :: Services :: Amazon Elasticsearch Service diff --git a/services/elastictranscoder/pom.xml b/services/elastictranscoder/pom.xml index 4d1709809b49..9d010c58f3db 100644 --- a/services/elastictranscoder/pom.xml +++ b/services/elastictranscoder/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT elastictranscoder AWS Java SDK :: Services :: Amazon Elastic Transcoder diff --git a/services/emr/pom.xml b/services/emr/pom.xml index 772e4bb27dc5..5fe86bcc7a57 100644 --- a/services/emr/pom.xml +++ b/services/emr/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT emr AWS Java SDK :: Services :: Amazon EMR diff --git a/services/emrcontainers/pom.xml b/services/emrcontainers/pom.xml index 83fe8b1463d8..6fb395e574c2 100644 --- a/services/emrcontainers/pom.xml +++ b/services/emrcontainers/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT emrcontainers AWS Java SDK :: Services :: EMR Containers diff --git a/services/emrserverless/pom.xml b/services/emrserverless/pom.xml index cf64e29c2120..50487ba20a56 100644 --- a/services/emrserverless/pom.xml +++ b/services/emrserverless/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT emrserverless AWS Java SDK :: Services :: EMR Serverless diff --git a/services/entityresolution/pom.xml b/services/entityresolution/pom.xml index 7ce612fa0541..c801be3f2615 100644 --- a/services/entityresolution/pom.xml +++ b/services/entityresolution/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT entityresolution AWS Java SDK :: Services :: Entity Resolution diff --git a/services/eventbridge/pom.xml b/services/eventbridge/pom.xml index ae9c527f5069..0a3e226b7752 100644 --- a/services/eventbridge/pom.xml +++ b/services/eventbridge/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT eventbridge AWS Java SDK :: Services :: EventBridge diff --git a/services/evidently/pom.xml b/services/evidently/pom.xml index 4b0053647666..5ed92f641a33 100644 --- a/services/evidently/pom.xml +++ b/services/evidently/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT evidently AWS Java SDK :: Services :: Evidently diff --git a/services/finspace/pom.xml b/services/finspace/pom.xml index 14720255cae5..e9e35cba122b 100644 --- a/services/finspace/pom.xml +++ b/services/finspace/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT finspace AWS Java SDK :: Services :: Finspace diff --git a/services/finspacedata/pom.xml b/services/finspacedata/pom.xml index 725b53b4c1f4..00517bd607ce 100644 --- a/services/finspacedata/pom.xml +++ b/services/finspacedata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT finspacedata AWS Java SDK :: Services :: Finspace Data diff --git a/services/firehose/pom.xml b/services/firehose/pom.xml index 053f6eaa264f..63793254b478 100644 --- a/services/firehose/pom.xml +++ b/services/firehose/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT firehose AWS Java SDK :: Services :: Amazon Kinesis Firehose diff --git a/services/fis/pom.xml b/services/fis/pom.xml index 6bb1f2828e99..f63c550023fd 100644 --- a/services/fis/pom.xml +++ b/services/fis/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT fis AWS Java SDK :: Services :: Fis diff --git a/services/fms/pom.xml b/services/fms/pom.xml index 0bccaa71dfd5..e700195ac6c6 100644 --- a/services/fms/pom.xml +++ b/services/fms/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT fms AWS Java SDK :: Services :: FMS diff --git a/services/forecast/pom.xml b/services/forecast/pom.xml index fc91c372cf02..ff0d10971061 100644 --- a/services/forecast/pom.xml +++ b/services/forecast/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT forecast AWS Java SDK :: Services :: Forecast diff --git a/services/forecastquery/pom.xml b/services/forecastquery/pom.xml index d32243a1b356..0e168fe2bfe8 100644 --- a/services/forecastquery/pom.xml +++ b/services/forecastquery/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT forecastquery AWS Java SDK :: Services :: Forecastquery diff --git a/services/frauddetector/pom.xml b/services/frauddetector/pom.xml index 1c7ea031ded8..f30c61be2912 100644 --- a/services/frauddetector/pom.xml +++ b/services/frauddetector/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT frauddetector AWS Java SDK :: Services :: FraudDetector diff --git a/services/freetier/pom.xml b/services/freetier/pom.xml index 6ab54341eac0..06650376f8be 100644 --- a/services/freetier/pom.xml +++ b/services/freetier/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT freetier AWS Java SDK :: Services :: Free Tier diff --git a/services/fsx/pom.xml b/services/fsx/pom.xml index 6d8c362ed87e..059bff9bf5be 100644 --- a/services/fsx/pom.xml +++ b/services/fsx/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT fsx AWS Java SDK :: Services :: FSx diff --git a/services/gamelift/pom.xml b/services/gamelift/pom.xml index 8ee68a4be220..f7987ebc0e0c 100644 --- a/services/gamelift/pom.xml +++ b/services/gamelift/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT gamelift AWS Java SDK :: Services :: AWS GameLift diff --git a/services/glacier/pom.xml b/services/glacier/pom.xml index 947e9029a623..b8fdd14b57d7 100644 --- a/services/glacier/pom.xml +++ b/services/glacier/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT glacier AWS Java SDK :: Services :: Amazon Glacier diff --git a/services/globalaccelerator/pom.xml b/services/globalaccelerator/pom.xml index 3ef80bbf089f..e372534fb2ee 100644 --- a/services/globalaccelerator/pom.xml +++ b/services/globalaccelerator/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT globalaccelerator AWS Java SDK :: Services :: Global Accelerator diff --git a/services/glue/pom.xml b/services/glue/pom.xml index 001b89c393f5..4434a93ec901 100644 --- a/services/glue/pom.xml +++ b/services/glue/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 glue diff --git a/services/grafana/pom.xml b/services/grafana/pom.xml index 51e5c6a5e177..c59baf9140da 100644 --- a/services/grafana/pom.xml +++ b/services/grafana/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT grafana AWS Java SDK :: Services :: Grafana diff --git a/services/greengrass/pom.xml b/services/greengrass/pom.xml index b35fa62ae7d7..f52aeb586051 100644 --- a/services/greengrass/pom.xml +++ b/services/greengrass/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT greengrass AWS Java SDK :: Services :: AWS Greengrass diff --git a/services/greengrassv2/pom.xml b/services/greengrassv2/pom.xml index b352636a4378..0df17988de92 100644 --- a/services/greengrassv2/pom.xml +++ b/services/greengrassv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT greengrassv2 AWS Java SDK :: Services :: Greengrass V2 diff --git a/services/groundstation/pom.xml b/services/groundstation/pom.xml index 9c29ef772cba..9c689f41e7ea 100644 --- a/services/groundstation/pom.xml +++ b/services/groundstation/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT groundstation AWS Java SDK :: Services :: GroundStation diff --git a/services/guardduty/pom.xml b/services/guardduty/pom.xml index 149368affca4..c0df97c41183 100644 --- a/services/guardduty/pom.xml +++ b/services/guardduty/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 guardduty diff --git a/services/health/pom.xml b/services/health/pom.xml index 51cdec7718da..e8d465890b6d 100644 --- a/services/health/pom.xml +++ b/services/health/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.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 69a3f9570165..79761cf4df42 100644 --- a/services/healthlake/pom.xml +++ b/services/healthlake/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT healthlake AWS Java SDK :: Services :: Health Lake diff --git a/services/honeycode/pom.xml b/services/honeycode/pom.xml index 283bb0557fc7..6728ea6dc46b 100644 --- a/services/honeycode/pom.xml +++ b/services/honeycode/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT honeycode AWS Java SDK :: Services :: Honeycode diff --git a/services/iam/pom.xml b/services/iam/pom.xml index 6cf11142c22d..363ce03c4402 100644 --- a/services/iam/pom.xml +++ b/services/iam/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iam AWS Java SDK :: Services :: AWS IAM diff --git a/services/identitystore/pom.xml b/services/identitystore/pom.xml index d8df94ded4ad..04f6ece53c46 100644 --- a/services/identitystore/pom.xml +++ b/services/identitystore/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT identitystore AWS Java SDK :: Services :: Identitystore diff --git a/services/imagebuilder/pom.xml b/services/imagebuilder/pom.xml index ecadd82f4ff8..418e4f92b173 100644 --- a/services/imagebuilder/pom.xml +++ b/services/imagebuilder/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT imagebuilder AWS Java SDK :: Services :: Imagebuilder diff --git a/services/inspector/pom.xml b/services/inspector/pom.xml index 6867e8fadba9..26deb32af9d6 100644 --- a/services/inspector/pom.xml +++ b/services/inspector/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT inspector AWS Java SDK :: Services :: Amazon Inspector Service diff --git a/services/inspector2/pom.xml b/services/inspector2/pom.xml index 60f951439c02..515400164489 100644 --- a/services/inspector2/pom.xml +++ b/services/inspector2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT inspector2 AWS Java SDK :: Services :: Inspector2 diff --git a/services/inspectorscan/pom.xml b/services/inspectorscan/pom.xml index 2dddcee03480..30bcdd98a81a 100644 --- a/services/inspectorscan/pom.xml +++ b/services/inspectorscan/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT inspectorscan AWS Java SDK :: Services :: Inspector Scan diff --git a/services/internetmonitor/pom.xml b/services/internetmonitor/pom.xml index a8a7cecd6031..f988b2a15010 100644 --- a/services/internetmonitor/pom.xml +++ b/services/internetmonitor/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT internetmonitor AWS Java SDK :: Services :: Internet Monitor diff --git a/services/iot/pom.xml b/services/iot/pom.xml index 4d7bba0e0b00..9e2acf5d5c9d 100644 --- a/services/iot/pom.xml +++ b/services/iot/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iot AWS Java SDK :: Services :: AWS IoT diff --git a/services/iot1clickdevices/pom.xml b/services/iot1clickdevices/pom.xml index 17042f4232ff..9468af58791f 100644 --- a/services/iot1clickdevices/pom.xml +++ b/services/iot1clickdevices/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iot1clickdevices AWS Java SDK :: Services :: IoT 1Click Devices Service diff --git a/services/iot1clickprojects/pom.xml b/services/iot1clickprojects/pom.xml index 0e75dd8e1280..d87dd1eba3a9 100644 --- a/services/iot1clickprojects/pom.xml +++ b/services/iot1clickprojects/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iot1clickprojects AWS Java SDK :: Services :: IoT 1Click Projects diff --git a/services/iotanalytics/pom.xml b/services/iotanalytics/pom.xml index 6c6e5007f43a..1a43e3f49ce5 100644 --- a/services/iotanalytics/pom.xml +++ b/services/iotanalytics/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iotanalytics AWS Java SDK :: Services :: IoTAnalytics diff --git a/services/iotdataplane/pom.xml b/services/iotdataplane/pom.xml index d9a10f293996..459b2f6ecfdb 100644 --- a/services/iotdataplane/pom.xml +++ b/services/iotdataplane/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iotdataplane AWS Java SDK :: Services :: AWS IoT Data Plane diff --git a/services/iotdeviceadvisor/pom.xml b/services/iotdeviceadvisor/pom.xml index af4a5c6bb56b..6e2109198e52 100644 --- a/services/iotdeviceadvisor/pom.xml +++ b/services/iotdeviceadvisor/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iotdeviceadvisor AWS Java SDK :: Services :: Iot Device Advisor diff --git a/services/iotevents/pom.xml b/services/iotevents/pom.xml index c6b21977b95a..ccb18b9ea128 100644 --- a/services/iotevents/pom.xml +++ b/services/iotevents/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iotevents AWS Java SDK :: Services :: IoT Events diff --git a/services/ioteventsdata/pom.xml b/services/ioteventsdata/pom.xml index b82623191d79..51324b777ccd 100644 --- a/services/ioteventsdata/pom.xml +++ b/services/ioteventsdata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ioteventsdata AWS Java SDK :: Services :: IoT Events Data diff --git a/services/iotfleethub/pom.xml b/services/iotfleethub/pom.xml index a21b8c097670..d02d086b5623 100644 --- a/services/iotfleethub/pom.xml +++ b/services/iotfleethub/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iotfleethub AWS Java SDK :: Services :: Io T Fleet Hub diff --git a/services/iotfleetwise/pom.xml b/services/iotfleetwise/pom.xml index 5ad16c8d3af7..1957f4171d2c 100644 --- a/services/iotfleetwise/pom.xml +++ b/services/iotfleetwise/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iotfleetwise AWS Java SDK :: Services :: Io T Fleet Wise diff --git a/services/iotjobsdataplane/pom.xml b/services/iotjobsdataplane/pom.xml index 32d811360ae2..831c4efe3b3c 100644 --- a/services/iotjobsdataplane/pom.xml +++ b/services/iotjobsdataplane/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iotjobsdataplane AWS Java SDK :: Services :: IoT Jobs Data Plane diff --git a/services/iotroborunner/pom.xml b/services/iotroborunner/pom.xml index a299b285061e..f75b607cfee4 100644 --- a/services/iotroborunner/pom.xml +++ b/services/iotroborunner/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iotroborunner AWS Java SDK :: Services :: IoT Robo Runner diff --git a/services/iotsecuretunneling/pom.xml b/services/iotsecuretunneling/pom.xml index 6727edbbd666..cf3ceb251726 100644 --- a/services/iotsecuretunneling/pom.xml +++ b/services/iotsecuretunneling/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iotsecuretunneling AWS Java SDK :: Services :: IoTSecureTunneling diff --git a/services/iotsitewise/pom.xml b/services/iotsitewise/pom.xml index 80e0a486d5ed..41794c7d1c2b 100644 --- a/services/iotsitewise/pom.xml +++ b/services/iotsitewise/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iotsitewise AWS Java SDK :: Services :: Io T Site Wise diff --git a/services/iotthingsgraph/pom.xml b/services/iotthingsgraph/pom.xml index 365bed1da3fd..b0ff1c6b6b1d 100644 --- a/services/iotthingsgraph/pom.xml +++ b/services/iotthingsgraph/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iotthingsgraph AWS Java SDK :: Services :: IoTThingsGraph diff --git a/services/iottwinmaker/pom.xml b/services/iottwinmaker/pom.xml index 6856ff35da0a..de309b53e571 100644 --- a/services/iottwinmaker/pom.xml +++ b/services/iottwinmaker/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iottwinmaker AWS Java SDK :: Services :: Io T Twin Maker diff --git a/services/iotwireless/pom.xml b/services/iotwireless/pom.xml index b2f75203a5ed..0238e641dcc8 100644 --- a/services/iotwireless/pom.xml +++ b/services/iotwireless/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT iotwireless AWS Java SDK :: Services :: IoT Wireless diff --git a/services/ivs/pom.xml b/services/ivs/pom.xml index 414b6d8e30ec..0860b306c41e 100644 --- a/services/ivs/pom.xml +++ b/services/ivs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ivs AWS Java SDK :: Services :: Ivs diff --git a/services/ivschat/pom.xml b/services/ivschat/pom.xml index 777eec02c2d2..ab113e9a0538 100644 --- a/services/ivschat/pom.xml +++ b/services/ivschat/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ivschat AWS Java SDK :: Services :: Ivschat diff --git a/services/ivsrealtime/pom.xml b/services/ivsrealtime/pom.xml index 823a4f781fad..b3107fccb147 100644 --- a/services/ivsrealtime/pom.xml +++ b/services/ivsrealtime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ivsrealtime AWS Java SDK :: Services :: IVS Real Time diff --git a/services/kafka/pom.xml b/services/kafka/pom.xml index 4814694a6e94..853e70bf66f7 100644 --- a/services/kafka/pom.xml +++ b/services/kafka/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT kafka AWS Java SDK :: Services :: Kafka diff --git a/services/kafkaconnect/pom.xml b/services/kafkaconnect/pom.xml index e62334eb07ad..850535945619 100644 --- a/services/kafkaconnect/pom.xml +++ b/services/kafkaconnect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT kafkaconnect AWS Java SDK :: Services :: Kafka Connect diff --git a/services/kendra/pom.xml b/services/kendra/pom.xml index 84358fc958d9..a2ab2938162d 100644 --- a/services/kendra/pom.xml +++ b/services/kendra/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT kendra AWS Java SDK :: Services :: Kendra diff --git a/services/kendraranking/pom.xml b/services/kendraranking/pom.xml index 72f37264f88f..b7b5d356e4b9 100644 --- a/services/kendraranking/pom.xml +++ b/services/kendraranking/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT kendraranking AWS Java SDK :: Services :: Kendra Ranking diff --git a/services/keyspaces/pom.xml b/services/keyspaces/pom.xml index f42d75257da4..467a6fefb7fe 100644 --- a/services/keyspaces/pom.xml +++ b/services/keyspaces/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT keyspaces AWS Java SDK :: Services :: Keyspaces diff --git a/services/kinesis/pom.xml b/services/kinesis/pom.xml index d6756e7b70cc..61267c60f0d1 100644 --- a/services/kinesis/pom.xml +++ b/services/kinesis/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT kinesis AWS Java SDK :: Services :: Amazon Kinesis diff --git a/services/kinesisanalytics/pom.xml b/services/kinesisanalytics/pom.xml index 78dcb159f3eb..8c31dc5281a8 100644 --- a/services/kinesisanalytics/pom.xml +++ b/services/kinesisanalytics/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT kinesisanalytics AWS Java SDK :: Services :: Amazon Kinesis Analytics diff --git a/services/kinesisanalyticsv2/pom.xml b/services/kinesisanalyticsv2/pom.xml index ee3376fcf6fa..12a970985fcf 100644 --- a/services/kinesisanalyticsv2/pom.xml +++ b/services/kinesisanalyticsv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT kinesisanalyticsv2 AWS Java SDK :: Services :: Kinesis Analytics V2 diff --git a/services/kinesisvideo/pom.xml b/services/kinesisvideo/pom.xml index 3d60aafc40ea..0c758c3c0a92 100644 --- a/services/kinesisvideo/pom.xml +++ b/services/kinesisvideo/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 kinesisvideo diff --git a/services/kinesisvideoarchivedmedia/pom.xml b/services/kinesisvideoarchivedmedia/pom.xml index 7deec72b351a..26d1cae7c284 100644 --- a/services/kinesisvideoarchivedmedia/pom.xml +++ b/services/kinesisvideoarchivedmedia/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT kinesisvideoarchivedmedia AWS Java SDK :: Services :: Kinesis Video Archived Media diff --git a/services/kinesisvideomedia/pom.xml b/services/kinesisvideomedia/pom.xml index e261c6397e07..e0575176c3e1 100644 --- a/services/kinesisvideomedia/pom.xml +++ b/services/kinesisvideomedia/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT kinesisvideomedia AWS Java SDK :: Services :: Kinesis Video Media diff --git a/services/kinesisvideosignaling/pom.xml b/services/kinesisvideosignaling/pom.xml index 7c77091abd6c..806a9914a245 100644 --- a/services/kinesisvideosignaling/pom.xml +++ b/services/kinesisvideosignaling/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT kinesisvideosignaling AWS Java SDK :: Services :: Kinesis Video Signaling diff --git a/services/kinesisvideowebrtcstorage/pom.xml b/services/kinesisvideowebrtcstorage/pom.xml index 076f8df9a5e8..9bda0a223d3d 100644 --- a/services/kinesisvideowebrtcstorage/pom.xml +++ b/services/kinesisvideowebrtcstorage/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.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 4259e4d8667b..0e598c42a53c 100644 --- a/services/kms/pom.xml +++ b/services/kms/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT kms AWS Java SDK :: Services :: AWS KMS diff --git a/services/lakeformation/pom.xml b/services/lakeformation/pom.xml index 88ebb1aeabba..a59e212e1116 100644 --- a/services/lakeformation/pom.xml +++ b/services/lakeformation/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT lakeformation AWS Java SDK :: Services :: LakeFormation diff --git a/services/lambda/pom.xml b/services/lambda/pom.xml index db9b7e67b9d0..daa658dae927 100644 --- a/services/lambda/pom.xml +++ b/services/lambda/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT lambda AWS Java SDK :: Services :: AWS Lambda diff --git a/services/launchwizard/pom.xml b/services/launchwizard/pom.xml index 6eb51f15cc63..60af370fae60 100644 --- a/services/launchwizard/pom.xml +++ b/services/launchwizard/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT launchwizard AWS Java SDK :: Services :: Launch Wizard diff --git a/services/lexmodelbuilding/pom.xml b/services/lexmodelbuilding/pom.xml index 8a268cf1bb46..0bcae2a9c355 100644 --- a/services/lexmodelbuilding/pom.xml +++ b/services/lexmodelbuilding/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT lexmodelbuilding AWS Java SDK :: Services :: Amazon Lex Model Building diff --git a/services/lexmodelsv2/pom.xml b/services/lexmodelsv2/pom.xml index f2c3268bcb38..adf8647e5908 100644 --- a/services/lexmodelsv2/pom.xml +++ b/services/lexmodelsv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT lexmodelsv2 AWS Java SDK :: Services :: Lex Models V2 diff --git a/services/lexruntime/pom.xml b/services/lexruntime/pom.xml index ff8f6020a956..b57b706ba3c5 100644 --- a/services/lexruntime/pom.xml +++ b/services/lexruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT lexruntime AWS Java SDK :: Services :: Amazon Lex Runtime diff --git a/services/lexruntimev2/pom.xml b/services/lexruntimev2/pom.xml index 4ab30a5b4e4c..2fc1de67c2aa 100644 --- a/services/lexruntimev2/pom.xml +++ b/services/lexruntimev2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT lexruntimev2 AWS Java SDK :: Services :: Lex Runtime V2 diff --git a/services/licensemanager/pom.xml b/services/licensemanager/pom.xml index 52c2abc6d112..c248342f416c 100644 --- a/services/licensemanager/pom.xml +++ b/services/licensemanager/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT licensemanager AWS Java SDK :: Services :: License Manager diff --git a/services/licensemanagerlinuxsubscriptions/pom.xml b/services/licensemanagerlinuxsubscriptions/pom.xml index ab14cebafa9a..06f8684a72d0 100644 --- a/services/licensemanagerlinuxsubscriptions/pom.xml +++ b/services/licensemanagerlinuxsubscriptions/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT licensemanagerlinuxsubscriptions AWS Java SDK :: Services :: License Manager Linux Subscriptions diff --git a/services/licensemanagerusersubscriptions/pom.xml b/services/licensemanagerusersubscriptions/pom.xml index 1528e455ed57..b5b605086d27 100644 --- a/services/licensemanagerusersubscriptions/pom.xml +++ b/services/licensemanagerusersubscriptions/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT licensemanagerusersubscriptions AWS Java SDK :: Services :: License Manager User Subscriptions diff --git a/services/lightsail/pom.xml b/services/lightsail/pom.xml index c2b032efa9fd..2566716086c8 100644 --- a/services/lightsail/pom.xml +++ b/services/lightsail/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT lightsail AWS Java SDK :: Services :: Amazon Lightsail diff --git a/services/location/pom.xml b/services/location/pom.xml index 7fda7b062ae2..18db2471b3be 100644 --- a/services/location/pom.xml +++ b/services/location/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT location AWS Java SDK :: Services :: Location diff --git a/services/lookoutequipment/pom.xml b/services/lookoutequipment/pom.xml index 87c375d01e99..273fad810d40 100644 --- a/services/lookoutequipment/pom.xml +++ b/services/lookoutequipment/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT lookoutequipment AWS Java SDK :: Services :: Lookout Equipment diff --git a/services/lookoutmetrics/pom.xml b/services/lookoutmetrics/pom.xml index 794e55c9e584..488ef06765d1 100644 --- a/services/lookoutmetrics/pom.xml +++ b/services/lookoutmetrics/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT lookoutmetrics AWS Java SDK :: Services :: Lookout Metrics diff --git a/services/lookoutvision/pom.xml b/services/lookoutvision/pom.xml index 97c0c74dc1a3..ce87293b9a37 100644 --- a/services/lookoutvision/pom.xml +++ b/services/lookoutvision/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT lookoutvision AWS Java SDK :: Services :: Lookout Vision diff --git a/services/m2/pom.xml b/services/m2/pom.xml index 0ba0c7792660..7f115e0502c2 100644 --- a/services/m2/pom.xml +++ b/services/m2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT m2 AWS Java SDK :: Services :: M2 diff --git a/services/machinelearning/pom.xml b/services/machinelearning/pom.xml index 3ba7c33c0095..6571d67f795f 100644 --- a/services/machinelearning/pom.xml +++ b/services/machinelearning/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT machinelearning AWS Java SDK :: Services :: Amazon Machine Learning diff --git a/services/macie2/pom.xml b/services/macie2/pom.xml index 0679d8ca6a64..80935a1763de 100644 --- a/services/macie2/pom.xml +++ b/services/macie2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT macie2 AWS Java SDK :: Services :: Macie2 diff --git a/services/managedblockchain/pom.xml b/services/managedblockchain/pom.xml index b059880f1c1a..6711fc1ca645 100644 --- a/services/managedblockchain/pom.xml +++ b/services/managedblockchain/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT managedblockchain AWS Java SDK :: Services :: ManagedBlockchain diff --git a/services/managedblockchainquery/pom.xml b/services/managedblockchainquery/pom.xml index 22991ccb7cc2..a93b5145493f 100644 --- a/services/managedblockchainquery/pom.xml +++ b/services/managedblockchainquery/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT managedblockchainquery AWS Java SDK :: Services :: Managed Blockchain Query diff --git a/services/marketplaceagreement/pom.xml b/services/marketplaceagreement/pom.xml index 169b9789267f..0859efaa6063 100644 --- a/services/marketplaceagreement/pom.xml +++ b/services/marketplaceagreement/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT marketplaceagreement AWS Java SDK :: Services :: Marketplace Agreement diff --git a/services/marketplacecatalog/pom.xml b/services/marketplacecatalog/pom.xml index 59fc06c558c3..f563e98e05e6 100644 --- a/services/marketplacecatalog/pom.xml +++ b/services/marketplacecatalog/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT marketplacecatalog AWS Java SDK :: Services :: Marketplace Catalog diff --git a/services/marketplacecommerceanalytics/pom.xml b/services/marketplacecommerceanalytics/pom.xml index 99436f52e32d..622a2a6f1ddb 100644 --- a/services/marketplacecommerceanalytics/pom.xml +++ b/services/marketplacecommerceanalytics/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT marketplacecommerceanalytics AWS Java SDK :: Services :: AWS Marketplace Commerce Analytics diff --git a/services/marketplacedeployment/pom.xml b/services/marketplacedeployment/pom.xml index 3c187ba73467..aff8e54adcd7 100644 --- a/services/marketplacedeployment/pom.xml +++ b/services/marketplacedeployment/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT marketplacedeployment AWS Java SDK :: Services :: Marketplace Deployment diff --git a/services/marketplaceentitlement/pom.xml b/services/marketplaceentitlement/pom.xml index f9cfe75bac81..822cbc82c01e 100644 --- a/services/marketplaceentitlement/pom.xml +++ b/services/marketplaceentitlement/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT marketplaceentitlement AWS Java SDK :: Services :: AWS Marketplace Entitlement diff --git a/services/marketplacemetering/pom.xml b/services/marketplacemetering/pom.xml index a23ffbfd55e9..dcf4ca6918a9 100644 --- a/services/marketplacemetering/pom.xml +++ b/services/marketplacemetering/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT marketplacemetering AWS Java SDK :: Services :: AWS Marketplace Metering Service diff --git a/services/mediaconnect/pom.xml b/services/mediaconnect/pom.xml index 25d093d83729..b59831ecf97f 100644 --- a/services/mediaconnect/pom.xml +++ b/services/mediaconnect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT mediaconnect AWS Java SDK :: Services :: MediaConnect diff --git a/services/mediaconvert/pom.xml b/services/mediaconvert/pom.xml index c23a4b656a93..05ca695df201 100644 --- a/services/mediaconvert/pom.xml +++ b/services/mediaconvert/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 mediaconvert diff --git a/services/medialive/pom.xml b/services/medialive/pom.xml index 5d46a6743b30..7f0163dd6b3e 100644 --- a/services/medialive/pom.xml +++ b/services/medialive/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 medialive diff --git a/services/mediapackage/pom.xml b/services/mediapackage/pom.xml index 88e69b4593ea..5593f381d462 100644 --- a/services/mediapackage/pom.xml +++ b/services/mediapackage/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 mediapackage diff --git a/services/mediapackagev2/pom.xml b/services/mediapackagev2/pom.xml index 8d432a6c5817..e49625c45512 100644 --- a/services/mediapackagev2/pom.xml +++ b/services/mediapackagev2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT mediapackagev2 AWS Java SDK :: Services :: Media Package V2 diff --git a/services/mediapackagevod/pom.xml b/services/mediapackagevod/pom.xml index f823b9e1b3dc..844756eb029c 100644 --- a/services/mediapackagevod/pom.xml +++ b/services/mediapackagevod/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT mediapackagevod AWS Java SDK :: Services :: MediaPackage Vod diff --git a/services/mediastore/pom.xml b/services/mediastore/pom.xml index cfadefc4cd0c..9d359b3e5cd1 100644 --- a/services/mediastore/pom.xml +++ b/services/mediastore/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 mediastore diff --git a/services/mediastoredata/pom.xml b/services/mediastoredata/pom.xml index ba05c498de5e..d022f5d4e577 100644 --- a/services/mediastoredata/pom.xml +++ b/services/mediastoredata/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 mediastoredata diff --git a/services/mediatailor/pom.xml b/services/mediatailor/pom.xml index dcdfb444c489..c2d79fe5025a 100644 --- a/services/mediatailor/pom.xml +++ b/services/mediatailor/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT mediatailor AWS Java SDK :: Services :: MediaTailor diff --git a/services/medicalimaging/pom.xml b/services/medicalimaging/pom.xml index 9a0d6a3f1a58..9f1ec87146c6 100644 --- a/services/medicalimaging/pom.xml +++ b/services/medicalimaging/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT medicalimaging AWS Java SDK :: Services :: Medical Imaging diff --git a/services/memorydb/pom.xml b/services/memorydb/pom.xml index 2f03e01d2e36..d9efbd7a31d6 100644 --- a/services/memorydb/pom.xml +++ b/services/memorydb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT memorydb AWS Java SDK :: Services :: Memory DB diff --git a/services/mgn/pom.xml b/services/mgn/pom.xml index 69a165d8eb2c..6153e941c477 100644 --- a/services/mgn/pom.xml +++ b/services/mgn/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT mgn AWS Java SDK :: Services :: Mgn diff --git a/services/migrationhub/pom.xml b/services/migrationhub/pom.xml index 6931aba6a4d4..2030e42f49b7 100644 --- a/services/migrationhub/pom.xml +++ b/services/migrationhub/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 migrationhub diff --git a/services/migrationhubconfig/pom.xml b/services/migrationhubconfig/pom.xml index 0d81475d49ce..64f7e6558959 100644 --- a/services/migrationhubconfig/pom.xml +++ b/services/migrationhubconfig/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT migrationhubconfig AWS Java SDK :: Services :: MigrationHub Config diff --git a/services/migrationhuborchestrator/pom.xml b/services/migrationhuborchestrator/pom.xml index 7b0b76e9d86b..fa8d5107877e 100644 --- a/services/migrationhuborchestrator/pom.xml +++ b/services/migrationhuborchestrator/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT migrationhuborchestrator AWS Java SDK :: Services :: Migration Hub Orchestrator diff --git a/services/migrationhubrefactorspaces/pom.xml b/services/migrationhubrefactorspaces/pom.xml index 10283968174b..b503938f5cf7 100644 --- a/services/migrationhubrefactorspaces/pom.xml +++ b/services/migrationhubrefactorspaces/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT migrationhubrefactorspaces AWS Java SDK :: Services :: Migration Hub Refactor Spaces diff --git a/services/migrationhubstrategy/pom.xml b/services/migrationhubstrategy/pom.xml index e8d87c4fb978..33b255f2071a 100644 --- a/services/migrationhubstrategy/pom.xml +++ b/services/migrationhubstrategy/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT migrationhubstrategy AWS Java SDK :: Services :: Migration Hub Strategy diff --git a/services/mobile/pom.xml b/services/mobile/pom.xml index 7e51bed995c0..bb6c9806f1e5 100644 --- a/services/mobile/pom.xml +++ b/services/mobile/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 mobile diff --git a/services/mq/pom.xml b/services/mq/pom.xml index 6f7468518fb2..5a69402117c0 100644 --- a/services/mq/pom.xml +++ b/services/mq/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 mq diff --git a/services/mturk/pom.xml b/services/mturk/pom.xml index 2ba3297bf3c1..8868c9806b00 100644 --- a/services/mturk/pom.xml +++ b/services/mturk/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT mturk AWS Java SDK :: Services :: Amazon Mechanical Turk Requester diff --git a/services/mwaa/pom.xml b/services/mwaa/pom.xml index 9bf0309f57c3..e2024b1dfc48 100644 --- a/services/mwaa/pom.xml +++ b/services/mwaa/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT mwaa AWS Java SDK :: Services :: MWAA diff --git a/services/neptune/pom.xml b/services/neptune/pom.xml index 18feacb9237b..16a5284835f1 100644 --- a/services/neptune/pom.xml +++ b/services/neptune/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT neptune AWS Java SDK :: Services :: Neptune diff --git a/services/neptunedata/pom.xml b/services/neptunedata/pom.xml index eac455251d77..e7c8d8ad14ce 100644 --- a/services/neptunedata/pom.xml +++ b/services/neptunedata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT neptunedata AWS Java SDK :: Services :: Neptunedata diff --git a/services/neptunegraph/pom.xml b/services/neptunegraph/pom.xml index 35429a701356..ce6e6df2cca2 100644 --- a/services/neptunegraph/pom.xml +++ b/services/neptunegraph/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT neptunegraph AWS Java SDK :: Services :: Neptune Graph diff --git a/services/networkfirewall/pom.xml b/services/networkfirewall/pom.xml index 08dcf327d446..d6421d5de82a 100644 --- a/services/networkfirewall/pom.xml +++ b/services/networkfirewall/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT networkfirewall AWS Java SDK :: Services :: Network Firewall diff --git a/services/networkmanager/pom.xml b/services/networkmanager/pom.xml index 6a9d282231c3..c66eeea59aa3 100644 --- a/services/networkmanager/pom.xml +++ b/services/networkmanager/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT networkmanager AWS Java SDK :: Services :: NetworkManager diff --git a/services/nimble/pom.xml b/services/nimble/pom.xml index 1921d0513fd8..c0391ddd555b 100644 --- a/services/nimble/pom.xml +++ b/services/nimble/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT nimble AWS Java SDK :: Services :: Nimble diff --git a/services/oam/pom.xml b/services/oam/pom.xml index 2215b000a6c3..727578cae551 100644 --- a/services/oam/pom.xml +++ b/services/oam/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT oam AWS Java SDK :: Services :: OAM diff --git a/services/omics/pom.xml b/services/omics/pom.xml index ca4656a2d1fa..442539d4743f 100644 --- a/services/omics/pom.xml +++ b/services/omics/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT omics AWS Java SDK :: Services :: Omics diff --git a/services/opensearch/pom.xml b/services/opensearch/pom.xml index 3f3d4904e1e3..7f2724b95d27 100644 --- a/services/opensearch/pom.xml +++ b/services/opensearch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT opensearch AWS Java SDK :: Services :: Open Search diff --git a/services/opensearchserverless/pom.xml b/services/opensearchserverless/pom.xml index 0fcb87e4991b..18aaf0667ee7 100644 --- a/services/opensearchserverless/pom.xml +++ b/services/opensearchserverless/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT opensearchserverless AWS Java SDK :: Services :: Open Search Serverless diff --git a/services/opsworks/pom.xml b/services/opsworks/pom.xml index b599681dd7d2..397262f47539 100644 --- a/services/opsworks/pom.xml +++ b/services/opsworks/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT opsworks AWS Java SDK :: Services :: AWS OpsWorks diff --git a/services/opsworkscm/pom.xml b/services/opsworkscm/pom.xml index b30aeb6aeabb..c2a4066dfc4b 100644 --- a/services/opsworkscm/pom.xml +++ b/services/opsworkscm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT opsworkscm AWS Java SDK :: Services :: AWS OpsWorks for Chef Automate diff --git a/services/organizations/pom.xml b/services/organizations/pom.xml index b34856315d6d..0676ea05d372 100644 --- a/services/organizations/pom.xml +++ b/services/organizations/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT organizations AWS Java SDK :: Services :: AWS Organizations diff --git a/services/osis/pom.xml b/services/osis/pom.xml index cfaae4201f4e..99efa5d6f836 100644 --- a/services/osis/pom.xml +++ b/services/osis/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT osis AWS Java SDK :: Services :: OSIS diff --git a/services/outposts/pom.xml b/services/outposts/pom.xml index 043356511cf4..0fbada201a48 100644 --- a/services/outposts/pom.xml +++ b/services/outposts/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT outposts AWS Java SDK :: Services :: Outposts diff --git a/services/panorama/pom.xml b/services/panorama/pom.xml index 415ac305179b..81d364ed5266 100644 --- a/services/panorama/pom.xml +++ b/services/panorama/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT panorama AWS Java SDK :: Services :: Panorama diff --git a/services/paymentcryptography/pom.xml b/services/paymentcryptography/pom.xml index b5e552583a7d..6c50505302c4 100644 --- a/services/paymentcryptography/pom.xml +++ b/services/paymentcryptography/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT paymentcryptography AWS Java SDK :: Services :: Payment Cryptography diff --git a/services/paymentcryptographydata/pom.xml b/services/paymentcryptographydata/pom.xml index 569d919e39c0..3ed81546476e 100644 --- a/services/paymentcryptographydata/pom.xml +++ b/services/paymentcryptographydata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT paymentcryptographydata AWS Java SDK :: Services :: Payment Cryptography Data diff --git a/services/pcaconnectorad/pom.xml b/services/pcaconnectorad/pom.xml index c3209a95f2a5..ea15ff20f656 100644 --- a/services/pcaconnectorad/pom.xml +++ b/services/pcaconnectorad/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT pcaconnectorad AWS Java SDK :: Services :: Pca Connector Ad diff --git a/services/personalize/pom.xml b/services/personalize/pom.xml index ced35e9e5181..b62c6a6a2ce5 100644 --- a/services/personalize/pom.xml +++ b/services/personalize/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT personalize AWS Java SDK :: Services :: Personalize diff --git a/services/personalizeevents/pom.xml b/services/personalizeevents/pom.xml index 20b5dbfbe566..e18e4a449e3c 100644 --- a/services/personalizeevents/pom.xml +++ b/services/personalizeevents/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT personalizeevents AWS Java SDK :: Services :: Personalize Events diff --git a/services/personalizeruntime/pom.xml b/services/personalizeruntime/pom.xml index a08be4043c1a..4f491fbdeec3 100644 --- a/services/personalizeruntime/pom.xml +++ b/services/personalizeruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT personalizeruntime AWS Java SDK :: Services :: Personalize Runtime diff --git a/services/pi/pom.xml b/services/pi/pom.xml index 55400f0fefb7..373abfade2e1 100644 --- a/services/pi/pom.xml +++ b/services/pi/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT pi AWS Java SDK :: Services :: PI diff --git a/services/pinpoint/pom.xml b/services/pinpoint/pom.xml index b95b76220853..135b2cd26315 100644 --- a/services/pinpoint/pom.xml +++ b/services/pinpoint/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT pinpoint AWS Java SDK :: Services :: Amazon Pinpoint diff --git a/services/pinpointemail/pom.xml b/services/pinpointemail/pom.xml index e63190319e0f..9d9fdc82fbb7 100644 --- a/services/pinpointemail/pom.xml +++ b/services/pinpointemail/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT pinpointemail AWS Java SDK :: Services :: Pinpoint Email diff --git a/services/pinpointsmsvoice/pom.xml b/services/pinpointsmsvoice/pom.xml index f2d47748fce0..8cc703c5d955 100644 --- a/services/pinpointsmsvoice/pom.xml +++ b/services/pinpointsmsvoice/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT pinpointsmsvoice AWS Java SDK :: Services :: Pinpoint SMS Voice diff --git a/services/pinpointsmsvoicev2/pom.xml b/services/pinpointsmsvoicev2/pom.xml index 805ef163bb8c..51c1f12ff6de 100644 --- a/services/pinpointsmsvoicev2/pom.xml +++ b/services/pinpointsmsvoicev2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT pinpointsmsvoicev2 AWS Java SDK :: Services :: Pinpoint SMS Voice V2 diff --git a/services/pipes/pom.xml b/services/pipes/pom.xml index 73ff72515bf5..1a4f91165c68 100644 --- a/services/pipes/pom.xml +++ b/services/pipes/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT pipes AWS Java SDK :: Services :: Pipes diff --git a/services/polly/pom.xml b/services/polly/pom.xml index facfcd2e4bc3..89d51fa05059 100644 --- a/services/polly/pom.xml +++ b/services/polly/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT polly AWS Java SDK :: Services :: Amazon Polly diff --git a/services/pom.xml b/services/pom.xml index 15b81b67fa0a..1c0b9f6a6e82 100644 --- a/services/pom.xml +++ b/services/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT services AWS Java SDK :: Services diff --git a/services/pricing/pom.xml b/services/pricing/pom.xml index b36c4c0551e4..4ee1e2dccd72 100644 --- a/services/pricing/pom.xml +++ b/services/pricing/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 pricing diff --git a/services/privatenetworks/pom.xml b/services/privatenetworks/pom.xml index 40af4d89262b..abe848b090a2 100644 --- a/services/privatenetworks/pom.xml +++ b/services/privatenetworks/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT privatenetworks AWS Java SDK :: Services :: Private Networks diff --git a/services/proton/pom.xml b/services/proton/pom.xml index 13b98296ebea..9a4d6efd6b86 100644 --- a/services/proton/pom.xml +++ b/services/proton/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT proton AWS Java SDK :: Services :: Proton diff --git a/services/qbusiness/pom.xml b/services/qbusiness/pom.xml index 0718cac0d168..f8ed3811a5b7 100644 --- a/services/qbusiness/pom.xml +++ b/services/qbusiness/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT qbusiness AWS Java SDK :: Services :: Q Business diff --git a/services/qconnect/pom.xml b/services/qconnect/pom.xml index bd4c4b020c6c..03c901018a2a 100644 --- a/services/qconnect/pom.xml +++ b/services/qconnect/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT qconnect AWS Java SDK :: Services :: Q Connect diff --git a/services/qldb/pom.xml b/services/qldb/pom.xml index e0943c7d612c..6d468e5c2495 100644 --- a/services/qldb/pom.xml +++ b/services/qldb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT qldb AWS Java SDK :: Services :: QLDB diff --git a/services/qldbsession/pom.xml b/services/qldbsession/pom.xml index ec173ff3a0d1..9a6b8e2e02bc 100644 --- a/services/qldbsession/pom.xml +++ b/services/qldbsession/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT qldbsession AWS Java SDK :: Services :: QLDB Session diff --git a/services/quicksight/pom.xml b/services/quicksight/pom.xml index 6fbe746649c8..a121fb703de2 100644 --- a/services/quicksight/pom.xml +++ b/services/quicksight/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT quicksight AWS Java SDK :: Services :: QuickSight diff --git a/services/ram/pom.xml b/services/ram/pom.xml index 83dbd88f46a4..34b32ba1fe2c 100644 --- a/services/ram/pom.xml +++ b/services/ram/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ram AWS Java SDK :: Services :: RAM diff --git a/services/rbin/pom.xml b/services/rbin/pom.xml index da876aec5751..cfd3eb908d55 100644 --- a/services/rbin/pom.xml +++ b/services/rbin/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT rbin AWS Java SDK :: Services :: Rbin diff --git a/services/rds/pom.xml b/services/rds/pom.xml index e8f5dfc1a6f1..b921639bdc28 100644 --- a/services/rds/pom.xml +++ b/services/rds/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT rds AWS Java SDK :: Services :: Amazon RDS diff --git a/services/rdsdata/pom.xml b/services/rdsdata/pom.xml index ea92b7110334..93a3d9fc7f16 100644 --- a/services/rdsdata/pom.xml +++ b/services/rdsdata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT rdsdata AWS Java SDK :: Services :: RDS Data diff --git a/services/redshift/pom.xml b/services/redshift/pom.xml index 75046caba112..8c6d8284d4b5 100644 --- a/services/redshift/pom.xml +++ b/services/redshift/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT redshift AWS Java SDK :: Services :: Amazon Redshift diff --git a/services/redshiftdata/pom.xml b/services/redshiftdata/pom.xml index c3c4ce052e08..f1f3f6382d7c 100644 --- a/services/redshiftdata/pom.xml +++ b/services/redshiftdata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT redshiftdata AWS Java SDK :: Services :: Redshift Data diff --git a/services/redshiftserverless/pom.xml b/services/redshiftserverless/pom.xml index c49583e402e6..de33159e66ef 100644 --- a/services/redshiftserverless/pom.xml +++ b/services/redshiftserverless/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT redshiftserverless AWS Java SDK :: Services :: Redshift Serverless diff --git a/services/rekognition/pom.xml b/services/rekognition/pom.xml index 51a9c946f086..6743b6fa8f26 100644 --- a/services/rekognition/pom.xml +++ b/services/rekognition/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT rekognition AWS Java SDK :: Services :: Amazon Rekognition diff --git a/services/repostspace/pom.xml b/services/repostspace/pom.xml index 996094023bbe..15b4db8ba9b6 100644 --- a/services/repostspace/pom.xml +++ b/services/repostspace/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT repostspace AWS Java SDK :: Services :: Repostspace diff --git a/services/resiliencehub/pom.xml b/services/resiliencehub/pom.xml index 0a8cd68344b8..fb8dfbd5b8c4 100644 --- a/services/resiliencehub/pom.xml +++ b/services/resiliencehub/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT resiliencehub AWS Java SDK :: Services :: Resiliencehub diff --git a/services/resourceexplorer2/pom.xml b/services/resourceexplorer2/pom.xml index b78bad8318cb..f793091b847a 100644 --- a/services/resourceexplorer2/pom.xml +++ b/services/resourceexplorer2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT resourceexplorer2 AWS Java SDK :: Services :: Resource Explorer 2 diff --git a/services/resourcegroups/pom.xml b/services/resourcegroups/pom.xml index ea71d289046e..dbb6edd5972d 100644 --- a/services/resourcegroups/pom.xml +++ b/services/resourcegroups/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 resourcegroups diff --git a/services/resourcegroupstaggingapi/pom.xml b/services/resourcegroupstaggingapi/pom.xml index b59917d5ef1f..c9c6689ad33b 100644 --- a/services/resourcegroupstaggingapi/pom.xml +++ b/services/resourcegroupstaggingapi/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT resourcegroupstaggingapi AWS Java SDK :: Services :: AWS Resource Groups Tagging API diff --git a/services/robomaker/pom.xml b/services/robomaker/pom.xml index fa7858e9d5e0..22683c86d569 100644 --- a/services/robomaker/pom.xml +++ b/services/robomaker/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT robomaker AWS Java SDK :: Services :: RoboMaker diff --git a/services/rolesanywhere/pom.xml b/services/rolesanywhere/pom.xml index ac689047b78d..7ab7c21517ee 100644 --- a/services/rolesanywhere/pom.xml +++ b/services/rolesanywhere/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT rolesanywhere AWS Java SDK :: Services :: Roles Anywhere diff --git a/services/route53/pom.xml b/services/route53/pom.xml index 2ea5b7269ad3..56e6dcd71443 100644 --- a/services/route53/pom.xml +++ b/services/route53/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT route53 AWS Java SDK :: Services :: Amazon Route53 diff --git a/services/route53domains/pom.xml b/services/route53domains/pom.xml index a28dc23f14ec..9c9dee484fd4 100644 --- a/services/route53domains/pom.xml +++ b/services/route53domains/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT route53domains AWS Java SDK :: Services :: Amazon Route53 Domains diff --git a/services/route53recoverycluster/pom.xml b/services/route53recoverycluster/pom.xml index 0a06941cd6ad..29fb0f78dc1e 100644 --- a/services/route53recoverycluster/pom.xml +++ b/services/route53recoverycluster/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT route53recoverycluster AWS Java SDK :: Services :: Route53 Recovery Cluster diff --git a/services/route53recoverycontrolconfig/pom.xml b/services/route53recoverycontrolconfig/pom.xml index dc433fba4426..d404906d6213 100644 --- a/services/route53recoverycontrolconfig/pom.xml +++ b/services/route53recoverycontrolconfig/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT route53recoverycontrolconfig AWS Java SDK :: Services :: Route53 Recovery Control Config diff --git a/services/route53recoveryreadiness/pom.xml b/services/route53recoveryreadiness/pom.xml index e9d733396949..87b34de4d6d8 100644 --- a/services/route53recoveryreadiness/pom.xml +++ b/services/route53recoveryreadiness/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT route53recoveryreadiness AWS Java SDK :: Services :: Route53 Recovery Readiness diff --git a/services/route53resolver/pom.xml b/services/route53resolver/pom.xml index dec2e8b30a81..2189dc8350a8 100644 --- a/services/route53resolver/pom.xml +++ b/services/route53resolver/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT route53resolver AWS Java SDK :: Services :: Route53Resolver diff --git a/services/rum/pom.xml b/services/rum/pom.xml index 0b5edf831362..6f0762644590 100644 --- a/services/rum/pom.xml +++ b/services/rum/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT rum AWS Java SDK :: Services :: RUM diff --git a/services/s3/pom.xml b/services/s3/pom.xml index 6f0d12aba701..2d3affd22daf 100644 --- a/services/s3/pom.xml +++ b/services/s3/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT s3 AWS Java SDK :: Services :: Amazon S3 @@ -174,6 +174,12 @@ ${awsjavasdk.version} test + + software.amazon.awssdk + aws-crt-client + ${awsjavasdk.version} + test + io.netty netty-transport diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/SelectObjectContentIntegrationTest.java b/services/s3/src/it/java/software/amazon/awssdk/services/SelectObjectContentIntegrationTest.java index f42482795452..05993a13aa64 100644 --- a/services/s3/src/it/java/software/amazon/awssdk/services/SelectObjectContentIntegrationTest.java +++ b/services/s3/src/it/java/software/amazon/awssdk/services/SelectObjectContentIntegrationTest.java @@ -77,7 +77,7 @@ public static void teardown() { } finally { s3AsyncClients().forEach(SdkAutoCloseable::close); s3.close(); - CrtResource.waitForNoResources(); + } } diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/S3IntegrationTestBase.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/S3IntegrationTestBase.java index 03cf42afe5df..02afbebb7f72 100644 --- a/services/s3/src/it/java/software/amazon/awssdk/services/s3/S3IntegrationTestBase.java +++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/S3IntegrationTestBase.java @@ -17,12 +17,14 @@ import static org.assertj.core.api.Assertions.assertThat; +import org.junit.AfterClass; import org.junit.BeforeClass; import software.amazon.awssdk.core.ClientType; import software.amazon.awssdk.core.interceptor.Context; import software.amazon.awssdk.core.interceptor.ExecutionAttributes; import software.amazon.awssdk.core.interceptor.ExecutionInterceptor; import software.amazon.awssdk.crt.Log; +import software.amazon.awssdk.http.crt.AwsCrtHttpClient; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.model.BucketLocationConstraint; import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration; @@ -51,11 +53,18 @@ public class S3IntegrationTestBase extends AwsTestBase { */ @BeforeClass public static void setUp() throws Exception { + System.setProperty("aws.crt.debugnative", "true"); Log.initLoggingToStdout(Log.LogLevel.Warn); s3 = s3ClientBuilder().build(); s3Async = s3AsyncClientBuilder().build(); } + @AfterClass + public static void cleanUpResources() { + s3.close(); + s3Async.close(); + } + protected static S3ClientBuilder s3ClientBuilder() { return S3Client.builder() .region(DEFAULT_REGION) @@ -64,6 +73,15 @@ protected static S3ClientBuilder s3ClientBuilder() { new UserAgentVerifyingExecutionInterceptor("Apache", ClientType.SYNC))); } + protected static S3ClientBuilder s3ClientBuilderWithCrtHttpClient() { + return S3Client.builder() + .region(DEFAULT_REGION) + .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN) + .httpClientBuilder(AwsCrtHttpClient.builder()) + .overrideConfiguration(o -> o.addExecutionInterceptor( + new UserAgentVerifyingExecutionInterceptor("AwsCommonRuntime", ClientType.SYNC))); + } + protected static S3AsyncClientBuilder s3AsyncClientBuilder() { return S3AsyncClient.builder() .region(DEFAULT_REGION) diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/ChecksumIntegrationTest.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/ChecksumIntegrationTest.java index 1507f626cde5..5dca87203369 100644 --- a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/ChecksumIntegrationTest.java +++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/ChecksumIntegrationTest.java @@ -66,7 +66,7 @@ public static void teardown() throws IOException { S3IntegrationTestBase.deleteBucketAndAllContents(TEST_BUCKET); Files.delete(testFile.toPath()); s3Crt.close(); - CrtResource.waitForNoResources(); + } @Test diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/CrtExceptionTransformationIntegrationTest.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/CrtExceptionTransformationIntegrationTest.java index 87cdb3e2d1d2..d40768da1590 100644 --- a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/CrtExceptionTransformationIntegrationTest.java +++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/CrtExceptionTransformationIntegrationTest.java @@ -61,7 +61,7 @@ public static void setupFixture() throws Exception { public static void tearDownFixture() { S3IntegrationTestBase.deleteBucketAndAllContents(BUCKET); s3Crt.close(); - CrtResource.waitForNoResources(); + } @Test diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrossRegionCrtIntegrationTest.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrossRegionCrtIntegrationTest.java index 72c6fce095ce..2f0cf4e6ceec 100644 --- a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrossRegionCrtIntegrationTest.java +++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrossRegionCrtIntegrationTest.java @@ -84,7 +84,7 @@ public static void cleanup() { crtClient.close(); S3IntegrationTestBase.deleteBucketAndAllContents(BUCKET); executorService.shutdown(); - CrtResource.waitForNoResources(); + } @Test diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtClientPutObjectIntegrationTest.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtClientPutObjectIntegrationTest.java index 133b9da0a858..911214dade11 100644 --- a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtClientPutObjectIntegrationTest.java +++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtClientPutObjectIntegrationTest.java @@ -74,7 +74,7 @@ public static void teardown() throws IOException { S3IntegrationTestBase.deleteBucketAndAllContents(TEST_BUCKET); Files.delete(testFile.toPath()); s3Crt.close(); - CrtResource.waitForNoResources(); + } @Test diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtGetObjectIntegrationTest.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtGetObjectIntegrationTest.java index a7ea924c5fe4..8c7265dd6e19 100644 --- a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtGetObjectIntegrationTest.java +++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crt/S3CrtGetObjectIntegrationTest.java @@ -66,7 +66,6 @@ public static void cleanup() { crtClient.close(); S3IntegrationTestBase.deleteBucketAndAllContents(BUCKET); executorService.shutdown(); - CrtResource.waitForNoResources(); } @Test diff --git a/services/s3/src/it/java/software/amazon/awssdk/services/s3/crthttpclient/S3WithCrtHttpClientsIntegrationTests.java b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crthttpclient/S3WithCrtHttpClientsIntegrationTests.java new file mode 100644 index 000000000000..f1eb1c6e4f23 --- /dev/null +++ b/services/s3/src/it/java/software/amazon/awssdk/services/s3/crthttpclient/S3WithCrtHttpClientsIntegrationTests.java @@ -0,0 +1,83 @@ +/* + * 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.s3.crthttpclient; + +import static org.assertj.core.api.Assertions.assertThat; +import static software.amazon.awssdk.testutils.service.S3BucketUtils.temporaryBucketName; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import software.amazon.awssdk.core.ResponseInputStream; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.core.sync.ResponseTransformer; +import software.amazon.awssdk.crt.CrtResource; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.S3IntegrationTestBase; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; +import software.amazon.awssdk.services.s3.utils.ChecksumUtils; +import software.amazon.awssdk.testutils.RandomTempFile; +import software.amazon.awssdk.utils.Md5Utils; + +public class S3WithCrtHttpClientsIntegrationTests extends S3IntegrationTestBase { + private static final String TEST_BUCKET = temporaryBucketName(S3WithCrtHttpClientsIntegrationTests.class); + private static final String TEST_KEY = "2mib_file.dat"; + private static final int OBJ_SIZE = 2 * 1024 * 1024; + + private static S3Client s3WithCrtHttpClient; + private static RandomTempFile testFile; + + @BeforeAll + public static void setup() throws Exception { + S3IntegrationTestBase.setUp(); + S3IntegrationTestBase.createBucket(TEST_BUCKET); + testFile = new RandomTempFile(TEST_KEY, OBJ_SIZE); + s3WithCrtHttpClient = s3ClientBuilderWithCrtHttpClient().build(); + s3WithCrtHttpClient.putObject(r -> r.bucket(TEST_BUCKET).key(TEST_KEY), RequestBody.fromFile(testFile.toPath())); + } + + @AfterAll + public static void teardown() throws IOException { + S3IntegrationTestBase.deleteBucketAndAllContents(TEST_BUCKET); + Files.delete(testFile.toPath()); + s3WithCrtHttpClient.close(); + + } + + @Test + void getObject_toResponseStream_objectSentCorrectly() throws Exception { + ResponseInputStream objContent = + s3WithCrtHttpClient.getObject(r -> r.bucket(TEST_BUCKET).key(TEST_KEY), + ResponseTransformer.toInputStream()); + + byte[] expectedSum = ChecksumUtils.computeCheckSum(Files.newInputStream(testFile.toPath())); + + assertThat(ChecksumUtils.computeCheckSum(objContent)).isEqualTo(expectedSum); + } + + @Test + void getObject_toFile_objectSentCorrectly() throws Exception { + Path destination = RandomTempFile.randomUncreatedFile().toPath(); + GetObjectResponse response = s3WithCrtHttpClient.getObject(r -> r.bucket(TEST_BUCKET).key(TEST_KEY), + ResponseTransformer.toFile(destination)); + + assertThat(Md5Utils.md5AsBase64(destination.toFile())).isEqualTo(Md5Utils.md5AsBase64(testFile)); + } +} diff --git a/services/s3control/pom.xml b/services/s3control/pom.xml index 6cd68c377ee6..e41c522ca863 100644 --- a/services/s3control/pom.xml +++ b/services/s3control/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT s3control AWS Java SDK :: Services :: Amazon S3 Control diff --git a/services/s3outposts/pom.xml b/services/s3outposts/pom.xml index a61b602aad81..1ce7958ffae0 100644 --- a/services/s3outposts/pom.xml +++ b/services/s3outposts/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT s3outposts AWS Java SDK :: Services :: S3 Outposts diff --git a/services/sagemaker/pom.xml b/services/sagemaker/pom.xml index ce49c7a4172c..fa2887b82695 100644 --- a/services/sagemaker/pom.xml +++ b/services/sagemaker/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 sagemaker diff --git a/services/sagemakera2iruntime/pom.xml b/services/sagemakera2iruntime/pom.xml index c803fbd04552..0217a578c884 100644 --- a/services/sagemakera2iruntime/pom.xml +++ b/services/sagemakera2iruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT sagemakera2iruntime AWS Java SDK :: Services :: SageMaker A2I Runtime diff --git a/services/sagemakeredge/pom.xml b/services/sagemakeredge/pom.xml index b6b87996224a..2fe98a850de0 100644 --- a/services/sagemakeredge/pom.xml +++ b/services/sagemakeredge/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT sagemakeredge AWS Java SDK :: Services :: Sagemaker Edge diff --git a/services/sagemakerfeaturestoreruntime/pom.xml b/services/sagemakerfeaturestoreruntime/pom.xml index 19a9b6984fbe..e088c6134d34 100644 --- a/services/sagemakerfeaturestoreruntime/pom.xml +++ b/services/sagemakerfeaturestoreruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.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 d7b2c6a801e0..d07413e3bcfa 100644 --- a/services/sagemakergeospatial/pom.xml +++ b/services/sagemakergeospatial/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT sagemakergeospatial AWS Java SDK :: Services :: Sage Maker Geospatial diff --git a/services/sagemakermetrics/pom.xml b/services/sagemakermetrics/pom.xml index 42f73b696268..48cb94527085 100644 --- a/services/sagemakermetrics/pom.xml +++ b/services/sagemakermetrics/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT sagemakermetrics AWS Java SDK :: Services :: Sage Maker Metrics diff --git a/services/sagemakerruntime/pom.xml b/services/sagemakerruntime/pom.xml index cbdaa804f12f..3ef6a6d05b6c 100644 --- a/services/sagemakerruntime/pom.xml +++ b/services/sagemakerruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT sagemakerruntime AWS Java SDK :: Services :: SageMaker Runtime diff --git a/services/savingsplans/pom.xml b/services/savingsplans/pom.xml index dd4c7005900e..4f28183fca03 100644 --- a/services/savingsplans/pom.xml +++ b/services/savingsplans/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT savingsplans AWS Java SDK :: Services :: Savingsplans diff --git a/services/scheduler/pom.xml b/services/scheduler/pom.xml index c4fa0413d47f..9afb59276c5a 100644 --- a/services/scheduler/pom.xml +++ b/services/scheduler/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT scheduler AWS Java SDK :: Services :: Scheduler diff --git a/services/schemas/pom.xml b/services/schemas/pom.xml index 09da89a27596..43485615530a 100644 --- a/services/schemas/pom.xml +++ b/services/schemas/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT schemas AWS Java SDK :: Services :: Schemas diff --git a/services/secretsmanager/pom.xml b/services/secretsmanager/pom.xml index 858b7ce56636..9116e180e296 100644 --- a/services/secretsmanager/pom.xml +++ b/services/secretsmanager/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT secretsmanager AWS Java SDK :: Services :: AWS Secrets Manager diff --git a/services/securityhub/pom.xml b/services/securityhub/pom.xml index dc64da6013ae..c2e7a46d71d6 100644 --- a/services/securityhub/pom.xml +++ b/services/securityhub/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT securityhub AWS Java SDK :: Services :: SecurityHub diff --git a/services/securitylake/pom.xml b/services/securitylake/pom.xml index 2908ed0ce60a..3b35857b15cd 100644 --- a/services/securitylake/pom.xml +++ b/services/securitylake/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT securitylake AWS Java SDK :: Services :: Security Lake diff --git a/services/serverlessapplicationrepository/pom.xml b/services/serverlessapplicationrepository/pom.xml index ac3433ef769c..e1b28a17df94 100644 --- a/services/serverlessapplicationrepository/pom.xml +++ b/services/serverlessapplicationrepository/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 serverlessapplicationrepository diff --git a/services/servicecatalog/pom.xml b/services/servicecatalog/pom.xml index 0775d4d37f18..21fb69d8136a 100644 --- a/services/servicecatalog/pom.xml +++ b/services/servicecatalog/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT servicecatalog AWS Java SDK :: Services :: AWS Service Catalog diff --git a/services/servicecatalogappregistry/pom.xml b/services/servicecatalogappregistry/pom.xml index ea0509149a94..ff09c5e8d391 100644 --- a/services/servicecatalogappregistry/pom.xml +++ b/services/servicecatalogappregistry/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT servicecatalogappregistry AWS Java SDK :: Services :: Service Catalog App Registry diff --git a/services/servicediscovery/pom.xml b/services/servicediscovery/pom.xml index 167e32c8e44b..6e132c954f21 100644 --- a/services/servicediscovery/pom.xml +++ b/services/servicediscovery/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 servicediscovery diff --git a/services/servicequotas/pom.xml b/services/servicequotas/pom.xml index c8ab915bb07e..e076dc86162f 100644 --- a/services/servicequotas/pom.xml +++ b/services/servicequotas/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT servicequotas AWS Java SDK :: Services :: Service Quotas diff --git a/services/ses/pom.xml b/services/ses/pom.xml index 25da5abe1f89..c61e263b2499 100644 --- a/services/ses/pom.xml +++ b/services/ses/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ses AWS Java SDK :: Services :: Amazon SES diff --git a/services/sesv2/pom.xml b/services/sesv2/pom.xml index 62a7377b7115..e4841dea4750 100644 --- a/services/sesv2/pom.xml +++ b/services/sesv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT sesv2 AWS Java SDK :: Services :: SESv2 diff --git a/services/sfn/pom.xml b/services/sfn/pom.xml index 2accf09330fc..c22fc32164f7 100644 --- a/services/sfn/pom.xml +++ b/services/sfn/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT sfn AWS Java SDK :: Services :: AWS Step Functions diff --git a/services/shield/pom.xml b/services/shield/pom.xml index 0c3f8c9cc9a8..b9d28fd6d5f7 100644 --- a/services/shield/pom.xml +++ b/services/shield/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT shield AWS Java SDK :: Services :: AWS Shield diff --git a/services/signer/pom.xml b/services/signer/pom.xml index 4fe4397f3864..76712816773b 100644 --- a/services/signer/pom.xml +++ b/services/signer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT signer AWS Java SDK :: Services :: Signer diff --git a/services/simspaceweaver/pom.xml b/services/simspaceweaver/pom.xml index 52920728aa2e..3052428dd6f2 100644 --- a/services/simspaceweaver/pom.xml +++ b/services/simspaceweaver/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT simspaceweaver AWS Java SDK :: Services :: Sim Space Weaver diff --git a/services/sms/pom.xml b/services/sms/pom.xml index 394ad4b98b26..c138df780409 100644 --- a/services/sms/pom.xml +++ b/services/sms/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT sms AWS Java SDK :: Services :: AWS Server Migration diff --git a/services/snowball/pom.xml b/services/snowball/pom.xml index 1ba26438d928..b7946ed59ad9 100644 --- a/services/snowball/pom.xml +++ b/services/snowball/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT snowball AWS Java SDK :: Services :: Amazon Snowball diff --git a/services/snowdevicemanagement/pom.xml b/services/snowdevicemanagement/pom.xml index 6f18c7e3774e..af9036cf9f64 100644 --- a/services/snowdevicemanagement/pom.xml +++ b/services/snowdevicemanagement/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT snowdevicemanagement AWS Java SDK :: Services :: Snow Device Management diff --git a/services/sns/pom.xml b/services/sns/pom.xml index 0dc2732065ee..e3f098347249 100644 --- a/services/sns/pom.xml +++ b/services/sns/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT sns AWS Java SDK :: Services :: Amazon SNS diff --git a/services/sqs/pom.xml b/services/sqs/pom.xml index 445d38fcc3fb..9e3eb694ca30 100644 --- a/services/sqs/pom.xml +++ b/services/sqs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT sqs AWS Java SDK :: Services :: Amazon SQS diff --git a/services/ssm/pom.xml b/services/ssm/pom.xml index 2ceb90c4bef3..9139761c11db 100644 --- a/services/ssm/pom.xml +++ b/services/ssm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.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 cc8e8d1b555d..fba2b9b364ff 100644 --- a/services/ssmcontacts/pom.xml +++ b/services/ssmcontacts/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ssmcontacts AWS Java SDK :: Services :: SSM Contacts diff --git a/services/ssmincidents/pom.xml b/services/ssmincidents/pom.xml index 02965d575238..214f01e0cbf5 100644 --- a/services/ssmincidents/pom.xml +++ b/services/ssmincidents/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ssmincidents AWS Java SDK :: Services :: SSM Incidents diff --git a/services/ssmsap/pom.xml b/services/ssmsap/pom.xml index 50fd932decef..9e77ae7d227e 100644 --- a/services/ssmsap/pom.xml +++ b/services/ssmsap/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ssmsap AWS Java SDK :: Services :: Ssm Sap diff --git a/services/sso/pom.xml b/services/sso/pom.xml index bd047e850a68..344a302fe7af 100644 --- a/services/sso/pom.xml +++ b/services/sso/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT sso AWS Java SDK :: Services :: SSO diff --git a/services/ssoadmin/pom.xml b/services/ssoadmin/pom.xml index f3f591e40fc3..9dd7a2a2846d 100644 --- a/services/ssoadmin/pom.xml +++ b/services/ssoadmin/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ssoadmin AWS Java SDK :: Services :: SSO Admin diff --git a/services/ssooidc/pom.xml b/services/ssooidc/pom.xml index c467a97f3eca..39aea90746fe 100644 --- a/services/ssooidc/pom.xml +++ b/services/ssooidc/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ssooidc AWS Java SDK :: Services :: SSO OIDC diff --git a/services/storagegateway/pom.xml b/services/storagegateway/pom.xml index 1d7fef8c520d..573d8401d831 100644 --- a/services/storagegateway/pom.xml +++ b/services/storagegateway/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT storagegateway AWS Java SDK :: Services :: AWS Storage Gateway diff --git a/services/sts/pom.xml b/services/sts/pom.xml index 8db1b5648f02..7e7c3ede1326 100644 --- a/services/sts/pom.xml +++ b/services/sts/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT sts AWS Java SDK :: Services :: AWS STS diff --git a/services/support/pom.xml b/services/support/pom.xml index e0e5bf5cf4f1..d18212aafcd1 100644 --- a/services/support/pom.xml +++ b/services/support/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT support AWS Java SDK :: Services :: AWS Support diff --git a/services/supportapp/pom.xml b/services/supportapp/pom.xml index f98f0fde32cc..d0cec7c8d95f 100644 --- a/services/supportapp/pom.xml +++ b/services/supportapp/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT supportapp AWS Java SDK :: Services :: Support App diff --git a/services/swf/pom.xml b/services/swf/pom.xml index fab7b85b871b..e4fef691e377 100644 --- a/services/swf/pom.xml +++ b/services/swf/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT swf AWS Java SDK :: Services :: Amazon SWF diff --git a/services/synthetics/pom.xml b/services/synthetics/pom.xml index fb16aabd382d..25a0494e8b95 100644 --- a/services/synthetics/pom.xml +++ b/services/synthetics/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT synthetics AWS Java SDK :: Services :: Synthetics diff --git a/services/textract/pom.xml b/services/textract/pom.xml index 6ab93963f5b0..d1636d87db09 100644 --- a/services/textract/pom.xml +++ b/services/textract/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT textract AWS Java SDK :: Services :: Textract diff --git a/services/timestreamquery/pom.xml b/services/timestreamquery/pom.xml index e539eba43ad1..a9e42ad93add 100644 --- a/services/timestreamquery/pom.xml +++ b/services/timestreamquery/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT timestreamquery AWS Java SDK :: Services :: Timestream Query diff --git a/services/timestreamwrite/pom.xml b/services/timestreamwrite/pom.xml index 751a49e11fd4..124e8b969cb3 100644 --- a/services/timestreamwrite/pom.xml +++ b/services/timestreamwrite/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT timestreamwrite AWS Java SDK :: Services :: Timestream Write diff --git a/services/tnb/pom.xml b/services/tnb/pom.xml index 129906774143..d5f112f6eec4 100644 --- a/services/tnb/pom.xml +++ b/services/tnb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT tnb AWS Java SDK :: Services :: Tnb diff --git a/services/transcribe/pom.xml b/services/transcribe/pom.xml index c27b357bf591..b747f81b6a20 100644 --- a/services/transcribe/pom.xml +++ b/services/transcribe/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT transcribe AWS Java SDK :: Services :: Transcribe diff --git a/services/transcribestreaming/pom.xml b/services/transcribestreaming/pom.xml index 1ed7104cf09f..fb964dee6371 100644 --- a/services/transcribestreaming/pom.xml +++ b/services/transcribestreaming/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT transcribestreaming AWS Java SDK :: Services :: AWS Transcribe Streaming diff --git a/services/transfer/pom.xml b/services/transfer/pom.xml index 4622188d96c0..36f96d9af1f5 100644 --- a/services/transfer/pom.xml +++ b/services/transfer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT transfer AWS Java SDK :: Services :: Transfer diff --git a/services/translate/pom.xml b/services/translate/pom.xml index 7c912ce808c4..ef6af2315bc3 100644 --- a/services/translate/pom.xml +++ b/services/translate/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 translate diff --git a/services/trustedadvisor/pom.xml b/services/trustedadvisor/pom.xml index 9e9647de481b..08b717cfec95 100644 --- a/services/trustedadvisor/pom.xml +++ b/services/trustedadvisor/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT trustedadvisor AWS Java SDK :: Services :: Trusted Advisor diff --git a/services/verifiedpermissions/pom.xml b/services/verifiedpermissions/pom.xml index b1fd7ea7cb1b..5718200e9358 100644 --- a/services/verifiedpermissions/pom.xml +++ b/services/verifiedpermissions/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT verifiedpermissions AWS Java SDK :: Services :: Verified Permissions diff --git a/services/voiceid/pom.xml b/services/voiceid/pom.xml index e510f60377b8..3bca18e7505e 100644 --- a/services/voiceid/pom.xml +++ b/services/voiceid/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT voiceid AWS Java SDK :: Services :: Voice ID diff --git a/services/vpclattice/pom.xml b/services/vpclattice/pom.xml index f1a832ad91ab..66e294a5f1b4 100644 --- a/services/vpclattice/pom.xml +++ b/services/vpclattice/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT vpclattice AWS Java SDK :: Services :: VPC Lattice diff --git a/services/waf/pom.xml b/services/waf/pom.xml index f54736c45788..c0bff7b52fd5 100644 --- a/services/waf/pom.xml +++ b/services/waf/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT waf AWS Java SDK :: Services :: AWS WAF diff --git a/services/wafv2/pom.xml b/services/wafv2/pom.xml index 45c7983341a5..2889b8fabc98 100644 --- a/services/wafv2/pom.xml +++ b/services/wafv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT wafv2 AWS Java SDK :: Services :: WAFV2 diff --git a/services/wellarchitected/pom.xml b/services/wellarchitected/pom.xml index 3ef7669a197f..d56c3ee37974 100644 --- a/services/wellarchitected/pom.xml +++ b/services/wellarchitected/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT wellarchitected AWS Java SDK :: Services :: Well Architected diff --git a/services/wisdom/pom.xml b/services/wisdom/pom.xml index 944d3c93d758..b6a9c074a7ac 100644 --- a/services/wisdom/pom.xml +++ b/services/wisdom/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT wisdom AWS Java SDK :: Services :: Wisdom diff --git a/services/workdocs/pom.xml b/services/workdocs/pom.xml index 0991314911bc..7e4e2c5e9827 100644 --- a/services/workdocs/pom.xml +++ b/services/workdocs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT workdocs AWS Java SDK :: Services :: Amazon WorkDocs diff --git a/services/worklink/pom.xml b/services/worklink/pom.xml index 4f5ca5231833..fa0173249604 100644 --- a/services/worklink/pom.xml +++ b/services/worklink/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT worklink AWS Java SDK :: Services :: WorkLink diff --git a/services/workmail/pom.xml b/services/workmail/pom.xml index 7f65917b2d18..c36e957dcbb5 100644 --- a/services/workmail/pom.xml +++ b/services/workmail/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 workmail diff --git a/services/workmailmessageflow/pom.xml b/services/workmailmessageflow/pom.xml index c47ee912f916..8eed5ee48e96 100644 --- a/services/workmailmessageflow/pom.xml +++ b/services/workmailmessageflow/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT workmailmessageflow AWS Java SDK :: Services :: WorkMailMessageFlow diff --git a/services/workspaces/pom.xml b/services/workspaces/pom.xml index 6a8c55444774..3a24ee0d3864 100644 --- a/services/workspaces/pom.xml +++ b/services/workspaces/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT workspaces AWS Java SDK :: Services :: Amazon WorkSpaces diff --git a/services/workspacesthinclient/pom.xml b/services/workspacesthinclient/pom.xml index e159e58b7d2b..7b4bcafc99f2 100644 --- a/services/workspacesthinclient/pom.xml +++ b/services/workspacesthinclient/pom.xml @@ -17,7 +17,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT workspacesthinclient AWS Java SDK :: Services :: Work Spaces Thin Client diff --git a/services/workspacesweb/pom.xml b/services/workspacesweb/pom.xml index b5615e4ffa6c..15f27a98a566 100644 --- a/services/workspacesweb/pom.xml +++ b/services/workspacesweb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT workspacesweb AWS Java SDK :: Services :: Work Spaces Web diff --git a/services/xray/pom.xml b/services/xray/pom.xml index 5a964cde2ec9..14f874037381 100644 --- a/services/xray/pom.xml +++ b/services/xray/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT xray AWS Java SDK :: Services :: AWS X-Ray diff --git a/test/auth-tests/pom.xml b/test/auth-tests/pom.xml index 0d6ce75d3c2d..dae93a745cab 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.21.47-SNAPSHOT + 2.22.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 839d7d00e317..87ef9f3a39db 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.21.47-SNAPSHOT + 2.22.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 6ef6265cac67..9a3153352cb1 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml diff --git a/test/http-client-tests/pom.xml b/test/http-client-tests/pom.xml index f10f620574f0..8d13e34a3b46 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml http-client-tests diff --git a/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientDefaultTestSuite.java b/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientDefaultTestSuite.java index a2fb20bf50c4..e0e300b848d4 100644 --- a/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientDefaultTestSuite.java +++ b/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientDefaultTestSuite.java @@ -44,7 +44,7 @@ /** * A set of tests validating that the functionality implemented by a {@link SdkHttpClient}. - * + *

* This is used by an HTTP plugin implementation by extending this class and implementing the abstract methods to provide this * suite with a testable HTTP client implementation. */ @@ -95,7 +95,7 @@ public void supportsResponseCode500() throws Exception { } @Test - public void validatesHttpsCertificateIssuer() throws Exception { + public void validatesHttpsCertificateIssuer() { SdkHttpClient client = createSdkHttpClient(); SdkHttpFullRequest request = mockSdkRequest("https://localhost:" + mockServer.httpsPort(), SdkHttpMethod.POST); @@ -185,7 +185,9 @@ private SdkHttpFullRequest mockSdkRequest(String uriString, SdkHttpMethod method .putHeader("Host", uri.getHost()) .putHeader("User-Agent", "hello-world!"); if (method != SdkHttpMethod.HEAD) { - requestBuilder.contentStreamProvider(() -> new ByteArrayInputStream("Body".getBytes(StandardCharsets.UTF_8))); + byte[] content = "Body".getBytes(StandardCharsets.UTF_8); + requestBuilder.putHeader("Content-Length", Integer.toString(content.length)); + requestBuilder.contentStreamProvider(() -> new ByteArrayInputStream(content)); } return requestBuilder.build(); diff --git a/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientTestSuite.java b/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientTestSuite.java index 941fefa10d69..540c38129d36 100644 --- a/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientTestSuite.java +++ b/test/http-client-tests/src/main/java/software/amazon/awssdk/http/SdkHttpClientTestSuite.java @@ -50,7 +50,7 @@ /** * A set of tests validating that the functionality implemented by a {@link SdkHttpClient}. - * + *

* This is used by an HTTP plugin implementation by extending this class and implementing the abstract methods to provide this * suite with a testable HTTP client implementation. */ @@ -108,13 +108,13 @@ public void supportsResponseCode500() throws Exception { } @Test - public void validatesHttpsCertificateIssuer() throws Exception { - SdkHttpClient client = createSdkHttpClient(); - - SdkHttpFullRequest request = mockSdkRequest("https://localhost:" + mockServer.httpsPort(), SdkHttpMethod.POST); + public void validatesHttpsCertificateIssuer() { + try (SdkHttpClient client = createSdkHttpClient()) { + SdkHttpFullRequest request = mockSdkRequest("https://localhost:" + mockServer.httpsPort(), SdkHttpMethod.POST); - assertThatThrownBy(client.prepareRequest(HttpExecuteRequest.builder().request(request).build())::call) + assertThatThrownBy(client.prepareRequest(HttpExecuteRequest.builder().request(request).build())::call) .isInstanceOf(SSLHandshakeException.class); + } } @Test @@ -123,22 +123,26 @@ public void connectionPoolingWorks() throws Exception { SdkHttpClientOptions httpClientOptions = new SdkHttpClientOptions(); httpClientOptions.trustAll(true); - SdkHttpClient client = createSdkHttpClient(httpClientOptions); - - stubForMockRequest(200); - - for (int i = 0; i < 5; i++) { - SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), SdkHttpMethod.POST); - HttpExecuteResponse response = - client.prepareRequest(HttpExecuteRequest.builder() - .request(req) - .contentStreamProvider(req.contentStreamProvider().orElse(null)) - .build()) - .call(); - response.responseBody().ifPresent(IoUtils::drainInputStream); - } + try (SdkHttpClient client = createSdkHttpClient(httpClientOptions)) { + stubForMockRequest(200); + + for (int i = 0; i < 5; i++) { + SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), SdkHttpMethod.POST); + HttpExecuteResponse response = + client.prepareRequest(HttpExecuteRequest.builder() + .request(req) + .contentStreamProvider(req.contentStreamProvider().orElse(null)) + .build()) + .call(); + response.responseBody().ifPresent(IoUtils::drainInputStream); + } - assertThat(CONNECTION_COUNTER.openedConnections()).isEqualTo(initialOpenedConnections + 1); + // connection pool growth strategies vary across client implementations. Some, such as the CRT grow connection counts + // by a factor of 2, while some grow strictly as requested. Mainly we want to test that it kicks in at some point and + // doesn't create a new connection for all 5 requests. This proves that while allowing variance in this behavior. + assertThat(CONNECTION_COUNTER.openedConnections()).isGreaterThanOrEqualTo(initialOpenedConnections + 1); + assertThat(CONNECTION_COUNTER.openedConnections()).isLessThanOrEqualTo(initialOpenedConnections + 2); + } } @Test @@ -147,22 +151,26 @@ public void connectionsAreNotReusedOn5xxErrors() throws Exception { SdkHttpClientOptions httpClientOptions = new SdkHttpClientOptions(); httpClientOptions.trustAll(true); - SdkHttpClient client = createSdkHttpClient(httpClientOptions); - - stubForMockRequest(503); - - for (int i = 0; i < 5; i++) { - SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), SdkHttpMethod.POST); - HttpExecuteResponse response = - client.prepareRequest(HttpExecuteRequest.builder() - .request(req) - .contentStreamProvider(req.contentStreamProvider().orElse(null)) - .build()) - .call(); - response.responseBody().ifPresent(IoUtils::drainInputStream); - } + try (SdkHttpClient client = createSdkHttpClient(httpClientOptions)) { + stubForMockRequest(503); + + for (int i = 0; i < 5; i++) { + SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), SdkHttpMethod.POST); + HttpExecuteResponse response = + client.prepareRequest(HttpExecuteRequest.builder() + .request(req) + .contentStreamProvider(req.contentStreamProvider().orElse(null)) + .build()) + .call(); + response.responseBody().ifPresent(IoUtils::drainInputStream); + } - assertThat(CONNECTION_COUNTER.openedConnections()).isEqualTo(initialOpenedConnections + 5); + // don't couple this test to connection manager behaviors we don't have to. We want to make sure that the + // connection count increased by at least as many connections as we got 5xx errors back on. But the connection + // manager also predictively creates connections and we need to take those into account in a way that lets it + // remain a dynamic behavior. + assertThat(CONNECTION_COUNTER.openedConnections()).isGreaterThanOrEqualTo(initialOpenedConnections + 5); + } } @Test @@ -177,11 +185,14 @@ public void testCustomTlsTrustManager() throws Exception { selfSignedServer.start(); - try { - SdkHttpClient client = createSdkHttpClient(httpClientOptions); + try (SdkHttpClient client = createSdkHttpClient(httpClientOptions)) { SdkHttpFullRequest request = mockSdkRequest("https://localhost:" + selfSignedServer.httpsPort(), SdkHttpMethod.POST); - client.prepareRequest(HttpExecuteRequest.builder().request(request).build()).call(); + client.prepareRequest(HttpExecuteRequest.builder() + .request(request) + .contentStreamProvider(request.contentStreamProvider().orElse(null)) + .build()) + .call(); } finally { selfSignedServer.stop(); } @@ -192,7 +203,10 @@ public void testTrustAllWorks() throws Exception { SdkHttpClientOptions httpClientOptions = new SdkHttpClientOptions(); httpClientOptions.trustAll(true); - testForResponseCodeUsingHttps(createSdkHttpClient(httpClientOptions), HttpURLConnection.HTTP_OK); + try (SdkHttpClient client = createSdkHttpClient(httpClientOptions)) { + testForResponseCodeUsingHttps(client, HttpURLConnection.HTTP_OK); + } + } @Test @@ -209,19 +223,19 @@ protected void testForResponseCode(int returnCode) throws Exception { } private void testForResponseCode(int returnCode, SdkHttpMethod method) throws Exception { - SdkHttpClient client = createSdkHttpClient(); - - stubForMockRequest(returnCode); - - SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), method); - HttpExecuteResponse rsp = client.prepareRequest(HttpExecuteRequest.builder() - .request(req) - .contentStreamProvider(req.contentStreamProvider() - .orElse(null)) - .build()) - .call(); - - validateResponse(rsp, returnCode, method); + try (SdkHttpClient client = createSdkHttpClient()) { + stubForMockRequest(returnCode); + + SdkHttpFullRequest req = mockSdkRequest("http://localhost:" + mockServer.port(), method); + HttpExecuteResponse rsp = client.prepareRequest(HttpExecuteRequest.builder() + .request(req) + .contentStreamProvider(req.contentStreamProvider() + .orElse(null)) + .build()) + .call(); + + validateResponse(rsp, returnCode, method); + } } protected void testForResponseCodeUsingHttps(SdkHttpClient client, int returnCode) throws Exception { @@ -277,15 +291,36 @@ private void validateResponse(HttpExecuteResponse response, int returnCode, SdkH mockServer.resetMappings(); } - protected SdkHttpFullRequest mockSdkRequest(String uriString, SdkHttpMethod method) { + protected SdkHttpFullRequest mockSdkRequest(String uriString, SdkHttpMethod method, boolean chunkedEncoding) { + SdkHttpFullRequest.Builder requestBuilder = mockSdkRequestBuilder(uriString, method); + if (method != SdkHttpMethod.HEAD) { + byte[] content = "Body".getBytes(StandardCharsets.UTF_8); + if (!chunkedEncoding) { + requestBuilder.putHeader("Content-Length", Integer.toString(content.length)); + } + requestBuilder.contentStreamProvider(() -> new ByteArrayInputStream(content)); + } + + return requestBuilder.build(); + } + + private static SdkHttpFullRequest.Builder mockSdkRequestBuilder(String uriString, SdkHttpMethod method) { URI uri = URI.create(uriString); SdkHttpFullRequest.Builder requestBuilder = SdkHttpFullRequest.builder() - .uri(uri) - .method(method) - .putHeader("Host", uri.getHost()) - .putHeader("User-Agent", "hello-world!"); + .uri(uri) + .method(method) + .putHeader("Host", uri.getHost()) + .putHeader("User-Agent", "hello-world!"); + return requestBuilder; + } + + + protected SdkHttpFullRequest mockSdkRequest(String uriString, SdkHttpMethod method) { + SdkHttpFullRequest.Builder requestBuilder = mockSdkRequestBuilder(uriString, method); if (method != SdkHttpMethod.HEAD) { - requestBuilder.contentStreamProvider(() -> new ByteArrayInputStream("Body".getBytes(StandardCharsets.UTF_8))); + byte[] content = "Body".getBytes(StandardCharsets.UTF_8); + requestBuilder.putHeader("Content-Length", Integer.toString(content.length)); + requestBuilder.contentStreamProvider(() -> new ByteArrayInputStream(content)); } return requestBuilder.build(); diff --git a/test/module-path-tests/pom.xml b/test/module-path-tests/pom.xml index 9c3d0935501e..d13f18f547eb 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.21.47-SNAPSHOT + 2.22.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 a49826a97daf..98ac41dbc8f6 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml diff --git a/test/protocol-tests-core/pom.xml b/test/protocol-tests-core/pom.xml index 1b5e8407b83f..d83df4953dd9 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/protocol-tests/pom.xml b/test/protocol-tests/pom.xml index f63d67b9dbdb..ff99004d0317 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/region-testing/pom.xml b/test/region-testing/pom.xml index a18bc86a1226..42cb86d1a041 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/ruleset-testing-core/pom.xml b/test/ruleset-testing-core/pom.xml index 993011c3c55a..135887f36a33 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/s3-benchmarks/pom.xml b/test/s3-benchmarks/pom.xml index 9b646a6996ed..e10c4816c8c8 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/sdk-benchmarks/pom.xml b/test/sdk-benchmarks/pom.xml index 262bc362e515..8636525a3d61 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/BenchmarkRunner.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/BenchmarkRunner.java index 4c49f0270a87..d63c1e2391e5 100644 --- a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/BenchmarkRunner.java +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/BenchmarkRunner.java @@ -42,6 +42,7 @@ import software.amazon.awssdk.benchmark.apicall.httpclient.async.NettyHttpClientH1Benchmark; import software.amazon.awssdk.benchmark.apicall.httpclient.async.NettyHttpClientH2Benchmark; import software.amazon.awssdk.benchmark.apicall.httpclient.sync.ApacheHttpClientBenchmark; +import software.amazon.awssdk.benchmark.apicall.httpclient.sync.CrtHttpClientBenchmark; import software.amazon.awssdk.benchmark.apicall.httpclient.sync.UrlConnectionHttpClientBenchmark; import software.amazon.awssdk.benchmark.apicall.protocol.Ec2ProtocolBenchmark; import software.amazon.awssdk.benchmark.apicall.protocol.JsonProtocolBenchmark; @@ -75,7 +76,8 @@ public class BenchmarkRunner { private static final List SYNC_BENCHMARKS = Arrays.asList( ApacheHttpClientBenchmark.class.getSimpleName(), - UrlConnectionHttpClientBenchmark.class.getSimpleName()); + UrlConnectionHttpClientBenchmark.class.getSimpleName(), + CrtHttpClientBenchmark.class.getSimpleName()); private static final List COLD_START_BENCHMARKS = Arrays.asList( V2OptimizedClientCreationBenchmark.class.getSimpleName(), diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/ApacheHttpClientBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/ApacheHttpClientBenchmark.java index 9dc7319184a9..232a892c23d5 100644 --- a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/ApacheHttpClientBenchmark.java +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/ApacheHttpClientBenchmark.java @@ -48,6 +48,7 @@ import software.amazon.awssdk.benchmark.utils.MockServer; import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.apache.ApacheHttpClient; +import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.protocolrestjson.ProtocolRestJsonClient; /** @@ -74,6 +75,7 @@ public void setup() throws Exception { client = ProtocolRestJsonClient.builder() .endpointOverride(mockServer.getHttpsUri()) .httpClient(sdkHttpClient) + .region(Region.US_EAST_1) .build(); executorService = Executors.newFixedThreadPool(CONCURRENT_CALLS); diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/CrtHttpClientBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/CrtHttpClientBenchmark.java new file mode 100644 index 000000000000..3e59cdf09281 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/CrtHttpClientBenchmark.java @@ -0,0 +1,118 @@ +/* + * 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.benchmark.apicall.httpclient.sync; + +import static software.amazon.awssdk.benchmark.utils.BenchmarkConstant.CONCURRENT_CALLS; +import static software.amazon.awssdk.benchmark.utils.BenchmarkUtils.awaitCountdownLatchUninterruptibly; +import static software.amazon.awssdk.benchmark.utils.BenchmarkUtils.countDownUponCompletion; +import static software.amazon.awssdk.benchmark.utils.BenchmarkUtils.trustAllTlsAttributeMapBuilder; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OperationsPerInvocation; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.profile.StackProfiler; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; +import software.amazon.awssdk.benchmark.apicall.httpclient.SdkHttpClientBenchmark; +import software.amazon.awssdk.benchmark.utils.MockServer; +import software.amazon.awssdk.http.SdkHttpClient; +import software.amazon.awssdk.http.crt.AwsCrtHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.protocolrestjson.ProtocolRestJsonClient; + +/** + * Benchmarking for running with different http clients. + */ +@State(Scope.Benchmark) +@Warmup(iterations = 3, time = 15, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 10, timeUnit = TimeUnit.SECONDS) +@Fork(2) // To reduce difference between each run +@BenchmarkMode(Mode.Throughput) +public class CrtHttpClientBenchmark implements SdkHttpClientBenchmark { + + private MockServer mockServer; + private SdkHttpClient sdkHttpClient; + private ProtocolRestJsonClient client; + private ExecutorService executorService; + + @Setup(Level.Trial) + public void setup() throws Exception { + mockServer = new MockServer(); + mockServer.start(); + sdkHttpClient = AwsCrtHttpClient.builder() + .buildWithDefaults(trustAllTlsAttributeMapBuilder().build()); + client = ProtocolRestJsonClient.builder() + .endpointOverride(mockServer.getHttpsUri()) + .region(Region.US_EAST_1) + .httpClient(sdkHttpClient) + .build(); + executorService = Executors.newFixedThreadPool(CONCURRENT_CALLS); + + client.allTypes(); + } + + @TearDown(Level.Trial) + public void tearDown() throws Exception { + executorService.shutdown(); + mockServer.stop(); + sdkHttpClient.close(); + client.close(); + } + + @Benchmark + @Override + public void sequentialApiCall(Blackhole blackhole) { + blackhole.consume(client.allTypes()); + } + + @Benchmark + @Override + @OperationsPerInvocation(CONCURRENT_CALLS) + public void concurrentApiCall(Blackhole blackhole) { + CountDownLatch countDownLatch = new CountDownLatch(CONCURRENT_CALLS); + for (int i = 0; i < CONCURRENT_CALLS; i++) { + countDownUponCompletion(blackhole, + CompletableFuture.runAsync(() -> client.allTypes(), executorService), countDownLatch); + } + + awaitCountdownLatchUninterruptibly(countDownLatch, 10, TimeUnit.SECONDS); + } + + public static void main(String... args) throws Exception { + + Options opt = new OptionsBuilder() + .include(CrtHttpClientBenchmark.class.getSimpleName() + ".concurrentApiCall") + .addProfiler(StackProfiler.class) + .build(); + new Runner(opt).run(); + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/UrlConnectionHttpClientBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/UrlConnectionHttpClientBenchmark.java index 3ff99b5dcd0b..9a7abfc20eea 100644 --- a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/UrlConnectionHttpClientBenchmark.java +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/sync/UrlConnectionHttpClientBenchmark.java @@ -43,6 +43,7 @@ import software.amazon.awssdk.benchmark.utils.MockServer; import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient; +import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.protocolrestjson.ProtocolRestJsonClient; /** @@ -68,6 +69,7 @@ public void setup() throws Exception { .buildWithDefaults(trustAllTlsAttributeMapBuilder().build()); client = ProtocolRestJsonClient.builder() .endpointOverride(mockServer.getHttpsUri()) + .region(Region.US_EAST_1) .httpClient(sdkHttpClient) .build(); client.allTypes(); diff --git a/test/sdk-native-image-test/pom.xml b/test/sdk-native-image-test/pom.xml index 4568d6fd479c..a243541f36c6 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/service-test-utils/pom.xml b/test/service-test-utils/pom.xml index 6b37c59a5589..2be334a53890 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml service-test-utils diff --git a/test/stability-tests/pom.xml b/test/stability-tests/pom.xml index 6b585a47da5b..963364e1ca86 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3AsyncBaseStabilityTest.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3AsyncBaseStabilityTest.java new file mode 100644 index 000000000000..20f27963bdad --- /dev/null +++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3AsyncBaseStabilityTest.java @@ -0,0 +1,208 @@ +/* + * 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.stability.tests.s3; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.IntFunction; +import org.apache.commons.lang3.RandomStringUtils; +import software.amazon.awssdk.core.async.AsyncRequestBody; +import software.amazon.awssdk.core.async.AsyncResponseTransformer; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.http.apache.ApacheHttpClient; +import software.amazon.awssdk.services.s3.S3AsyncClient; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.DeleteBucketRequest; +import software.amazon.awssdk.services.s3.model.NoSuchBucketException; +import software.amazon.awssdk.services.s3.model.NoSuchKeyException; +import software.amazon.awssdk.stability.tests.exceptions.StabilityTestsRetryableException; +import software.amazon.awssdk.stability.tests.utils.RetryableTest; +import software.amazon.awssdk.stability.tests.utils.StabilityTestRunner; +import software.amazon.awssdk.testutils.RandomTempFile; +import software.amazon.awssdk.testutils.service.AwsTestBase; +import software.amazon.awssdk.utils.Logger; +import software.amazon.awssdk.utils.Md5Utils; + +public abstract class S3AsyncBaseStabilityTest extends AwsTestBase { + private static final Logger log = Logger.loggerFor(S3AsyncBaseStabilityTest.class); + protected static final int CONCURRENCY = 100; + protected static final int TOTAL_RUNS = 50; + protected static final String LARGE_KEY_NAME = "2GB"; + + protected static S3Client s3ApacheClient; + private final S3AsyncClient testClient; + + static { + s3ApacheClient = S3Client.builder() + .httpClientBuilder(ApacheHttpClient.builder() + .maxConnections(CONCURRENCY)) + .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN) + .overrideConfiguration(b -> b.apiCallTimeout(Duration.ofMinutes(10))) + .build(); + } + + public S3AsyncBaseStabilityTest(S3AsyncClient testClient) { + this.testClient = testClient; + } + + @RetryableTest(maxRetries = 3, retryableException = StabilityTestsRetryableException.class) + public void largeObject_put_get_usingFile() { + String md5Upload = uploadLargeObjectFromFile(); + String md5Download = downloadLargeObjectToFile(); + assertThat(md5Upload).isEqualTo(md5Download); + } + + @RetryableTest(maxRetries = 3, retryableException = StabilityTestsRetryableException.class) + public void putObject_getObject_highConcurrency() { + putObject(); + getObject(); + } + + protected String computeKeyName(int i) { + return "key_" + i; + } + + protected abstract String getTestBucketName(); + + protected void doGetBucketAcl_lowTpsLongInterval() { + IntFunction> future = i -> testClient.getBucketAcl(b -> b.bucket(getTestBucketName())); + String className = this.getClass().getSimpleName(); + StabilityTestRunner.newRunner() + .testName(className + ".getBucketAcl_lowTpsLongInterval") + .futureFactory(future) + .requestCountPerRun(10) + .totalRuns(3) + .delaysBetweenEachRun(Duration.ofSeconds(6)) + .run(); + } + + + protected String downloadLargeObjectToFile() { + File randomTempFile = RandomTempFile.randomUncreatedFile(); + StabilityTestRunner.newRunner() + .testName("S3AsyncStabilityTest.downloadLargeObjectToFile") + .futures(testClient.getObject(b -> b.bucket(getTestBucketName()).key(LARGE_KEY_NAME), + AsyncResponseTransformer.toFile(randomTempFile))) + .run(); + + + try { + return Md5Utils.md5AsBase64(randomTempFile); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + randomTempFile.delete(); + } + } + + protected String uploadLargeObjectFromFile() { + RandomTempFile file = null; + try { + file = new RandomTempFile((long) 2e+9); + String md5 = Md5Utils.md5AsBase64(file); + StabilityTestRunner.newRunner() + .testName("S3AsyncStabilityTest.uploadLargeObjectFromFile") + .futures(testClient.putObject(b -> b.bucket(getTestBucketName()).key(LARGE_KEY_NAME), + AsyncRequestBody.fromFile(file))) + .run(); + return md5; + } catch (IOException e) { + throw new RuntimeException("fail to create test file", e); + } finally { + if (file != null) { + file.delete(); + } + } + } + + protected void putObject() { + byte[] bytes = RandomStringUtils.randomAlphanumeric(10_000).getBytes(); + + IntFunction> future = i -> { + String keyName = computeKeyName(i); + return testClient.putObject(b -> b.bucket(getTestBucketName()).key(keyName), + AsyncRequestBody.fromBytes(bytes)); + }; + + StabilityTestRunner.newRunner() + .testName("S3AsyncStabilityTest.putObject") + .futureFactory(future) + .requestCountPerRun(CONCURRENCY) + .totalRuns(TOTAL_RUNS) + .delaysBetweenEachRun(Duration.ofMillis(100)) + .run(); + } + + protected void getObject() { + IntFunction> future = i -> { + String keyName = computeKeyName(i); + Path path = RandomTempFile.randomUncreatedFile().toPath(); + return testClient.getObject(b -> b.bucket(getTestBucketName()).key(keyName), AsyncResponseTransformer.toFile(path)); + }; + + StabilityTestRunner.newRunner() + .testName("S3AsyncStabilityTest.getObject") + .futureFactory(future) + .requestCountPerRun(CONCURRENCY) + .totalRuns(TOTAL_RUNS) + .delaysBetweenEachRun(Duration.ofMillis(100)) + .run(); + } + + protected static void deleteBucketAndAllContents(S3AsyncClient client, String bucketName) { + try { + List> futures = new ArrayList<>(); + + client.listObjectsV2Paginator(b -> b.bucket(bucketName)) + .subscribe(r -> r.contents().forEach(s -> futures.add(client.deleteObject(o -> o.bucket(bucketName).key(s.key()))))) + .join(); + + CompletableFuture[] futureArray = futures.toArray(new CompletableFuture[0]); + + CompletableFuture.allOf(futureArray).join(); + + client.deleteBucket(DeleteBucketRequest.builder().bucket(bucketName).build()).join(); + } catch (Exception e) { + log.error(() -> "Failed to delete bucket: " +bucketName); + } + } + + protected void verifyObjectExist(String bucketName, String keyName, long size) throws IOException { + try { + s3ApacheClient.headBucket(b -> b.bucket(bucketName)); + } catch (NoSuchBucketException e) { + log.info(() -> "NoSuchBucketException was thrown, staring to create the bucket"); + s3ApacheClient.createBucket(b -> b.bucket(bucketName)); + } + + try { + s3ApacheClient.headObject(b -> b.key(keyName).bucket(bucketName)); + } catch (NoSuchKeyException e) { + log.info(() -> "NoSuchKeyException was thrown, starting to upload the object"); + RandomTempFile file = new RandomTempFile(size); + s3ApacheClient.putObject(b -> b.bucket(bucketName).key(keyName), RequestBody.fromFile(file)); + file.delete(); + } + } + +} diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3WithCrtAsyncHttpClientStabilityTest.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3AsyncWithCrtAsyncHttpClientStabilityTest.java similarity index 93% rename from test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3WithCrtAsyncHttpClientStabilityTest.java rename to test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3AsyncWithCrtAsyncHttpClientStabilityTest.java index c92e5f691194..9573f12f54e7 100644 --- a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3WithCrtAsyncHttpClientStabilityTest.java +++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3AsyncWithCrtAsyncHttpClientStabilityTest.java @@ -13,7 +13,7 @@ /** * Stability tests for {@link S3AsyncClient} using {@link AwsCrtAsyncHttpClient} */ -public class S3WithCrtAsyncHttpClientStabilityTest extends S3BaseStabilityTest { +public class S3AsyncWithCrtAsyncHttpClientStabilityTest extends S3AsyncBaseStabilityTest { private static String bucketName = "s3withcrtasyncclientstabilitytests" + System.currentTimeMillis(); @@ -33,7 +33,7 @@ public class S3WithCrtAsyncHttpClientStabilityTest extends S3BaseStabilityTest { .build(); } - public S3WithCrtAsyncHttpClientStabilityTest() { + public S3AsyncWithCrtAsyncHttpClientStabilityTest() { super(s3CrtClient); } diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3BaseStabilityTest.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3BaseStabilityTest.java index df8c1871f56a..b6805a7c2d43 100644 --- a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3BaseStabilityTest.java +++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3BaseStabilityTest.java @@ -24,11 +24,12 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.function.IntFunction; import org.apache.commons.lang3.RandomStringUtils; -import software.amazon.awssdk.core.async.AsyncRequestBody; -import software.amazon.awssdk.core.async.AsyncResponseTransformer; import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.core.sync.ResponseTransformer; import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.services.s3.S3AsyncClient; import software.amazon.awssdk.services.s3.S3Client; @@ -47,10 +48,19 @@ public abstract class S3BaseStabilityTest extends AwsTestBase { private static final Logger log = Logger.loggerFor(S3BaseStabilityTest.class); protected static final int CONCURRENCY = 100; protected static final int TOTAL_RUNS = 50; - protected static final String LARGE_KEY_NAME = "2GB"; + + protected static final String LARGEST_KEY_NAME = "16MB"; protected static S3Client s3ApacheClient; - private final S3AsyncClient testClient; + protected static ExecutorService futureThreadPool; + + private final S3Client testClient; + + + // The JVM does a bunch under the hood, so leave some room for magic. + private static final int ALLOWED_THREAD_OVERHEAD = 50; + + protected int allowedPeakThreads; static { s3ApacheClient = S3Client.builder() @@ -61,7 +71,14 @@ public abstract class S3BaseStabilityTest extends AwsTestBase { .build(); } - public S3BaseStabilityTest(S3AsyncClient testClient) { + protected S3BaseStabilityTest() { + this(null, 0); + } + + protected S3BaseStabilityTest(S3Client testClient, int testClientThreadsUsed) { + // use the passed in known thread count for testClient, plus CONCURRENCY for the sync executor, + // and some room for the JVM to do weird things. + this.allowedPeakThreads = testClientThreadsUsed + CONCURRENCY + ALLOWED_THREAD_OVERHEAD; this.testClient = testClient; } @@ -85,9 +102,10 @@ protected String computeKeyName(int i) { protected abstract String getTestBucketName(); protected void doGetBucketAcl_lowTpsLongInterval() { - IntFunction> future = i -> testClient.getBucketAcl(b -> b.bucket(getTestBucketName())); + IntFunction> future = + i -> CompletableFuture.supplyAsync(() -> testClient.getBucketAcl(b -> b.bucket(getTestBucketName())), futureThreadPool); String className = this.getClass().getSimpleName(); - StabilityTestRunner.newRunner() + StabilityTestRunner.newRunner(allowedPeakThreads) .testName(className + ".getBucketAcl_lowTpsLongInterval") .futureFactory(future) .requestCountPerRun(10) @@ -99,10 +117,14 @@ protected void doGetBucketAcl_lowTpsLongInterval() { protected String downloadLargeObjectToFile() { File randomTempFile = RandomTempFile.randomUncreatedFile(); - StabilityTestRunner.newRunner() - .testName("S3AsyncStabilityTest.downloadLargeObjectToFile") - .futures(testClient.getObject(b -> b.bucket(getTestBucketName()).key(LARGE_KEY_NAME), - AsyncResponseTransformer.toFile(randomTempFile))) + + StabilityTestRunner.newRunner(allowedPeakThreads) + .testName("S3StabilityTest.downloadLargeObjectToFile") + .futures(CompletableFuture.supplyAsync(() -> { + testClient.getObject(b -> b.bucket(getTestBucketName()) + .key(LARGEST_KEY_NAME), ResponseTransformer.toFile(randomTempFile)); + return null; + }, futureThreadPool)) .run(); @@ -116,36 +138,40 @@ protected String downloadLargeObjectToFile() { } protected String uploadLargeObjectFromFile() { - RandomTempFile file = null; try { - file = new RandomTempFile((long) 2e+9); - String md5 = Md5Utils.md5AsBase64(file); - StabilityTestRunner.newRunner() - .testName("S3AsyncStabilityTest.uploadLargeObjectFromFile") - .futures(testClient.putObject(b -> b.bucket(getTestBucketName()).key(LARGE_KEY_NAME), - AsyncRequestBody.fromFile(file))) - .run(); - return md5; - } catch (IOException e) { - throw new RuntimeException("fail to create test file", e); - } finally { - if (file != null) { + RandomTempFile file = new RandomTempFile(16L * 1024 * 1024); + + try { + String md5 = Md5Utils.md5AsBase64(file); + StabilityTestRunner.newRunner(allowedPeakThreads) + .testName("S3StabilityTest.uploadLargeObjectFromFile") + .futures(CompletableFuture.supplyAsync(() -> { + testClient.putObject(b -> b.bucket(getTestBucketName()).key(LARGEST_KEY_NAME), file.toPath()); + + return null; + }, futureThreadPool)) + .run(); + return md5; + } finally { file.delete(); } + } catch (IOException e) { + throw new RuntimeException(e); } } protected void putObject() { byte[] bytes = RandomStringUtils.randomAlphanumeric(10_000).getBytes(); - IntFunction> future = i -> { + IntFunction> future = i -> CompletableFuture.supplyAsync(() -> { String keyName = computeKeyName(i); - return testClient.putObject(b -> b.bucket(getTestBucketName()).key(keyName), - AsyncRequestBody.fromBytes(bytes)); - }; + testClient.putObject(b -> b.bucket(getTestBucketName()).key(keyName), RequestBody.fromBytes(bytes)); - StabilityTestRunner.newRunner() - .testName("S3AsyncStabilityTest.putObject") + return null; + }, futureThreadPool); + + StabilityTestRunner.newRunner(allowedPeakThreads) + .testName("S3StabilityTest.putObject") .futureFactory(future) .requestCountPerRun(CONCURRENCY) .totalRuns(TOTAL_RUNS) @@ -154,14 +180,16 @@ protected void putObject() { } protected void getObject() { - IntFunction> future = i -> { + IntFunction> future = i -> CompletableFuture.supplyAsync(() -> { String keyName = computeKeyName(i); Path path = RandomTempFile.randomUncreatedFile().toPath(); - return testClient.getObject(b -> b.bucket(getTestBucketName()).key(keyName), AsyncResponseTransformer.toFile(path)); - }; + testClient.getObject(b -> b.bucket(getTestBucketName()).key(keyName), ResponseTransformer.toFile(path)); + + return null; + }, futureThreadPool); - StabilityTestRunner.newRunner() - .testName("S3AsyncStabilityTest.getObject") + StabilityTestRunner.newRunner(allowedPeakThreads) + .testName("S3StabilityTest.getObject") .futureFactory(future) .requestCountPerRun(CONCURRENCY) .totalRuns(TOTAL_RUNS) @@ -204,5 +232,4 @@ protected void verifyObjectExist(String bucketName, String keyName, long size) t file.delete(); } } - } diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtAsyncClientStabilityTest.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtAsyncClientStabilityTest.java index dc91d6328d0c..10c803700cb5 100644 --- a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtAsyncClientStabilityTest.java +++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtAsyncClientStabilityTest.java @@ -25,9 +25,9 @@ /** * Stability tests for {@link S3CrtAsyncClient} */ -public class S3CrtAsyncClientStabilityTest extends S3BaseStabilityTest { - private static final String BUCKET_NAME = "s3crtasyncclinetstabilitytests" + System.currentTimeMillis(); - private static S3AsyncClient s3CrtAsyncClient; +public class S3CrtAsyncClientStabilityTest extends S3AsyncBaseStabilityTest { + private static final String BUCKET_NAME = String.format("s3crtasyncclinetstabilitytests%d", System.currentTimeMillis()); + private static final S3AsyncClient s3CrtAsyncClient; static { s3CrtAsyncClient = S3CrtAsyncClient.builder() diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtClientStabilityTest.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtClientStabilityTest.java new file mode 100644 index 000000000000..dfbcbf26e6b3 --- /dev/null +++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3CrtClientStabilityTest.java @@ -0,0 +1,90 @@ +/* + * 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.stability.tests.s3; + +import java.time.Duration; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import software.amazon.awssdk.crt.CrtResource; +import software.amazon.awssdk.crt.SystemInfo; +import software.amazon.awssdk.http.crt.AwsCrtHttpClient; +import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; +import software.amazon.awssdk.services.s3.S3AsyncClient; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.internal.crt.S3CrtAsyncClient; + +/** + * Stability tests for S3 sync client using {@link AwsCrtHttpClient}. + */ +public class S3CrtClientStabilityTest extends S3BaseStabilityTest { + private static final String BUCKET_NAME = String.format("s3crthttpclientstabilitytests%d", System.currentTimeMillis()); + + private static final int CRT_CLIENT_THREAD_COUNT; + + private static final S3Client s3Client; + + + static { + s3Client = S3Client.builder() + .httpClientBuilder(AwsCrtHttpClient.builder() + .maxConcurrency(CONCURRENCY)) + .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN) + .overrideConfiguration(b -> b.apiCallTimeout(Duration.ofMinutes(10))) + .build(); + + // The underlying client has a thread per processor in its default configuration along with a DNS resolver thread. + CRT_CLIENT_THREAD_COUNT = SystemInfo.getProcessorCount() + 1; + + } + + public S3CrtClientStabilityTest() { + super(s3Client, CRT_CLIENT_THREAD_COUNT); + } + + @BeforeAll + public static void setup() { + System.setProperty("aws.crt.debugnative", "true"); + s3ApacheClient.createBucket(b -> b.bucket(BUCKET_NAME)); + futureThreadPool = Executors.newFixedThreadPool(CONCURRENCY); + } + + @AfterAll + public static void cleanup() { + try (S3AsyncClient s3NettyClient = S3AsyncClient.builder() + .httpClientBuilder(NettyNioAsyncHttpClient.builder() + .maxConcurrency(CONCURRENCY)) + .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN) + .build()) { + deleteBucketAndAllContents(s3NettyClient, BUCKET_NAME); + } + s3Client.close(); + s3ApacheClient.close(); + CrtResource.waitForNoResources(); + futureThreadPool.shutdown(); + try { + futureThreadPool.awaitTermination(5, TimeUnit.SECONDS); + } catch (InterruptedException e) { + + } + } + + @Override + protected String getTestBucketName() { + return BUCKET_NAME; + } +} diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3NettyAsyncStabilityTest.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3NettyAsyncStabilityTest.java index d7afa62bade0..e852004fec33 100644 --- a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3NettyAsyncStabilityTest.java +++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/s3/S3NettyAsyncStabilityTest.java @@ -10,7 +10,7 @@ import java.time.Duration; -public class S3NettyAsyncStabilityTest extends S3BaseStabilityTest { +public class S3NettyAsyncStabilityTest extends S3AsyncBaseStabilityTest { private static String bucketName = "s3nettyasyncstabilitytests" + System.currentTimeMillis(); diff --git a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/utils/StabilityTestRunner.java b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/utils/StabilityTestRunner.java index 5e47ea3d1e83..eceda3abc1a5 100644 --- a/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/utils/StabilityTestRunner.java +++ b/test/stability-tests/src/it/java/software/amazon/awssdk/stability/tests/utils/StabilityTestRunner.java @@ -74,7 +74,9 @@ public class StabilityTestRunner { private static final int TESTS_TIMEOUT_IN_MINUTES = 60; // The peak thread count might be different depending on the machine the tests are currently running on. // because of the internal thread pool used in AsynchronousFileChannel - private static final int ALLOWED_PEAK_THREAD_COUNT = 90; + // Also, synchronous clients have their own thread pools so this measurement needs to be mutable + // so that the async and synchronous paths can both use this runner. + private int allowedPeakThreadCount = 90; private ThreadMXBean threadMXBean; private IntFunction> futureFactory; @@ -91,6 +93,11 @@ private StabilityTestRunner() { threadMXBean.resetPeakThreadCount(); } + private StabilityTestRunner(int allowedPeakThreadCount) { + this(); + this.allowedPeakThreadCount = allowedPeakThreadCount; + } + /** * Create a new test runner * @@ -100,6 +107,10 @@ public static StabilityTestRunner newRunner() { return new StabilityTestRunner(); } + public static StabilityTestRunner newRunner(int allowedPeakThreadCount) { + return new StabilityTestRunner(allowedPeakThreadCount); + } + public StabilityTestRunner futureFactory(IntFunction> futureFactory) { this.futureFactory = futureFactory; return this; @@ -331,9 +342,9 @@ private void processResult(TestResult testResult) { throw new StabilityTestsRetryableException(errorMessage); } - if (testResult.peakThreadCount() > ALLOWED_PEAK_THREAD_COUNT) { + if (testResult.peakThreadCount() > allowedPeakThreadCount) { String errorMessage = String.format("The number of peak thread exceeds the allowed peakThread threshold %s", - ALLOWED_PEAK_THREAD_COUNT); + allowedPeakThreadCount); threadDump(testResult.testName()); diff --git a/test/test-utils/pom.xml b/test/test-utils/pom.xml index 61ccc245a3ad..5ab41c5dd076 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml test-utils diff --git a/test/tests-coverage-reporting/pom.xml b/test/tests-coverage-reporting/pom.xml index 4f11ec5221f7..2fed4bf7f10a 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/third-party/pom.xml b/third-party/pom.xml index e0344e4e33ee..35a6459a7beb 100644 --- a/third-party/pom.xml +++ b/third-party/pom.xml @@ -21,7 +21,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.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 2c67a2155b48..9710c0a7e679 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.21.47-SNAPSHOT + 2.22.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 14384e8f3223..9069a7f6551c 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.21.47-SNAPSHOT + 2.22.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 c766015b9756..c07ca14d29f8 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.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/utils/pom.xml b/utils/pom.xml index 4fc62886ba3b..9baa33a17e0a 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.21.47-SNAPSHOT + 2.22.0-SNAPSHOT 4.0.0 diff --git a/utils/src/main/java/software/amazon/awssdk/utils/async/InputStreamSubscriber.java b/utils/src/main/java/software/amazon/awssdk/utils/async/InputStreamSubscriber.java index a33cc9b0b994..95f697b6d689 100644 --- a/utils/src/main/java/software/amazon/awssdk/utils/async/InputStreamSubscriber.java +++ b/utils/src/main/java/software/amazon/awssdk/utils/async/InputStreamSubscriber.java @@ -82,7 +82,10 @@ public void onError(Throwable t) { @Override public void onComplete() { - callQueue.add(new QueueEntry(true, delegate::onComplete)); + callQueue.add(new QueueEntry(true, () -> { + delegate.onComplete(); + inputStreamState.set(State.STREAMING_DONE); + })); drainQueue(); } @@ -125,6 +128,11 @@ public int read(byte[] bytes, int off, int len) { @Override public void close() { synchronized (subscribeLock) { + // If it is done, no-op + if (inputStreamState.get().equals(State.STREAMING_DONE)) { + return; + } + if (inputStreamState.compareAndSet(State.UNINITIALIZED, State.CLOSED)) { delegate.onSubscribe(new NoOpSubscription()); delegate.onError(new CancellationException()); @@ -153,6 +161,9 @@ private void doDrainQueue() { while (true) { QueueEntry entry = callQueue.poll(); if (done || entry == null) { + if (done) { + inputStreamState.set(State.STREAMING_DONE); + } return; } done = entry.terminal; @@ -173,7 +184,8 @@ private QueueEntry(boolean terminal, Runnable call) { private enum State { UNINITIALIZED, READABLE, - CLOSED + CLOSED, + STREAMING_DONE } private final class CancelWatcher implements Subscription {