diff --git a/.changes/next-release/bugfix-AWSSDKforJavav2-9a322a2.json b/.changes/next-release/bugfix-AWSSDKforJavav2-9a322a2.json new file mode 100644 index 000000000000..ef986f986bfd --- /dev/null +++ b/.changes/next-release/bugfix-AWSSDKforJavav2-9a322a2.json @@ -0,0 +1,5 @@ +{ + "category": "AWS Common Runtime Client", + "type": "bugfix", + "description": "Upgrade to the latest version (0.3.35) of the AWS Common Runtime." +} diff --git a/.changes/next-release/feature-AWSCommonRuntimeClient-0306e36.json b/.changes/next-release/feature-AWSCommonRuntimeClient-0306e36.json new file mode 100644 index 000000000000..04504e318fd8 --- /dev/null +++ b/.changes/next-release/feature-AWSCommonRuntimeClient-0306e36.json @@ -0,0 +1,5 @@ +{ + "category": "AWS Common Runtime Http Client", + "type": "feature", + "description": "Add initial support for the AWS Common Runtime (CRT) Http Client." +} diff --git a/archetypes/archetype-lambda/pom.xml b/archetypes/archetype-lambda/pom.xml index 3778b23030e0..6b1fb03951bd 100644 --- a/archetypes/archetype-lambda/pom.xml +++ b/archetypes/archetype-lambda/pom.xml @@ -20,7 +20,7 @@ archetypes software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 archetype-lambda diff --git a/archetypes/pom.xml b/archetypes/pom.xml index 28e8bbe4cf74..bb5a932c6e97 100644 --- a/archetypes/pom.xml +++ b/archetypes/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 archetypes diff --git a/aws-sdk-java/pom.xml b/aws-sdk-java/pom.xml index baedc4c589e5..2faabe568331 100644 --- a/aws-sdk-java/pom.xml +++ b/aws-sdk-java/pom.xml @@ -19,7 +19,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.11.6 + 2.11.7-SNAPSHOT ../pom.xml aws-sdk-java diff --git a/bom-internal/pom.xml b/bom-internal/pom.xml index 1442ce601918..089a8fbfe20c 100644 --- a/bom-internal/pom.xml +++ b/bom-internal/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 diff --git a/bom/pom.xml b/bom/pom.xml index 8d5e881c6a02..3183f8c89b25 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -19,7 +19,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.11.6 + 2.11.7-SNAPSHOT ../pom.xml bom diff --git a/bundle/pom.xml b/bundle/pom.xml index 197302792851..cc31b485afb5 100644 --- a/bundle/pom.xml +++ b/bundle/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.11.6 + 2.11.7-SNAPSHOT bundle jar diff --git a/codegen-lite-maven-plugin/pom.xml b/codegen-lite-maven-plugin/pom.xml index fbdd93da04ab..aab7c9550a42 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.11.6 + 2.11.7-SNAPSHOT ../pom.xml codegen-lite-maven-plugin diff --git a/codegen-lite/pom.xml b/codegen-lite/pom.xml index 43bb9a1d4e16..239d34d5b48e 100644 --- a/codegen-lite/pom.xml +++ b/codegen-lite/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.11.6 + 2.11.7-SNAPSHOT codegen-lite AWS Java SDK :: Code Generator Lite diff --git a/codegen-maven-plugin/pom.xml b/codegen-maven-plugin/pom.xml index 6884dc0ee11b..7c14b40833f8 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.11.6 + 2.11.7-SNAPSHOT ../pom.xml codegen-maven-plugin diff --git a/codegen/pom.xml b/codegen/pom.xml index 309ace6f0b1a..428b50e628f1 100644 --- a/codegen/pom.xml +++ b/codegen/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.11.6 + 2.11.7-SNAPSHOT codegen AWS Java SDK :: Code Generator diff --git a/core/annotations/pom.xml b/core/annotations/pom.xml index 6f39ccb01a2f..32799355b7b0 100644 --- a/core/annotations/pom.xml +++ b/core/annotations/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 diff --git a/core/arns/pom.xml b/core/arns/pom.xml index 4040f3b0055d..58f4a302dc9a 100644 --- a/core/arns/pom.xml +++ b/core/arns/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 diff --git a/core/auth/pom.xml b/core/auth/pom.xml index 031d515b7688..0e253afbdab4 100644 --- a/core/auth/pom.xml +++ b/core/auth/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.11.6 + 2.11.7-SNAPSHOT auth diff --git a/core/auth/src/main/java/software/amazon/awssdk/auth/signer/internal/BaseEventStreamAsyncAws4Signer.java b/core/auth/src/main/java/software/amazon/awssdk/auth/signer/internal/BaseEventStreamAsyncAws4Signer.java index 545dc8905ea2..e50ac4e1450f 100644 --- a/core/auth/src/main/java/software/amazon/awssdk/auth/signer/internal/BaseEventStreamAsyncAws4Signer.java +++ b/core/auth/src/main/java/software/amazon/awssdk/auth/signer/internal/BaseEventStreamAsyncAws4Signer.java @@ -52,6 +52,8 @@ public abstract class BaseEventStreamAsyncAws4Signer extends BaseAsyncAws4Signer private static final String HTTP_CONTENT_SHA_256 = "STREAMING-AWS4-HMAC-SHA256-EVENTS"; private static final String EVENT_STREAM_PAYLOAD = "AWS4-HMAC-SHA256-PAYLOAD"; + private static final int PAYLOAD_TRUNCATE_LENGTH = 32; + protected BaseEventStreamAsyncAws4Signer() { } @@ -287,15 +289,26 @@ static String toDebugString(Message m, boolean truncatePayload) { sb.append("}, payload="); byte[] payload = m.getPayload(); - byte[] payloadToLog; + + // We don't actually need to truncate if the payload length is already within the truncate limit + truncatePayload = truncatePayload && payload.length > PAYLOAD_TRUNCATE_LENGTH; + if (truncatePayload) { // Would be nice if BinaryUtils.toHex() could take an array index range instead so we don't need to copy - payloadToLog = Arrays.copyOf(payload, Math.min(32, payload.length)); + payloadToLog = Arrays.copyOf(payload, PAYLOAD_TRUNCATE_LENGTH); } else { payloadToLog = payload; } - return sb.append(BinaryUtils.toHex(payloadToLog)).append("}").toString(); + sb.append(BinaryUtils.toHex(payloadToLog)); + + if (truncatePayload) { + sb.append("..."); + } + + sb.append("}"); + + return sb.toString(); } } diff --git a/core/auth/src/test/java/software/amazon/awssdk/auth/signer/internal/BaseEventStreamAsyncAws4SignerTest.java b/core/auth/src/test/java/software/amazon/awssdk/auth/signer/internal/BaseEventStreamAsyncAws4SignerTest.java index 75eca853d084..6e78ea6f8f79 100644 --- a/core/auth/src/test/java/software/amazon/awssdk/auth/signer/internal/BaseEventStreamAsyncAws4SignerTest.java +++ b/core/auth/src/test/java/software/amazon/awssdk/auth/signer/internal/BaseEventStreamAsyncAws4SignerTest.java @@ -62,7 +62,7 @@ public void toDebugString_largePayload_truncate_generatesCorrectString() { byte[] first32 = Arrays.copyOf(payload, 32); String expectedPayloadString = BinaryUtils.toHex(first32); assertThat(BaseEventStreamAsyncAws4Signer.toDebugString(m, true)) - .isEqualTo("Message = {headers={header1={42}, header2={false}, header3={\"Hello world\"}}, payload=" + expectedPayloadString + "}"); + .isEqualTo("Message = {headers={header1={42}, header2={false}, header3={\"Hello world\"}}, payload=" + expectedPayloadString + "...}"); } @Test @@ -75,4 +75,15 @@ public void toDebugString_largePayload_noTruncate_generatesCorrectString() { assertThat(BaseEventStreamAsyncAws4Signer.toDebugString(m, false)) .isEqualTo("Message = {headers={header1={42}, header2={false}, header3={\"Hello world\"}}, payload=" + expectedPayloadString + "}"); } + + @Test + public void toDebugString_smallPayload_truncate_doesNotAddEllipsis() { + byte[] payload = new byte[8]; + new Random().nextBytes(payload); + Message m = new Message(headers, payload); + + String expectedPayloadString = BinaryUtils.toHex(payload); + assertThat(BaseEventStreamAsyncAws4Signer.toDebugString(m, true)) + .isEqualTo("Message = {headers={header1={42}, header2={false}, header3={\"Hello world\"}}, payload=" + expectedPayloadString + "}"); + } } diff --git a/core/aws-core/pom.xml b/core/aws-core/pom.xml index edb0a32567f7..5b9ad9410ca7 100644 --- a/core/aws-core/pom.xml +++ b/core/aws-core/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.11.6 + 2.11.7-SNAPSHOT aws-core diff --git a/core/pom.xml b/core/pom.xml index 10c6fef40c44..b374da47629a 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -21,7 +21,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT core diff --git a/core/profiles/pom.xml b/core/profiles/pom.xml index ad13be5f5ec4..888e80421eea 100644 --- a/core/profiles/pom.xml +++ b/core/profiles/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.11.6 + 2.11.7-SNAPSHOT profiles diff --git a/core/protocols/aws-cbor-protocol/pom.xml b/core/protocols/aws-cbor-protocol/pom.xml index 68d9d084447e..2fa7203dafe5 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.11.6 + 2.11.7-SNAPSHOT 4.0.0 diff --git a/core/protocols/aws-ion-protocol/pom.xml b/core/protocols/aws-ion-protocol/pom.xml index 1e61434cfd14..4a5e0784eda9 100644 --- a/core/protocols/aws-ion-protocol/pom.xml +++ b/core/protocols/aws-ion-protocol/pom.xml @@ -20,7 +20,7 @@ protocols software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 diff --git a/core/protocols/aws-json-protocol/pom.xml b/core/protocols/aws-json-protocol/pom.xml index cd6401b3c541..3aaf3cf68abf 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.11.6 + 2.11.7-SNAPSHOT 4.0.0 diff --git a/core/protocols/aws-query-protocol/pom.xml b/core/protocols/aws-query-protocol/pom.xml index bb3c316b7bb0..228f53a89a7e 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.11.6 + 2.11.7-SNAPSHOT 4.0.0 diff --git a/core/protocols/aws-xml-protocol/pom.xml b/core/protocols/aws-xml-protocol/pom.xml index 2f6e33afdfd9..8d6abc15f060 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.11.6 + 2.11.7-SNAPSHOT 4.0.0 diff --git a/core/protocols/pom.xml b/core/protocols/pom.xml index fa2713d36df8..0ffbc740ad6a 100644 --- a/core/protocols/pom.xml +++ b/core/protocols/pom.xml @@ -20,7 +20,7 @@ core software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 diff --git a/core/protocols/protocol-core/pom.xml b/core/protocols/protocol-core/pom.xml index 2bd22b58874c..9521e09e7839 100644 --- a/core/protocols/protocol-core/pom.xml +++ b/core/protocols/protocol-core/pom.xml @@ -20,7 +20,7 @@ protocols software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 diff --git a/core/regions/pom.xml b/core/regions/pom.xml index 7675958f5cc3..e386d2bb5455 100644 --- a/core/regions/pom.xml +++ b/core/regions/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk core - 2.11.6 + 2.11.7-SNAPSHOT regions diff --git a/core/sdk-core/pom.xml b/core/sdk-core/pom.xml index a57e3d2767eb..7a2234a56f89 100644 --- a/core/sdk-core/pom.xml +++ b/core/sdk-core/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk core - 2.11.6 + 2.11.7-SNAPSHOT sdk-core AWS Java SDK :: SDK Core diff --git a/http-client-spi/pom.xml b/http-client-spi/pom.xml index 762443bf30f3..8ed37ad557ce 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.11.6 + 2.11.7-SNAPSHOT http-client-spi AWS Java SDK :: HTTP Client Interface diff --git a/http-clients/apache-client/pom.xml b/http-clients/apache-client/pom.xml index af4931f3beb8..fd39b716622c 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.11.6 + 2.11.7-SNAPSHOT apache-client diff --git a/http-clients/aws-crt-client/pom.xml b/http-clients/aws-crt-client/pom.xml new file mode 100644 index 000000000000..b2a300214f73 --- /dev/null +++ b/http-clients/aws-crt-client/pom.xml @@ -0,0 +1,189 @@ + + + + + + + http-clients + software.amazon.awssdk + 2.11.7-SNAPSHOT + + 4.0.0 + + aws-crt-client + AWS Java SDK :: HTTP Clients :: AWS Common Runtime Client + + + + + software.amazon.awssdk.crt + aws-crt + 0.5.1 + + + + + software.amazon.awssdk + annotations + ${awsjavasdk.version} + + + software.amazon.awssdk + http-client-spi + ${awsjavasdk.version} + + + software.amazon.awssdk + utils + ${awsjavasdk.version} + + + + + com.github.tomakehurst + wiremock + test + + + org.apache.commons + commons-lang3 + test + + + junit + junit + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core + test + + + org.reactivestreams + reactive-streams-tck + test + + + org.slf4j + slf4j-log4j12 + test + + + log4j + log4j + test + + + software.amazon.awssdk + http-client-tests + ${awsjavasdk.version} + test + + + software.amazon.awssdk + sdk-core + ${awsjavasdk.version} + test + + + software.amazon.awssdk + regions + ${awsjavasdk.version} + test + + + software.amazon.awssdk + s3 + ${awsjavasdk.version} + test + + + software.amazon.awssdk + kms + ${awsjavasdk.version} + test + + + software.amazon.awssdk + auth + ${awsjavasdk.version} + test + + + service-test-utils + software.amazon.awssdk + ${awsjavasdk.version} + test + + + commons-codec + commons-codec + ${commons-codec.verion} + test + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven.surefire.version} + + + + junit + false + + + 1 + + + + org.apache.maven.surefire + surefire-junit47 + ${maven.surefire.version} + + + org.apache.maven.surefire + surefire-testng + ${maven.surefire.version} + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + software.amazon.awssdk.http.crt + + + + + + + diff --git a/http-clients/aws-crt-client/src/it/java/software/amazon/awssdk/http/crt/AwsCrtClientCallingPatternIntegrationTest.java b/http-clients/aws-crt-client/src/it/java/software/amazon/awssdk/http/crt/AwsCrtClientCallingPatternIntegrationTest.java new file mode 100644 index 000000000000..c128924cea4b --- /dev/null +++ b/http-clients/aws-crt-client/src/it/java/software/amazon/awssdk/http/crt/AwsCrtClientCallingPatternIntegrationTest.java @@ -0,0 +1,220 @@ +/* + * 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.testutils.service.AwsTestBase.CREDENTIALS_PROVIDER_CHAIN; + +import java.util.ArrayList; +import java.util.List; +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 java.util.concurrent.atomic.AtomicBoolean; +import org.junit.Assert; +import org.junit.experimental.theories.DataPoints; +import org.junit.experimental.theories.FromDataPoints; +import org.junit.experimental.theories.Theories; +import org.junit.experimental.theories.Theory; +import org.junit.runner.RunWith; +import software.amazon.awssdk.crt.CrtResource; +import software.amazon.awssdk.crt.io.EventLoopGroup; +import software.amazon.awssdk.crt.io.HostResolver; +import software.amazon.awssdk.http.SdkHttpConfigurationOption; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.kms.KmsAsyncClient; +import software.amazon.awssdk.services.kms.model.GenerateRandomRequest; +import software.amazon.awssdk.services.kms.model.GenerateRandomResponse; +import software.amazon.awssdk.utils.AttributeMap; + + +/** + * Test many possible different calling patterns that users might do, and make sure everything works. + */ +@RunWith(Theories.class) +public class AwsCrtClientCallingPatternIntegrationTest { + private final static String KEY_ALIAS = "alias/aws-sdk-java-v2-integ-test"; + private final static Region REGION = Region.US_EAST_1; + private final static int DEFAULT_KEY_SIZE = 32; + + // Success rate will currently never go above ~99% due to aws-c-http not detecting connection close headers, and KMS + // closing the connection after the 100th Request on a Http Connection. + // Tracking Issue: https://github.com/awslabs/aws-c-http/issues/106 + private static double MINIMUM_SUCCESS_RATE = 0.95; + + private boolean testWithClient(KmsAsyncClient asyncKMSClient, int numberOfRequests) { + List> futures = new ArrayList<>(); + + for (int i = 0; i < numberOfRequests; i++) { + GenerateRandomRequest request = GenerateRandomRequest.builder().numberOfBytes(DEFAULT_KEY_SIZE).build(); + CompletableFuture future = asyncKMSClient.generateRandom(request); + futures.add(future); + } + + List failures = new ArrayList<>(); + int actualNumSucceeded = 0; + for (CompletableFuture f : futures) { + try { + GenerateRandomResponse resp = f.get(5, TimeUnit.MINUTES); + if (200 == resp.sdkHttpResponse().statusCode()) { + actualNumSucceeded += 1; + } + } catch (Exception e) { + failures.add(e); + } + } + + int minimumNumSucceeded = (int)(numberOfRequests * (MINIMUM_SUCCESS_RATE)); + boolean succeeded = true; + if (actualNumSucceeded < minimumNumSucceeded) { + System.err.println("Failure Metrics: numRequests=" + numberOfRequests + ", numSucceeded=" + actualNumSucceeded); + succeeded = false; + } + + if (!succeeded) { + for(Exception e: failures) { + System.err.println(e.getMessage()); + } + failures.get(0).printStackTrace(); + } + + return succeeded; + } + + private boolean testWithNewClient(int eventLoopSize, int numberOfRequests) { + + try (EventLoopGroup eventLoopGroup = new EventLoopGroup(eventLoopSize); + HostResolver hostResolver = new HostResolver(eventLoopGroup); + SdkAsyncHttpClient newAwsCrtHttpClient = AwsCrtAsyncHttpClient.builder() + .eventLoopGroup(eventLoopGroup) + .hostResolver(hostResolver) + .build()) { + try (KmsAsyncClient newAsyncKMSClient = KmsAsyncClient.builder() + .region(REGION) + .httpClient(newAwsCrtHttpClient) + .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN) + .build()) { + boolean succeeded = testWithClient(newAsyncKMSClient, numberOfRequests); + return succeeded; + } + } + } + + @DataPoints("EventLoop") + public static int[] eventLoopValues(){ + return new int[]{1, 4}; + } + + @DataPoints("ConnectionPool") + public static int[] connectionsValues(){ + /* Don't use 1 connection Pool of size 1, otherwise test takes too long */ + return new int[]{10, 100}; + } + + @DataPoints("NumRequests") + public static int[] requestValues(){ + return new int[]{1, 25, 250}; + } + + @DataPoints("ParallelClients") + public static int[] parallelClientValues(){ + return new int[]{1, 2, 8}; + } + + @DataPoints("SharedClient") + public static boolean[] sharedClientValue(){ + return new boolean[]{true, false}; + } + + @Theory + public void checkAllCombinations(@FromDataPoints("EventLoop") int eventLoopSize, + @FromDataPoints("ConnectionPool") int connectionPoolSize, + @FromDataPoints("NumRequests") int numberOfRequests, + @FromDataPoints("ParallelClients") int numberOfParallelClients, + @FromDataPoints("SharedClient") boolean useSharedClient) throws Exception { + + try { + + CrtResource.waitForNoResources(); + String testName = String.format("Testing with eventLoopSize %d, connectionPoolSize %d, numberOfRequests %d, " + + "numberOfParallelJavaClients %d, useSharedClient %b", eventLoopSize, connectionPoolSize, + numberOfRequests, numberOfParallelClients, useSharedClient); + System.out.println("\n" + testName); + + CountDownLatch latch = new CountDownLatch(numberOfParallelClients); + + AttributeMap attributes = AttributeMap.builder() + .put(SdkHttpConfigurationOption.MAX_CONNECTIONS, connectionPoolSize) + .build(); + + EventLoopGroup eventLoopGroup = new EventLoopGroup(eventLoopSize); + HostResolver hostResolver = new HostResolver(eventLoopGroup); + + SdkAsyncHttpClient awsCrtHttpClient = AwsCrtAsyncHttpClient.builder() + .eventLoopGroup(eventLoopGroup) + .hostResolver(hostResolver) + .buildWithDefaults(attributes); + + KmsAsyncClient sharedAsyncKMSClient = KmsAsyncClient.builder() + .region(REGION) + .httpClient(awsCrtHttpClient) + .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN) + .build(); + + final AtomicBoolean failed = new AtomicBoolean(false); + + long start = System.currentTimeMillis(); + ExecutorService pool = Executors.newCachedThreadPool(); + for (int threads = 0; threads < numberOfParallelClients; threads++) { + pool.submit(() -> { + if (useSharedClient) { + if (!testWithClient(sharedAsyncKMSClient, numberOfRequests)) { + System.err.println("Failed: " + testName); + failed.set(true); + } + } else { + if (!testWithNewClient(eventLoopSize, numberOfRequests)) { + System.err.println("Failed: " + testName); + failed.set(true); + } + } + latch.countDown(); + }); + } + + latch.await(5, TimeUnit.MINUTES); + + sharedAsyncKMSClient.close(); + awsCrtHttpClient.close(); + Assert.assertFalse(failed.get()); + + hostResolver.close(); + eventLoopGroup.close(); + + CrtResource.waitForNoResources(); + + float numSeconds = (float) ((System.currentTimeMillis() - start) / 1000.0); + String timeElapsed = String.format("%.2f sec", numSeconds); + + System.out.println("Passed: " + testName + ", Time " + timeElapsed); + } catch (Exception e) { + System.err.println(e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/http-clients/aws-crt-client/src/it/java/software/amazon/awssdk/http/crt/AwsCrtClientKmsIntegrationTest.java b/http-clients/aws-crt-client/src/it/java/software/amazon/awssdk/http/crt/AwsCrtClientKmsIntegrationTest.java new file mode 100644 index 000000000000..4508bd7c6f9c --- /dev/null +++ b/http-clients/aws-crt-client/src/it/java/software/amazon/awssdk/http/crt/AwsCrtClientKmsIntegrationTest.java @@ -0,0 +1,144 @@ +package software.amazon.awssdk.http.crt; + +import static software.amazon.awssdk.testutils.service.AwsTestBase.CREDENTIALS_PROVIDER_CHAIN; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import software.amazon.awssdk.core.SdkBytes; +import software.amazon.awssdk.crt.CrtResource; +import software.amazon.awssdk.crt.io.EventLoopGroup; +import software.amazon.awssdk.crt.io.HostResolver; +import software.amazon.awssdk.crt.io.TlsCipherPreference; +import software.amazon.awssdk.crt.io.TlsContextOptions; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.kms.KmsAsyncClient; +import software.amazon.awssdk.services.kms.model.CreateAliasRequest; +import software.amazon.awssdk.services.kms.model.CreateAliasResponse; +import software.amazon.awssdk.services.kms.model.CreateKeyRequest; +import software.amazon.awssdk.services.kms.model.CreateKeyResponse; +import software.amazon.awssdk.services.kms.model.DecryptRequest; +import software.amazon.awssdk.services.kms.model.DecryptResponse; +import software.amazon.awssdk.services.kms.model.DescribeKeyRequest; +import software.amazon.awssdk.services.kms.model.DescribeKeyResponse; +import software.amazon.awssdk.services.kms.model.EncryptRequest; +import software.amazon.awssdk.services.kms.model.EncryptResponse; + + +public class AwsCrtClientKmsIntegrationTest { + private static String KEY_ALIAS = "alias/aws-sdk-java-v2-integ-test"; + private static Region REGION = Region.US_EAST_1; + private static List awsCrtHttpClients = new ArrayList<>(); + private static EventLoopGroup eventLoopGroup; + private static HostResolver hostResolver; + + @Before + public void setup() { + CrtResource.waitForNoResources(); + + // Create an Http Client for each TLS Cipher Preference supported on the current platform + for (TlsCipherPreference pref: TlsCipherPreference.values()) { + if (!TlsContextOptions.isCipherPreferenceSupported(pref)) { + continue; + } + + int numThreads = 1; + eventLoopGroup = new EventLoopGroup(numThreads); + hostResolver = new HostResolver(eventLoopGroup); + + SdkAsyncHttpClient awsCrtHttpClient = AwsCrtAsyncHttpClient.builder() + .eventLoopGroup(eventLoopGroup) + .hostResolver(hostResolver) + .build(); + + awsCrtHttpClients.add(awsCrtHttpClient); + } + } + + + @After + public void tearDown() { + hostResolver.close(); + eventLoopGroup.close(); + CrtResource.waitForNoResources(); + } + + private boolean doesKeyExist(KmsAsyncClient kms, String keyAlias) { + try { + DescribeKeyRequest req = DescribeKeyRequest.builder().keyId(keyAlias).build(); + DescribeKeyResponse resp = kms.describeKey(req).get(); + Assert.assertEquals(200, resp.sdkHttpResponse().statusCode()); + return resp.sdkHttpResponse().isSuccessful(); + } catch (Exception e) { + return false; + } + } + + private void createKeyAlias(KmsAsyncClient kms, String keyId, String keyAlias) throws Exception { + CreateAliasRequest req = CreateAliasRequest.builder().aliasName(keyAlias).targetKeyId(keyId).build(); + CreateAliasResponse resp = kms.createAlias(req).get(); + Assert.assertEquals(200, resp.sdkHttpResponse().statusCode()); + } + + private String createKey(KmsAsyncClient kms) throws Exception { + CreateKeyRequest req = CreateKeyRequest.builder().build(); + CreateKeyResponse resp = kms.createKey(req).get(); + Assert.assertEquals(200, resp.sdkHttpResponse().statusCode()); + return resp.keyMetadata().keyId(); + } + + private void createKeyIfNotExists(KmsAsyncClient kms, String keyAlias) throws Exception { + if (!doesKeyExist(kms, keyAlias)) { + String keyId = createKey(kms); + createKeyAlias(kms, keyId, KEY_ALIAS); + } + } + + private SdkBytes encrypt(KmsAsyncClient kms, String keyId, String plaintext) throws Exception { + SdkBytes bytes = SdkBytes.fromUtf8String(plaintext); + EncryptRequest req = EncryptRequest.builder().keyId(keyId).plaintext(bytes).build(); + EncryptResponse resp = kms.encrypt(req).get(); + Assert.assertEquals(200, resp.sdkHttpResponse().statusCode()); + return resp.ciphertextBlob(); + } + + private String decrypt(KmsAsyncClient kms, SdkBytes ciphertext) throws Exception { + DecryptRequest req = DecryptRequest.builder().ciphertextBlob(ciphertext).build(); + DecryptResponse resp = kms.decrypt(req).get(); + Assert.assertEquals(200, resp.sdkHttpResponse().statusCode()); + return resp.plaintext().asUtf8String(); + } + + private void testEncryptDecryptWithKms(KmsAsyncClient kms) throws Exception { + createKeyIfNotExists(kms, KEY_ALIAS); + Assert.assertTrue(doesKeyExist(kms, KEY_ALIAS)); + Assert.assertFalse(doesKeyExist(kms, "alias/does-not-exist-" + UUID.randomUUID())); + + String secret = UUID.randomUUID().toString(); + SdkBytes cipherText = encrypt(kms, KEY_ALIAS, secret); + String plainText = decrypt(kms, cipherText); + + Assert.assertEquals(plainText, secret); + } + + @Test + public void testEncryptDecryptWithKms() throws Exception { + for (SdkAsyncHttpClient awsCrtHttpClient: awsCrtHttpClients) { + KmsAsyncClient kms = KmsAsyncClient.builder() + .region(REGION) + .httpClient(awsCrtHttpClient) + .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN) + .build(); + + testEncryptDecryptWithKms(kms); + + kms.close(); + awsCrtHttpClient.close(); + } + } +} diff --git a/http-clients/aws-crt-client/src/it/java/software/amazon/awssdk/http/crt/AwsCrtClientS3IntegrationTest.java b/http-clients/aws-crt-client/src/it/java/software/amazon/awssdk/http/crt/AwsCrtClientS3IntegrationTest.java new file mode 100644 index 000000000000..16d64821a3f1 --- /dev/null +++ b/http-clients/aws-crt-client/src/it/java/software/amazon/awssdk/http/crt/AwsCrtClientS3IntegrationTest.java @@ -0,0 +1,121 @@ +/* + * 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 org.apache.commons.codec.digest.DigestUtils.sha256Hex; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider; +import software.amazon.awssdk.core.ResponseBytes; +import software.amazon.awssdk.core.async.AsyncResponseTransformer; +import software.amazon.awssdk.crt.CrtResource; +import software.amazon.awssdk.crt.io.EventLoopGroup; +import software.amazon.awssdk.crt.io.HostResolver; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3AsyncClient; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; + + +public class AwsCrtClientS3IntegrationTest { + /** + * The name of the bucket created, used, and deleted by these tests. + */ + private static String BUCKET_NAME = "aws-crt-test-stuff"; + + private static String LARGE_FILE = "http_test_doc.txt"; + private static String SMALL_FILE = "random_32_byte.data"; + private static String LARGE_FILE_SHA256 = "C7FDB5314B9742467B16BD5EA2F8012190B5E2C44A005F7984F89AAB58219534"; + private static int NUM_REQUESTS = 1000; + + private static Region REGION = Region.US_EAST_1; + + private static EventLoopGroup eventLoopGroup; + private static HostResolver hostResolver; + private static SdkAsyncHttpClient crtClient; + + private static S3AsyncClient s3; + + @Before + public void setup() { + CrtResource.waitForNoResources(); + + int numThreads = 4; + eventLoopGroup = new EventLoopGroup(numThreads); + hostResolver = new HostResolver(eventLoopGroup); + + crtClient = AwsCrtAsyncHttpClient.builder() + .eventLoopGroup(eventLoopGroup) + .hostResolver(hostResolver) + .build(); + + s3 = S3AsyncClient.builder() + .region(REGION) + .httpClient(crtClient) + .credentialsProvider(AnonymousCredentialsProvider.create()) // File is publicly readable + .build(); + } + + @After + public void tearDown() { + s3.close(); + crtClient.close(); + hostResolver.close(); + eventLoopGroup.close(); + CrtResource.waitForNoResources(); + } + + @Test + public void testDownloadFromS3() throws Exception { + GetObjectRequest s3Request = GetObjectRequest.builder() + .bucket(BUCKET_NAME) + .key(LARGE_FILE) + .build(); + + byte[] responseBody = s3.getObject(s3Request, AsyncResponseTransformer.toBytes()).get(120, TimeUnit.SECONDS).asByteArray(); + + assertThat(sha256Hex(responseBody).toUpperCase()).isEqualTo(LARGE_FILE_SHA256); + } + + @Test + public void testParallelDownloadFromS3() throws Exception { + List> > requestFutures = new ArrayList<>(); + + for (int i = 0; i < NUM_REQUESTS; i++) { + GetObjectRequest s3Request = GetObjectRequest.builder() + .bucket(BUCKET_NAME) + .key(SMALL_FILE) + .build(); + CompletableFuture> requestFuture = s3.getObject(s3Request, AsyncResponseTransformer.toBytes()); + requestFutures.add(requestFuture); + } + + for(CompletableFuture> f: requestFutures) { + f.join(); + Assert.assertEquals(32, f.get().asByteArray().length); + } + } + +} 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 new file mode 100644 index 000000000000..f9491676f4d9 --- /dev/null +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.java @@ -0,0 +1,383 @@ +/* + * 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.utils.CollectionUtils.isNullOrEmpty; +import static software.amazon.awssdk.utils.FunctionalUtils.invokeSafely; + +import java.net.URI; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; +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.HttpHeader; +import software.amazon.awssdk.crt.http.HttpRequest; +import software.amazon.awssdk.crt.io.ClientBootstrap; +import software.amazon.awssdk.crt.io.EventLoopGroup; +import software.amazon.awssdk.crt.io.HostResolver; +import software.amazon.awssdk.crt.io.SocketOptions; +import software.amazon.awssdk.crt.io.TlsCipherPreference; +import software.amazon.awssdk.crt.io.TlsContext; +import software.amazon.awssdk.crt.io.TlsContextOptions; +import software.amazon.awssdk.http.SdkHttpClient; +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.AwsCrtAsyncHttpStreamAdapter; +import software.amazon.awssdk.utils.AttributeMap; +import software.amazon.awssdk.utils.IoUtils; +import software.amazon.awssdk.utils.Logger; +import software.amazon.awssdk.utils.Validate; +import software.amazon.awssdk.utils.http.SdkHttpUtils; + +/** + * An implementation of {@link SdkHttpClient} that uses the AWS Common Runtime (CRT) Http Client to communicate with + * Http Web Services. This client is asynchronous and uses non-blocking IO. + * + *

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

+ */ +@SdkPublicApi +public class AwsCrtAsyncHttpClient implements SdkAsyncHttpClient { + private static final Logger log = Logger.loggerFor(AwsCrtAsyncHttpClient.class); + private static final String HOST_HEADER = "Host"; + private static final String CONTENT_LENGTH = "Content-Length"; + private static final String CONNECTION = "Connection"; + private static final String KEEP_ALIVE = "keep-alive"; + private static final String AWS_COMMON_RUNTIME = "AwsCommonRuntime"; + private static final int DEFAULT_STREAM_WINDOW_SIZE = 16 * 1024 * 1024; // 16 MB + + private final Map connectionPools = new ConcurrentHashMap<>(); + private final LinkedList ownedSubResources = new LinkedList<>(); + private final AtomicBoolean isClosed = new AtomicBoolean(false); + private final ClientBootstrap bootstrap; + private final SocketOptions socketOptions; + private final TlsContextOptions tlsContextOptions; + private final TlsContext tlsContext; + private final int windowSize; + private final int maxConnectionsPerEndpoint; + + + public AwsCrtAsyncHttpClient(DefaultBuilder builder, AttributeMap config) { + int maxConns = config.get(SdkHttpConfigurationOption.MAX_CONNECTIONS); + + Validate.isPositive(maxConns, "maxConns"); + Validate.notNull(builder.cipherPreference, "cipherPreference"); + Validate.isPositive(builder.windowSize, "windowSize"); + Validate.notNull(builder.eventLoopGroup, "eventLoopGroup"); + Validate.notNull(builder.hostResolver, "hostResolver"); + + /** + * Must call own() in same order that CrtResources are created in, so that they will be closed in reverse order. + * + * Do NOT use Dependency Injection for Native CrtResources. It's possible to crash the JVM Process if Native + * Resources are closed in the wrong order (Eg closing the Bootstrap/Threadpool when there are still open + * connections). By creating and owning our own Native CrtResources we can guarantee that things are shutdown + * in the correct order. + */ + + this.bootstrap = own(new ClientBootstrap(builder.eventLoopGroup, builder.hostResolver)); + this.socketOptions = own(new SocketOptions()); + + /** + * Sonar raises a false-positive that the TlsContextOptions created here will not be closed. Using a "NOSONAR" + * comment so that Sonar will ignore that false-positive. + */ + this.tlsContextOptions = own(TlsContextOptions.createDefaultClient() // NOSONAR + .withCipherPreference(builder.cipherPreference) + .withVerifyPeer(builder.verifyPeer)); + + this.tlsContext = own(new TlsContext(this.tlsContextOptions)); + this.windowSize = builder.windowSize; + this.maxConnectionsPerEndpoint = maxConns; + } + + /** + * Marks a Native CrtResource as owned by the current Java Object. + * This will guarantee that any owned CrtResources are closed in reverse order when this Java Object is closed. + * + * @param subresource The Resource to own. + * @param The CrtResource Type + * @return The CrtResource passed in + */ + private T own(T subresource) { + ownedSubResources.push(subresource); + return subresource; + } + + private static URI toUri(SdkHttpRequest sdkRequest) { + Validate.notNull(sdkRequest, "SdkHttpRequest must not be null"); + return invokeSafely(() -> new URI(sdkRequest.protocol(), null, sdkRequest.host(), sdkRequest.port(), + null, null, null)); + } + + public static Builder builder() { + return new DefaultBuilder(); + } + + @Override + public String clientName() { + return AWS_COMMON_RUNTIME; + } + + private HttpClientConnectionManager createConnectionPool(URI uri) { + Validate.notNull(uri, "URI must not be null"); + log.debug(() -> "Creating ConnectionPool for: URI:" + uri + ", MaxConns: " + maxConnectionsPerEndpoint); + + HttpClientConnectionManagerOptions options = new HttpClientConnectionManagerOptions() + .withClientBootstrap(bootstrap) + .withSocketOptions(socketOptions) + .withTlsContext(tlsContext) + .withUri(uri) + .withWindowSize(windowSize) + .withMaxConnections(maxConnectionsPerEndpoint); + + return HttpClientConnectionManager.create(options); + } + + private HttpClientConnectionManager getOrCreateConnectionPool(URI uri) { + Validate.notNull(uri, "URI must not be null"); + HttpClientConnectionManager connPool = connectionPools.get(uri); + + if (connPool == null) { + HttpClientConnectionManager newConnPool = createConnectionPool(uri); + HttpClientConnectionManager alreadyExistingConnPool = connectionPools.putIfAbsent(uri, newConnPool); + + if (alreadyExistingConnPool == null) { + connPool = newConnPool; + } else { + // Multiple threads trying to open connections to the same URI at once, close the newer one + newConnPool.close(); + connPool = alreadyExistingConnPool; + } + } + + return connPool; + } + + private List createHttpHeaderList(URI uri, AsyncExecuteRequest asyncRequest) { + SdkHttpRequest sdkRequest = asyncRequest.request(); + List crtHeaderList = new ArrayList<>(sdkRequest.headers().size() + 2); + + // Set Host Header if needed + if (isNullOrEmpty(sdkRequest.headers().get(HOST_HEADER))) { + crtHeaderList.add(new HttpHeader(HOST_HEADER, uri.getHost())); + } + + // Add Connection Keep Alive Header to reuse this Http Connection as long as possible + if (isNullOrEmpty(sdkRequest.headers().get(CONNECTION))) { + crtHeaderList.add(new HttpHeader(CONNECTION, KEEP_ALIVE)); + } + + // Set Content-Length if needed + Optional contentLength = asyncRequest.requestContentPublisher().contentLength(); + if (isNullOrEmpty(sdkRequest.headers().get(CONTENT_LENGTH)) && contentLength.isPresent()) { + crtHeaderList.add(new HttpHeader(CONTENT_LENGTH, Long.toString(contentLength.get()))); + } + + // Add the rest of the Headers + for (Map.Entry> headerList: sdkRequest.headers().entrySet()) { + for (String val: headerList.getValue()) { + HttpHeader h = new HttpHeader(headerList.getKey(), val); + crtHeaderList.add(h); + } + } + + return crtHeaderList; + } + + private HttpHeader[] asArray(List crtHeaderList) { + return crtHeaderList.toArray(new HttpHeader[crtHeaderList.size()]); + } + + private HttpRequest toCrtRequest(URI uri, AsyncExecuteRequest asyncRequest, AwsCrtAsyncHttpStreamAdapter crtToSdkAdapter) { + SdkHttpRequest sdkRequest = asyncRequest.request(); + Validate.notNull(uri, "URI must not be null"); + Validate.notNull(sdkRequest, "SdkHttpRequest must not be null"); + + String method = sdkRequest.method().name(); + String encodedPath = sdkRequest.encodedPath(); + String encodedQueryString = SdkHttpUtils.encodeAndFlattenQueryParameters(sdkRequest.rawQueryParameters()) + .map(value -> "?" + value) + .orElse(""); + + HttpHeader[] crtHeaderArray = asArray(createHttpHeaderList(uri, asyncRequest)); + + return new HttpRequest(method, encodedPath + encodedQueryString, crtHeaderArray, crtToSdkAdapter); + } + + @Override + public CompletableFuture execute(AsyncExecuteRequest asyncRequest) { + if (isClosed.get()) { + throw new IllegalStateException("Client is closed. No more requests can be made with this client."); + } + Validate.notNull(asyncRequest, "AsyncExecuteRequest must not be null"); + Validate.notNull(asyncRequest.request(), "SdkHttpRequest must not be null"); + Validate.notNull(asyncRequest.requestContentPublisher(), "RequestContentPublisher must not be null"); + Validate.notNull(asyncRequest.responseHandler(), "ResponseHandler must not be null"); + + URI uri = toUri(asyncRequest.request()); + HttpClientConnectionManager crtConnPool = getOrCreateConnectionPool(uri); + CompletableFuture requestFuture = new CompletableFuture<>(); + + // When a Connection is ready from the Connection Pool, schedule the Request on the connection + crtConnPool.acquireConnection() + .whenComplete((crtConn, throwable) -> { + // If we didn't get a connection for some reason, fail the request + if (throwable != null) { + requestFuture.completeExceptionally(throwable); + return; + } + + AwsCrtAsyncHttpStreamAdapter crtToSdkAdapter = + new AwsCrtAsyncHttpStreamAdapter(crtConn, requestFuture, asyncRequest, windowSize); + HttpRequest crtRequest = toCrtRequest(uri, asyncRequest, crtToSdkAdapter); + + // Submit the Request on this Connection + invokeSafely(() -> crtConn.makeRequest(crtRequest, crtToSdkAdapter).activate()); + }); + + return requestFuture; + } + + @Override + public void close() { + isClosed.set(true); + for (HttpClientConnectionManager connPool : connectionPools.values()) { + IoUtils.closeQuietly(connPool, log.logger()); + } + + while (ownedSubResources.size() > 0) { + CrtResource r = ownedSubResources.pop(); + IoUtils.closeQuietly(r, log.logger()); + } + } + + /** + * Builder that allows configuration of the AWS CRT HTTP implementation. + */ + public interface Builder extends SdkAsyncHttpClient.Builder { + + /** + * The AWS CRT TlsCipherPreference to use for this Client + * @param tlsCipherPreference The AWS Common Runtime TlsCipherPreference + * @return The builder of the method chaining. + */ + Builder tlsCipherPreference(TlsCipherPreference tlsCipherPreference); + + /** + * Whether or not to Verify the Peer's TLS Certificate Chain. + * @param verifyPeer true if the Certificate Chain should be validated, false if validation should be skipped. + * @return The builder of the method chaining. + */ + Builder verifyPeer(boolean verifyPeer); + + /** + * The AWS CRT WindowSize to use for this HttpClient. This represents the number of unread bytes that can be + * buffered in the ResponseBodyPublisher before we stop reading from the underlying TCP socket and wait for + * the Subscriber to read more data. + * + * @param windowSize The AWS Common Runtime WindowSize + * @return The builder of the method chaining. + */ + Builder windowSize(int windowSize); + + /** + * The AWS CRT EventLoopGroup to use for this Client. + * @param eventLoopGroup The AWS CRT EventLoopGroup to use for this client. + * @return The builder of the method chaining. + */ + Builder eventLoopGroup(EventLoopGroup eventLoopGroup); + + /** + * The AWS CRT HostResolver to use for this Client. + * @param hostResolver The AWS CRT HostResolver to use for this client. + * @return The builder of the method chaining. + */ + Builder hostResolver(HostResolver hostResolver); + } + + /** + * 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 TlsCipherPreference cipherPreference = TlsCipherPreference.TLS_CIPHER_SYSTEM_DEFAULT; + private int windowSize = DEFAULT_STREAM_WINDOW_SIZE; + private boolean verifyPeer = true; + private EventLoopGroup eventLoopGroup; + private HostResolver hostResolver; + + private DefaultBuilder() { + } + + @Override + public SdkAsyncHttpClient build() { + return new AwsCrtAsyncHttpClient(this, standardOptions.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 tlsCipherPreference(TlsCipherPreference tlsCipherPreference) { + Validate.notNull(tlsCipherPreference, "cipherPreference"); + Validate.isTrue(TlsContextOptions.isCipherPreferenceSupported(tlsCipherPreference), + "TlsCipherPreference not supported on current Platform"); + this.cipherPreference = tlsCipherPreference; + return this; + } + + @Override + public Builder verifyPeer(boolean verifyPeer) { + this.verifyPeer = verifyPeer; + return this; + } + + @Override + public Builder windowSize(int windowSize) { + Validate.isPositive(windowSize, "windowSize"); + this.windowSize = windowSize; + return this; + } + + @Override + public Builder eventLoopGroup(EventLoopGroup eventLoopGroup) { + this.eventLoopGroup = eventLoopGroup; + return this; + } + + @Override + public Builder hostResolver(HostResolver hostResolver) { + this.hostResolver = hostResolver; + return this; + } + } +} diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtAsyncHttpStreamAdapter.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtAsyncHttpStreamAdapter.java new file mode 100644 index 000000000000..730a85413ad6 --- /dev/null +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtAsyncHttpStreamAdapter.java @@ -0,0 +1,130 @@ +/* + * 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.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.HttpRequestBodyStream; +import software.amazon.awssdk.crt.http.HttpStream; +import software.amazon.awssdk.crt.http.HttpStreamResponseHandler; +import software.amazon.awssdk.http.SdkHttpResponse; +import software.amazon.awssdk.http.async.AsyncExecuteRequest; +import software.amazon.awssdk.utils.Logger; +import software.amazon.awssdk.utils.Validate; + +/** + * Implements the CrtHttpStreamHandler API and converts CRT callbacks into calls to SDK AsyncExecuteRequest methods + */ +@SdkInternalApi +public class AwsCrtAsyncHttpStreamAdapter implements HttpStreamResponseHandler, HttpRequestBodyStream { + private static final Logger log = Logger.loggerFor(AwsCrtAsyncHttpStreamAdapter.class); + + private final HttpClientConnection connection; + private final CompletableFuture responseComplete; + private final AsyncExecuteRequest sdkRequest; + private final SdkHttpResponse.Builder respBuilder = SdkHttpResponse.builder(); + private final int windowSize; + private final AwsCrtRequestBodySubscriber requestBodySubscriber; + private AwsCrtResponseBodyPublisher respBodyPublisher = null; + + public AwsCrtAsyncHttpStreamAdapter(HttpClientConnection connection, CompletableFuture responseComplete, + AsyncExecuteRequest sdkRequest, int windowSize) { + Validate.notNull(connection, "HttpConnection is null"); + Validate.notNull(responseComplete, "reqComplete Future is null"); + Validate.notNull(sdkRequest, "AsyncExecuteRequest Future is null"); + Validate.isPositive(windowSize, "windowSize is <= 0"); + + this.connection = connection; + this.responseComplete = responseComplete; + this.sdkRequest = sdkRequest; + this.windowSize = windowSize; + this.requestBodySubscriber = new AwsCrtRequestBodySubscriber(windowSize); + + sdkRequest.requestContentPublisher().subscribe(requestBodySubscriber); + } + + private void initRespBodyPublisherIfNeeded(HttpStream stream) { + if (respBodyPublisher == null) { + respBodyPublisher = new AwsCrtResponseBodyPublisher(connection, stream, responseComplete, windowSize); + } + } + + @Override + public void onResponseHeaders(HttpStream stream, int responseStatusCode, int blockType, HttpHeader[] nextHeaders) { + initRespBodyPublisherIfNeeded(stream); + + respBuilder.statusCode(responseStatusCode); + + for (HttpHeader h : nextHeaders) { + respBuilder.appendHeader(h.getName(), h.getValue()); + } + } + + @Override + public void onResponseHeadersDone(HttpStream stream, int headerType) { + initRespBodyPublisherIfNeeded(stream); + + respBuilder.statusCode(stream.getResponseStatusCode()); + sdkRequest.responseHandler().onHeaders(respBuilder.build()); + sdkRequest.responseHandler().onStream(respBodyPublisher); + } + + @Override + public int onResponseBody(HttpStream stream, byte[] bodyBytesIn) { + initRespBodyPublisherIfNeeded(stream); + + if (respBodyPublisher == null) { + log.error(() -> "Publisher is null, onResponseHeadersDone() was never called"); + throw new IllegalStateException("Publisher is null, onResponseHeadersDone() was never called"); + } + + respBodyPublisher.queueBuffer(bodyBytesIn); + respBodyPublisher.publishToSubscribers(); + + return 0; + } + + @Override + public void onResponseComplete(HttpStream stream, int errorCode) { + initRespBodyPublisherIfNeeded(stream); + + if (errorCode == CRT.AWS_CRT_SUCCESS) { + log.debug(() -> "Response Completed Successfully"); + respBodyPublisher.setQueueComplete(); + respBodyPublisher.publishToSubscribers(); + } else { + HttpException error = new HttpException(errorCode); + log.error(() -> "Response Encountered an Error.", error); + + // Invoke Error Callback on SdkAsyncHttpResponseHandler + sdkRequest.responseHandler().onError(error); + + // Invoke Error Callback on any Subscriber's of the Response Body + respBodyPublisher.setError(error); + respBodyPublisher.publishToSubscribers(); + } + } + + @Override + public boolean sendRequestBody(ByteBuffer bodyBytesOut) { + return requestBodySubscriber.transferRequestBody(bodyBytesOut); + } +} diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtRequestBodySubscriber.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtRequestBodySubscriber.java new file mode 100644 index 000000000000..b9790dcb1f1d --- /dev/null +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtRequestBodySubscriber.java @@ -0,0 +1,132 @@ +/* + * 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 static software.amazon.awssdk.crt.utils.ByteBufferUtils.transferData; + +import java.nio.ByteBuffer; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.utils.Logger; +import software.amazon.awssdk.utils.Validate; + +/** + * Implements the Subscriber API to be be callable from AwsCrtAsyncHttpStreamAdapter.sendRequestBody() + */ +@SdkInternalApi +public class AwsCrtRequestBodySubscriber implements Subscriber { + private static final Logger log = Logger.loggerFor(AwsCrtRequestBodySubscriber.class); + + private final int windowSize; + private final Queue queuedBuffers = new ConcurrentLinkedQueue<>(); + private final AtomicLong queuedByteCount = new AtomicLong(0); + private final AtomicBoolean isComplete = new AtomicBoolean(false); + private final AtomicReference error = new AtomicReference<>(null); + + private AtomicReference subscriptionRef = new AtomicReference<>(null); + + /** + * + * @param windowSize The number bytes to be queued before we stop proactively queuing data + */ + public AwsCrtRequestBodySubscriber(int windowSize) { + Validate.isPositive(windowSize, "windowSize is <= 0"); + this.windowSize = windowSize; + } + + protected void requestDataIfNecessary() { + Subscription subscription = subscriptionRef.get(); + if (subscription == null) { + log.error(() -> "Subscription is null"); + return; + } + if (queuedByteCount.get() < windowSize) { + subscription.request(1); + } + } + + @Override + public void onSubscribe(Subscription s) { + Validate.notNull(s, "Subscription should not be null"); + + boolean wasFirstSubscription = subscriptionRef.compareAndSet(null, s); + + if (!wasFirstSubscription) { + log.error(() -> "Only one Subscription supported!"); + s.cancel(); + return; + } + + requestDataIfNecessary(); + } + + @Override + public void onNext(ByteBuffer byteBuffer) { + Validate.notNull(byteBuffer, "ByteBuffer should not be null"); + queuedBuffers.add(byteBuffer); + queuedByteCount.addAndGet(byteBuffer.remaining()); + requestDataIfNecessary(); + } + + @Override + public void onError(Throwable t) { + log.error(() -> "onError() received an error: " + t.getMessage()); + error.compareAndSet(null, t); + } + + @Override + public void onComplete() { + log.debug(() -> "AwsCrtRequestBodySubscriber Completed"); + isComplete.set(true); + } + + /** + * Transfers any queued data from the Request Body subscriptionRef to the output buffer + * @param out The output ByteBuffer + * @return true if Request Body is completely transferred, false otherwise + */ + public synchronized boolean transferRequestBody(ByteBuffer out) { + if (error.get() != null) { + throw new RuntimeException(error.get()); + } + + while (out.remaining() > 0 && queuedBuffers.size() > 0) { + ByteBuffer nextBuffer = queuedBuffers.peek(); + int amtTransferred = transferData(nextBuffer, out); + queuedByteCount.addAndGet(-amtTransferred); + + if (nextBuffer.remaining() == 0) { + queuedBuffers.remove(); + } + } + + boolean endOfStream = isComplete.get() && (queuedBuffers.size() == 0); + + if (!endOfStream) { + requestDataIfNecessary(); + } else { + log.debug(() -> "End Of RequestBody reached"); + } + + return endOfStream; + } +} diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtResponseBodyPublisher.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtResponseBodyPublisher.java new file mode 100644 index 000000000000..ebc7888634b6 --- /dev/null +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtResponseBodyPublisher.java @@ -0,0 +1,285 @@ +/* + * 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.nio.ByteBuffer; +import java.util.Optional; +import java.util.Queue; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.LongUnaryOperator; +import org.reactivestreams.Publisher; +import org.reactivestreams.Subscriber; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.crt.http.HttpClientConnection; +import software.amazon.awssdk.crt.http.HttpStream; +import software.amazon.awssdk.utils.Logger; +import software.amazon.awssdk.utils.Validate; + +/** + * Adapts an AWS Common Runtime Response Body stream from CrtHttpStreamHandler to a Publisher + */ +@SdkInternalApi +public class AwsCrtResponseBodyPublisher implements Publisher { + private static final Logger log = Logger.loggerFor(AwsCrtResponseBodyPublisher.class); + private static final LongUnaryOperator DECREMENT_IF_GREATER_THAN_ZERO = x -> ((x > 0) ? (x - 1) : (x)); + + private final HttpClientConnection connection; + private final HttpStream stream; + private final CompletableFuture responseComplete; + private final AtomicLong outstandingRequests = new AtomicLong(0); + private final int windowSize; + private final AtomicBoolean isCancelled = new AtomicBoolean(false); + private final AtomicBoolean areNativeResourcesReleased = new AtomicBoolean(false); + private final AtomicBoolean isSubscriptionComplete = new AtomicBoolean(false); + private final AtomicBoolean queueComplete = new AtomicBoolean(false); + private final AtomicInteger mutualRecursionDepth = new AtomicInteger(0); + private final AtomicInteger queuedBytes = new AtomicInteger(0); + private final AtomicReference> subscriberRef = new AtomicReference<>(null); + private final Queue queuedBuffers = new ConcurrentLinkedQueue<>(); + private final AtomicReference error = new AtomicReference<>(null); + + /** + * Adapts a streaming AWS CRT Http Response Body to a Publisher + * @param stream The AWS CRT Http Stream for this Response + * @param windowSize The max allowed bytes to be queued. The sum of the sizes of all queued ByteBuffers should + * never exceed this value. + */ + public AwsCrtResponseBodyPublisher(HttpClientConnection connection, HttpStream stream, + CompletableFuture responseComplete, int windowSize) { + Validate.notNull(connection, "HttpConnection must not be null"); + Validate.notNull(stream, "Stream must not be null"); + Validate.notNull(responseComplete, "Stream must not be null"); + Validate.isPositive(windowSize, "windowSize must be > 0"); + this.connection = connection; + this.stream = stream; + this.responseComplete = responseComplete; + this.windowSize = windowSize; + } + + /** + * Method for the users consuming the Http Response Body to register a subscriber. + * @param subscriber The Subscriber to register. + */ + @Override + public void subscribe(Subscriber subscriber) { + Validate.notNull(subscriber, "Subscriber must not be null"); + + boolean wasFirstSubscriber = subscriberRef.compareAndSet(null, subscriber); + + if (!wasFirstSubscriber) { + log.error(() -> "Only one subscriber allowed"); + subscriber.onError(new IllegalStateException("Only one subscriber allowed")); + return; + } + + subscriber.onSubscribe(new AwsCrtResponseBodySubscription(this)); + } + + /** + * Adds a Buffer to the Queue to be published to any Subscribers + * @param buffer The Buffer to be queued. + */ + public void queueBuffer(byte[] buffer) { + Validate.notNull(buffer, "ByteBuffer must not be null"); + + if (isCancelled.get()) { + // Immediately open HttpStream's IO window so it doesn't see any IO Back-pressure. + // AFAIK there's no way to abort an in-progress HttpStream, only free it's memory by calling close() + stream.incrementWindow(buffer.length); + return; + } + + queuedBuffers.add(buffer); + int totalBytesQueued = queuedBytes.addAndGet(buffer.length); + + if (totalBytesQueued > windowSize) { + throw new IllegalStateException("Queued more than Window Size: queued=" + totalBytesQueued + + ", window=" + windowSize); + } + } + + /** + * Function called by Response Body Subscribers to request more Response Body buffers. + * @param n The number of buffers requested. + */ + protected void request(long n) { + Validate.inclusiveBetween(1, Long.MAX_VALUE, n, "request"); + + // Check for overflow of outstanding Requests, and clamp to LONG_MAX. + long outstandingReqs; + if (n > (Long.MAX_VALUE - outstandingRequests.get())) { + outstandingRequests.set(Long.MAX_VALUE); + outstandingReqs = Long.MAX_VALUE; + } else { + outstandingReqs = outstandingRequests.addAndGet(n); + } + + /* + * Since we buffer, in the case where the subscriber came in after the publication has already begun, + * go ahead and flush what we have. + */ + publishToSubscribers(); + + log.trace(() -> "Subscriber Requested more Buffers. Outstanding Requests: " + outstandingReqs); + } + + public void setError(Throwable t) { + log.error(() -> "Error processing Response Body", t); + error.compareAndSet(null, t); + } + + protected void setCancelled() { + isCancelled.set(true); + /** + * subscriberRef must set to null due to ReactiveStream Spec stating references to Subscribers must be deleted + * when onCancel() is called. + */ + subscriberRef.set(null); + } + + private synchronized void releaseNativeResources() { + boolean alreadyReleased = areNativeResourcesReleased.getAndSet(true); + + if (!alreadyReleased) { + stream.close(); + connection.close(); + } + } + + /** + * Called when the final Buffer has been queued and no more data is expected. + */ + public void setQueueComplete() { + log.trace(() -> "Response Body Publisher queue marked as completed."); + queueComplete.set(true); + // We're done with the Native Resources, release them so they can be used by another request. + releaseNativeResources(); + } + + /** + * Completes the Subscription by calling either the .onError() or .onComplete() callbacks exactly once. + */ + protected void completeSubscriptionExactlyOnce() { + boolean alreadyComplete = isSubscriptionComplete.getAndSet(true); + + if (alreadyComplete) { + return; + } + + // Subscriber may have cancelled their subscription, in which case this may be null. + Optional subscriber = Optional.ofNullable(subscriberRef.getAndSet(null)); + + Throwable throwable = error.get(); + + // We're done with the Native Resources, release them so they can be used by another request. + releaseNativeResources(); + + // Complete the Futures + if (throwable != null) { + log.error(() -> "Error before ResponseBodyPublisher could complete: " + throwable.getMessage()); + subscriber.ifPresent(s -> s.onError(throwable)); + responseComplete.completeExceptionally(throwable); + } else { + log.debug(() -> "ResponseBodyPublisher Completed Successfully"); + subscriber.ifPresent(s -> s.onComplete()); + responseComplete.complete(null); + } + } + + /** + * Publishes any queued data to any Subscribers if there is data queued and there is an outstanding Subscriber + * request for more data. Will also call onError() or onComplete() callbacks if needed. + * + * This method MUST be synchronized since it can be called simultaneously from both the Native EventLoop Thread and + * the User Thread. If this method wasn't synchronized, it'd be possible for each thread to dequeue a buffer by + * calling queuedBuffers.poll(), but then have the 2nd thread call subscriber.onNext(buffer) first, resulting in the + * subscriber seeing out-of-order data. To avoid this race condition, this method must be synchronized. + */ + protected synchronized void publishToSubscribers() { + if (error.get() != null) { + completeSubscriptionExactlyOnce(); + return; + } + + if (isSubscriptionComplete.get() || isCancelled.get()) { + log.warn(() -> "Subscription already completed or cancelled, can't publish updates to Subscribers."); + return; + } + + if (mutualRecursionDepth.get() > 0) { + /** + * If our depth is > 0, then we already made a call to publishToSubscribers() further up the stack that + * will continue publishing to subscribers, and this call should return without completing work to avoid + * infinite recursive loop between: "subscription.request() -> subscriber.onNext() -> subscription.request()" + */ + return; + } + + int totalAmountTransferred = 0; + + while (outstandingRequests.get() > 0 && queuedBuffers.size() > 0) { + byte[] buffer = queuedBuffers.poll(); + outstandingRequests.getAndUpdate(DECREMENT_IF_GREATER_THAN_ZERO); + int amount = buffer.length; + publishWithoutMutualRecursion(subscriberRef.get(), ByteBuffer.wrap(buffer)); + totalAmountTransferred += amount; + } + + if (totalAmountTransferred > 0) { + queuedBytes.addAndGet(-totalAmountTransferred); + + // We may have released the Native HttpConnection and HttpStream if they completed before the Subscriber + // has finished reading the data. + if (!areNativeResourcesReleased.get()) { + // Open HttpStream's IO window so HttpStream can keep track of IO back-pressure + stream.incrementWindow(totalAmountTransferred); + } + } + + // Check if Complete, consider no subscriber as a completion. + if (queueComplete.get() && queuedBuffers.size() == 0) { + completeSubscriptionExactlyOnce(); + } + } + + /** + * This method is used to avoid a StackOverflow due to the potential infinite loop between + * "subscription.request() -> subscriber.onNext() -> subscription.request()" calls. We only call subscriber.onNext() + * if the recursion depth is zero, otherwise we return up to the stack frame with depth zero and continue publishing + * from there. + * @param subscriber The Subscriber to publish to. + * @param buffer The buffer to publish to the subscriber. + */ + private synchronized void publishWithoutMutualRecursion(Subscriber subscriber, ByteBuffer buffer) { + try { + /** + * Need to keep track of recursion depth between .onNext() -> .request() calls + */ + int depth = mutualRecursionDepth.getAndIncrement(); + if (depth == 0) { + subscriber.onNext(buffer); + } + } finally { + mutualRecursionDepth.decrementAndGet(); + } + } + +} diff --git a/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtResponseBodySubscription.java b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtResponseBodySubscription.java new file mode 100644 index 000000000000..fe573a901af3 --- /dev/null +++ b/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/AwsCrtResponseBodySubscription.java @@ -0,0 +1,51 @@ +/* + * 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 org.reactivestreams.Subscription; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.utils.Logger; + +/** + * Helper Class that passes through calls from a Subscription to a AwsCrtResponseBodyPublisher + */ +@SdkInternalApi +public class AwsCrtResponseBodySubscription implements Subscription { + private static final Logger log = Logger.loggerFor(AwsCrtResponseBodySubscription.class); + private final AwsCrtResponseBodyPublisher publisher; + + public AwsCrtResponseBodySubscription(AwsCrtResponseBodyPublisher publisher) { + this.publisher = publisher; + } + + @Override + public void request(long n) { + if (n <= 0) { + // Reactive Stream Spec requires us to call onError() callback instead of throwing Exception here. + publisher.setError(new IllegalArgumentException("Request is for <= 0 elements: " + n)); + publisher.publishToSubscribers(); + return; + } + + publisher.request(n); + publisher.publishToSubscribers(); + } + + @Override + public void cancel() { + publisher.setCancelled(); + } +} 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 new file mode 100644 index 000000000000..ee6fa1ef4b59 --- /dev/null +++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtHttpClientSpiVerificationTest.java @@ -0,0 +1,341 @@ +/* + * 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.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 com.github.tomakehurst.wiremock.http.Fault; +import com.github.tomakehurst.wiremock.junit.WireMockRule; +import java.net.URI; +import java.nio.ByteBuffer; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicReference; + +import org.junit.After; +import org.junit.Before; +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.io.EventLoopGroup; +import software.amazon.awssdk.crt.io.HostResolver; +import software.amazon.awssdk.http.SdkHttpFullRequest; +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 + public WireMockRule mockServer = new WireMockRule(wireMockConfig() + .dynamicPort() + .dynamicHttpsPort()); + + private EventLoopGroup eventLoopGroup; + private HostResolver hostResolver; + private SdkAsyncHttpClient client; + + @Before + public void setup() throws Exception { + CrtResource.waitForNoResources(); + + int numThreads = Runtime.getRuntime().availableProcessors(); + eventLoopGroup = new EventLoopGroup(numThreads); + hostResolver = new HostResolver(eventLoopGroup); + + client = AwsCrtAsyncHttpClient.builder() + .eventLoopGroup(eventLoopGroup) + .hostResolver(hostResolver) + .build(); + } + + @After + public void tearDown() { + client.close(); + hostResolver.close(); + eventLoopGroup.close(); + CrtResource.waitForNoResources(); + } + + private byte[] generateRandomBody(int size) { + byte[] randomData = new byte[size]; + new Random().nextBytes(randomData); + return randomData; + } + + @Test + public void signalsErrorViaOnErrorAndFuture() throws InterruptedException, ExecutionException, TimeoutException { + 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(Exception.class); + + } + + @Test + public void callsOnStreamForEmptyResponseContent() throws Exception { + stubFor(any(urlEqualTo("/")).willReturn(aResponse().withStatus(204).withHeader("foo", "bar"))); + + CompletableFuture streamReceived = new CompletableFuture<>(); + final 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<>(); + final AtomicReference response = new AtomicReference<>(null); + Sha256BodySubscriber bodySha256Subscriber = new Sha256BodySubscriber(); + final 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<>(); + final AtomicReference response = new AtomicReference<>(null); + final AtomicReference error = new AtomicReference<>(null); + + Subscriber subscriber = new Subscriber() { + @Override + public void onSubscribe(Subscription subscription) { + subscription.request(Long.MAX_VALUE); + } + + @Override + public void onNext(ByteBuffer byteBuffer) { + } + + @Override + public void onError(Throwable throwable) { + } + + @Override + public void onComplete() { + } + }; + + SdkAsyncHttpResponseHandler handler = new SdkAsyncHttpResponseHandler() { + @Override + public void onHeaders(SdkHttpResponse headers) { + response.compareAndSet(null, headers); + } + @Override + public void onStream(Publisher stream) { + stream.subscribe(subscriber); + 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, 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 SdkHttpFullRequest createRequest(URI endpoint) { + return createRequest(endpoint, "/", null, SdkHttpMethod.GET, emptyMap()); + } + + private SdkHttpFullRequest createRequest(URI endpoint, + String resourcePath, + byte[] body, + SdkHttpMethod method, + Map params) { + + String contentLength = (body == null) ? null : String.valueOf(body.length); + return SdkHttpFullRequest.builder() + .uri(endpoint) + .method(method) + .encodedPath(resourcePath) + .applyMutation(b -> params.forEach(b::putRawQueryParameter)) + .applyMutation(b -> { + b.putHeader("Host", endpoint.getHost()); + if (contentLength != null) { + b.putHeader("Content-Length", contentLength); + } + }).build(); + } + + 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/AwsCrtRequestBodySubscriberReactiveStreamCompatTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtRequestBodySubscriberReactiveStreamCompatTest.java new file mode 100644 index 000000000000..d2b07542c85c --- /dev/null +++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtRequestBodySubscriberReactiveStreamCompatTest.java @@ -0,0 +1,66 @@ +package software.amazon.awssdk.http.crt; + +import java.nio.ByteBuffer; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; +import org.reactivestreams.tck.SubscriberWhiteboxVerification; +import org.reactivestreams.tck.TestEnvironment; +import software.amazon.awssdk.http.crt.internal.AwsCrtRequestBodySubscriber; + +public class AwsCrtRequestBodySubscriberReactiveStreamCompatTest extends SubscriberWhiteboxVerification { + private static final int DEFAULT_STREAM_WINDOW_SIZE = 16 * 1024 * 1024; // 16 MB Total Buffer size + + public AwsCrtRequestBodySubscriberReactiveStreamCompatTest() { + super(new TestEnvironment()); + } + + @Override + public Subscriber createSubscriber(WhiteboxSubscriberProbe probe) { + AwsCrtRequestBodySubscriber actualSubscriber = new AwsCrtRequestBodySubscriber(DEFAULT_STREAM_WINDOW_SIZE); + + // Pass Through calls to AwsCrtRequestBodySubscriber, but also register calls to the whitebox probe + Subscriber passthroughSubscriber = new Subscriber() { + @Override + public void onSubscribe(Subscription s) { + actualSubscriber.onSubscribe(s); + probe.registerOnSubscribe(new SubscriberPuppet() { + + @Override + public void triggerRequest(long elements) { + s.request(elements); + } + + @Override + public void signalCancel() { + s.cancel(); + } + }); + } + + @Override + public void onNext(ByteBuffer byteBuffer) { + actualSubscriber.onNext(byteBuffer); + probe.registerOnNext(byteBuffer); + } + + @Override + public void onError(Throwable t) { + actualSubscriber.onError(t); + probe.registerOnError(t); + } + + @Override + public void onComplete() { + actualSubscriber.onComplete(); + probe.registerOnComplete(); + } + }; + + return passthroughSubscriber; + } + + @Override + public ByteBuffer createElement(int element) { + return ByteBuffer.wrap(Integer.toString(element).getBytes()); + } +} diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtResponseBodyPublisherReactiveStreamCompatTest.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtResponseBodyPublisherReactiveStreamCompatTest.java new file mode 100644 index 000000000000..143f1e7b591b --- /dev/null +++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/AwsCrtResponseBodyPublisherReactiveStreamCompatTest.java @@ -0,0 +1,63 @@ +/* + * 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 org.mockito.Mockito.mock; + +import java.nio.ByteBuffer; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import org.reactivestreams.Publisher; +import org.reactivestreams.tck.PublisherVerification; +import org.reactivestreams.tck.TestEnvironment; +import software.amazon.awssdk.crt.http.HttpClientConnection; +import software.amazon.awssdk.crt.http.HttpStream; +import software.amazon.awssdk.http.crt.internal.AwsCrtResponseBodyPublisher; +import software.amazon.awssdk.utils.Logger; + +public class AwsCrtResponseBodyPublisherReactiveStreamCompatTest extends PublisherVerification { + private static final Logger log = Logger.loggerFor(AwsCrtResponseBodyPublisherReactiveStreamCompatTest.class); + + public AwsCrtResponseBodyPublisherReactiveStreamCompatTest() { + super(new TestEnvironment()); + } + + @Override + public Publisher createPublisher(long elements) { + HttpClientConnection connection = mock(HttpClientConnection.class); + HttpStream stream = mock(HttpStream.class); + AwsCrtResponseBodyPublisher bodyPublisher = new AwsCrtResponseBodyPublisher(connection, stream, new CompletableFuture<>(), Integer.MAX_VALUE); + + for (long i = 0; i < elements; i++) { + bodyPublisher.queueBuffer(UUID.randomUUID().toString().getBytes()); + } + + bodyPublisher.setQueueComplete(); + return bodyPublisher; + } + + // Some tests try to create INT_MAX elements, which causes OutOfMemory Exceptions. Lower the max allowed number of + // queued buffers to 1024. + @Override + public long maxElementsFromPublisher() { + return 1024; + } + + @Override + public Publisher createFailedPublisher() { + return null; + } +} diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/EmptyPublisher.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/EmptyPublisher.java new file mode 100644 index 000000000000..1e85fc43cda6 --- /dev/null +++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/EmptyPublisher.java @@ -0,0 +1,45 @@ +package software.amazon.awssdk.http.crt; + +import java.nio.ByteBuffer; +import java.util.Optional; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; +import software.amazon.awssdk.http.async.SdkHttpContentPublisher; + +public class EmptyPublisher implements SdkHttpContentPublisher { + @Override + public void subscribe(Subscriber subscriber) { + subscriber.onSubscribe(new EmptySubscription(subscriber)); + } + + @Override + public Optional contentLength() { + return Optional.of(0L); + } + + private static class EmptySubscription implements Subscription { + private final Subscriber subscriber; + private volatile boolean done; + + EmptySubscription(Subscriber subscriber) { + this.subscriber = subscriber; + } + + @Override + public void request(long l) { + if (!done) { + done = true; + if (l <= 0) { + this.subscriber.onError(new IllegalArgumentException("Demand must be positive")); + } else { + this.subscriber.onComplete(); + } + } + } + + @Override + public void cancel() { + done = true; + } + } +} diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/SdkTestHttpContentPublisher.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/SdkTestHttpContentPublisher.java new file mode 100644 index 000000000000..3ad5f08ac0c0 --- /dev/null +++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/SdkTestHttpContentPublisher.java @@ -0,0 +1,56 @@ +package software.amazon.awssdk.http.crt; + +import java.nio.ByteBuffer; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; +import software.amazon.awssdk.http.async.SdkHttpContentPublisher; + +public class SdkTestHttpContentPublisher implements SdkHttpContentPublisher { + private final byte[] body; + private final AtomicReference> subscriber = new AtomicReference<>(null); + private final AtomicBoolean complete = new AtomicBoolean(false); + + public SdkTestHttpContentPublisher(byte[] body) { + this.body = body; + } + + @Override + public void subscribe(Subscriber s) { + boolean wasFirstSubscriber = subscriber.compareAndSet(null, s); + + SdkTestHttpContentPublisher publisher = this; + + if (wasFirstSubscriber) { + s.onSubscribe(new Subscription() { + @Override + public void request(long n) { + publisher.request(n); + } + + @Override + public void cancel() { + // Do nothing + } + }); + } else { + s.onError(new RuntimeException("Only allow one subscriber")); + } + } + + protected void request(long n) { + // Send the whole body if they request >0 ByteBuffers + if (n > 0 && !complete.get()) { + complete.set(true); + subscriber.get().onNext(ByteBuffer.wrap(body)); + subscriber.get().onComplete(); + } + } + + @Override + public Optional contentLength() { + return Optional.of((long)body.length); + } +} diff --git a/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/Sha256BodySubscriber.java b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/Sha256BodySubscriber.java new file mode 100644 index 000000000000..508deffcb199 --- /dev/null +++ b/http-clients/aws-crt-client/src/test/java/software/amazon/awssdk/http/crt/Sha256BodySubscriber.java @@ -0,0 +1,44 @@ +package software.amazon.awssdk.http.crt; + +import static org.apache.commons.codec.binary.Hex.encodeHexString; + +import java.nio.ByteBuffer; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.concurrent.CompletableFuture; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +public class Sha256BodySubscriber implements Subscriber { + private MessageDigest digest; + private CompletableFuture future; + + public Sha256BodySubscriber() throws NoSuchAlgorithmException { + digest = MessageDigest.getInstance("SHA-256"); + future = new CompletableFuture<>(); + } + + @Override + public void onSubscribe(Subscription s) { + s.request(Long.MAX_VALUE); + } + + @Override + public void onNext(ByteBuffer byteBuffer) { + digest.update(byteBuffer); + } + + @Override + public void onError(Throwable t) { + future.completeExceptionally(t); + } + + @Override + public void onComplete() { + future.complete(encodeHexString(digest.digest()).toUpperCase()); + } + + public CompletableFuture getFuture() { + return future; + } +} diff --git a/http-clients/netty-nio-client/pom.xml b/http-clients/netty-nio-client/pom.xml index 795d25b1655e..c792d75d8d5a 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.11.6 + 2.11.7-SNAPSHOT 4.0.0 diff --git a/http-clients/pom.xml b/http-clients/pom.xml index 49db92c581a8..4cb0c52247e9 100644 --- a/http-clients/pom.xml +++ b/http-clients/pom.xml @@ -21,7 +21,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 @@ -31,6 +31,7 @@ apache-client + aws-crt-client netty-nio-client url-connection-client diff --git a/http-clients/url-connection-client/pom.xml b/http-clients/url-connection-client/pom.xml index de06a876ba3f..ed004521dfd4 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.11.6 + 2.11.7-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index a8f76ad02026..5c5805b9d48c 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 4.0.0 software.amazon.awssdk aws-sdk-java-pom - 2.11.6 + 2.11.7-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 2d948e6912d3..594905f6f85e 100644 --- a/release-scripts/pom.xml +++ b/release-scripts/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.11.6 + 2.11.7-SNAPSHOT ../pom.xml release-scripts diff --git a/services-custom/dynamodb-enhanced/pom.xml b/services-custom/dynamodb-enhanced/pom.xml index f7e736ca198d..0d44568ba3d1 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.11.6 + 2.11.7-SNAPSHOT dynamodb-enhanced ${awsjavasdk.version}-PREVIEW diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/BeanTableSchema.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/BeanTableSchema.java index a19ce1ba5412..02f1ac85237e 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/BeanTableSchema.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/BeanTableSchema.java @@ -23,6 +23,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; @@ -230,29 +231,56 @@ private static Optional converterProviderAnnotation( Optional.empty(); } - @SuppressWarnings("unchecked") private static StaticAttribute.Builder staticAttributeBuilder(PropertyDescriptor propertyDescriptor, Class beanClass) { Type propertyType = propertyDescriptor.getReadMethod().getGenericReturnType(); - EnhancedType propertyTypeToken = null; + EnhancedType propertyTypeToken = convertTypeToEnhancedType(propertyType); + return StaticAttribute.builder(beanClass, propertyTypeToken) + .name(attributeNameForProperty(propertyDescriptor)) + .getter(getterForProperty(propertyDescriptor, beanClass)) + .setter(setterForProperty(propertyDescriptor, beanClass)); + } - if (propertyType instanceof Class) { - Class clazz = (Class) propertyType; - if (clazz.getAnnotation(DynamoDbBean.class) != null) { - propertyTypeToken = EnhancedType.documentOf((Class) clazz, - (TableSchema) createStaticTableSchema(clazz)); + /** + * Converts a {@link Type} to an {@link EnhancedType}. Usually {@link EnhancedType#of} is capable of doing this all + * by itself, but for the BeanTableSchema we want to detect if a parameterized class is being passed without a + * converter that is actually a {@link DynamoDbBean} in which case we want to capture its schema and add it to the + * EnhancedType. Unfortunately this means we have to duplicate some of the recursive Type parsing that + * EnhancedClient otherwise does all by itself. + */ + @SuppressWarnings("unchecked") + private static EnhancedType convertTypeToEnhancedType(Type type) { + Class clazz = null; + + if (type instanceof ParameterizedType) { + ParameterizedType parameterizedType = (ParameterizedType) type; + Type rawType = parameterizedType.getRawType(); + + if (List.class.equals(rawType)) { + return EnhancedType.listOf(convertTypeToEnhancedType(parameterizedType.getActualTypeArguments()[0])); + } + + if (Map.class.equals(rawType)) { + return EnhancedType.mapOf(EnhancedType.of(parameterizedType.getActualTypeArguments()[0]), + convertTypeToEnhancedType(parameterizedType.getActualTypeArguments()[1])); } + + if (rawType instanceof Class) { + clazz = (Class) rawType; + } + } else if (type instanceof Class) { + clazz = (Class) type; } - if (propertyTypeToken == null) { - propertyTypeToken = EnhancedType.of(propertyDescriptor.getReadMethod().getGenericReturnType()); + if (clazz != null) { + if (clazz.getAnnotation(DynamoDbBean.class) != null) { + return EnhancedType.documentOf((Class) clazz, + (TableSchema) createStaticTableSchema(clazz)); + } } - return StaticAttribute.builder(beanClass, propertyTypeToken) - .name(attributeNameForProperty(propertyDescriptor)) - .getter(getterForProperty(propertyDescriptor, beanClass)) - .setter(setterForProperty(propertyDescriptor, beanClass)); + return EnhancedType.of(type); } private static Optional attributeConverterAnnotation(PropertyDescriptor propertyDescriptor) { diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/BeanTableSchemaTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/BeanTableSchemaTest.java index 848426a52fbf..6d361f72e4ba 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/BeanTableSchemaTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/BeanTableSchemaTest.java @@ -54,6 +54,8 @@ import software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans.InvalidBean; import software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans.ListBean; import software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans.MapBean; +import software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans.ParameterizedAbstractBean; +import software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans.ParameterizedDocumentBean; import software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans.PrimitiveTypesBean; import software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans.RemappedAttributeBean; import software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans.SecondaryIndexBean; @@ -180,13 +182,156 @@ public void documentBean_correctlyMapsAttributes() { .m(singletonMap("attribute2", stringValue("two"))) .build(); - Map itemMap = beanTableSchema.itemToMap(documentBean, false); + Map itemMap = beanTableSchema.itemToMap(documentBean, true); assertThat(itemMap.size(), is(3)); assertThat(itemMap, hasEntry("id", stringValue("id-value"))); assertThat(itemMap, hasEntry("attribute1", stringValue("one"))); assertThat(itemMap, hasEntry("abstractBean", expectedDocument)); } + @Test + public void documentBean_list_correctlyMapsAttributes() { + BeanTableSchema beanTableSchema = BeanTableSchema.create(DocumentBean.class); + AbstractBean abstractBean1 = new AbstractBean(); + abstractBean1.setAttribute2("two"); + AbstractBean abstractBean2 = new AbstractBean(); + abstractBean2.setAttribute2("three"); + DocumentBean documentBean = new DocumentBean(); + documentBean.setId("id-value"); + documentBean.setAttribute1("one"); + documentBean.setAbstractBeanList(Arrays.asList(abstractBean1, abstractBean2)); + + AttributeValue expectedDocument1 = AttributeValue.builder() + .m(singletonMap("attribute2", stringValue("two"))) + .build(); + AttributeValue expectedDocument2 = AttributeValue.builder() + .m(singletonMap("attribute2", stringValue("three"))) + .build(); + AttributeValue expectedList = AttributeValue.builder().l(expectedDocument1, expectedDocument2).build(); + + Map itemMap = beanTableSchema.itemToMap(documentBean, true); + assertThat(itemMap.size(), is(3)); + assertThat(itemMap, hasEntry("id", stringValue("id-value"))); + assertThat(itemMap, hasEntry("attribute1", stringValue("one"))); + assertThat(itemMap, hasEntry("abstractBeanList", expectedList)); + } + + @Test + public void documentBean_map_correctlyMapsAttributes() { + BeanTableSchema beanTableSchema = BeanTableSchema.create(DocumentBean.class); + AbstractBean abstractBean1 = new AbstractBean(); + abstractBean1.setAttribute2("two"); + AbstractBean abstractBean2 = new AbstractBean(); + abstractBean2.setAttribute2("three"); + DocumentBean documentBean = new DocumentBean(); + documentBean.setId("id-value"); + documentBean.setAttribute1("one"); + + Map abstractBeanMap = new HashMap<>(); + abstractBeanMap.put("key1", abstractBean1); + abstractBeanMap.put("key2", abstractBean2); + documentBean.setAbstractBeanMap(abstractBeanMap); + + AttributeValue expectedDocument1 = AttributeValue.builder() + .m(singletonMap("attribute2", stringValue("two"))) + .build(); + AttributeValue expectedDocument2 = AttributeValue.builder() + .m(singletonMap("attribute2", stringValue("three"))) + .build(); + Map expectedAttributeValueMap = new HashMap<>(); + expectedAttributeValueMap.put("key1", expectedDocument1); + expectedAttributeValueMap.put("key2", expectedDocument2); + AttributeValue expectedMap = AttributeValue.builder().m(expectedAttributeValueMap).build(); + + Map itemMap = beanTableSchema.itemToMap(documentBean, true); + assertThat(itemMap.size(), is(3)); + assertThat(itemMap, hasEntry("id", stringValue("id-value"))); + assertThat(itemMap, hasEntry("attribute1", stringValue("one"))); + assertThat(itemMap, hasEntry("abstractBeanMap", expectedMap)); + } + + @Test + public void parameterizedDocumentBean_correctlyMapsAttributes() { + BeanTableSchema beanTableSchema = BeanTableSchema.create(ParameterizedDocumentBean.class); + ParameterizedAbstractBean abstractBean = new ParameterizedAbstractBean<>(); + abstractBean.setAttribute2("two"); + ParameterizedDocumentBean documentBean = new ParameterizedDocumentBean(); + documentBean.setId("id-value"); + documentBean.setAttribute1("one"); + documentBean.setAbstractBean(abstractBean); + + AttributeValue expectedDocument = AttributeValue.builder() + .m(singletonMap("attribute2", stringValue("two"))) + .build(); + + Map itemMap = beanTableSchema.itemToMap(documentBean, true); + assertThat(itemMap.size(), is(3)); + assertThat(itemMap, hasEntry("id", stringValue("id-value"))); + assertThat(itemMap, hasEntry("attribute1", stringValue("one"))); + assertThat(itemMap, hasEntry("abstractBean", expectedDocument)); + } + + @Test + public void parameterizedDocumentBean_list_correctlyMapsAttributes() { + BeanTableSchema beanTableSchema = BeanTableSchema.create(ParameterizedDocumentBean.class); + ParameterizedAbstractBean abstractBean1 = new ParameterizedAbstractBean<>(); + abstractBean1.setAttribute2("two"); + ParameterizedAbstractBean abstractBean2 = new ParameterizedAbstractBean<>(); + abstractBean2.setAttribute2("three"); + ParameterizedDocumentBean documentBean = new ParameterizedDocumentBean(); + documentBean.setId("id-value"); + documentBean.setAttribute1("one"); + documentBean.setAbstractBeanList(Arrays.asList(abstractBean1, abstractBean2)); + + AttributeValue expectedDocument1 = AttributeValue.builder() + .m(singletonMap("attribute2", stringValue("two"))) + .build(); + AttributeValue expectedDocument2 = AttributeValue.builder() + .m(singletonMap("attribute2", stringValue("three"))) + .build(); + AttributeValue expectedList = AttributeValue.builder().l(expectedDocument1, expectedDocument2).build(); + + Map itemMap = beanTableSchema.itemToMap(documentBean, true); + assertThat(itemMap.size(), is(3)); + assertThat(itemMap, hasEntry("id", stringValue("id-value"))); + assertThat(itemMap, hasEntry("attribute1", stringValue("one"))); + assertThat(itemMap, hasEntry("abstractBeanList", expectedList)); + } + + @Test + public void parameterizedDocumentBean_map_correctlyMapsAttributes() { + BeanTableSchema beanTableSchema = BeanTableSchema.create(ParameterizedDocumentBean.class); + ParameterizedAbstractBean abstractBean1 = new ParameterizedAbstractBean<>(); + abstractBean1.setAttribute2("two"); + ParameterizedAbstractBean abstractBean2 = new ParameterizedAbstractBean<>(); + abstractBean2.setAttribute2("three"); + ParameterizedDocumentBean documentBean = new ParameterizedDocumentBean(); + documentBean.setId("id-value"); + documentBean.setAttribute1("one"); + + Map> abstractBeanMap = new HashMap<>(); + abstractBeanMap.put("key1", abstractBean1); + abstractBeanMap.put("key2", abstractBean2); + documentBean.setAbstractBeanMap(abstractBeanMap); + + AttributeValue expectedDocument1 = AttributeValue.builder() + .m(singletonMap("attribute2", stringValue("two"))) + .build(); + AttributeValue expectedDocument2 = AttributeValue.builder() + .m(singletonMap("attribute2", stringValue("three"))) + .build(); + Map expectedAttributeValueMap = new HashMap<>(); + expectedAttributeValueMap.put("key1", expectedDocument1); + expectedAttributeValueMap.put("key2", expectedDocument2); + AttributeValue expectedMap = AttributeValue.builder().m(expectedAttributeValueMap).build(); + + Map itemMap = beanTableSchema.itemToMap(documentBean, true); + assertThat(itemMap.size(), is(3)); + assertThat(itemMap, hasEntry("id", stringValue("id-value"))); + assertThat(itemMap, hasEntry("attribute1", stringValue("one"))); + assertThat(itemMap, hasEntry("abstractBeanMap", expectedMap)); + } + @Test public void extendedBean_correctlyExtendsAttributes() { BeanTableSchema beanTableSchema = BeanTableSchema.create(ExtendedBean.class); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/DocumentBean.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/DocumentBean.java index 1bf2de25771c..344323435b7f 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/DocumentBean.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/DocumentBean.java @@ -15,6 +15,8 @@ package software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans; +import java.util.List; +import java.util.Map; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey; @@ -23,6 +25,8 @@ public class DocumentBean { private String id; private String attribute1; private AbstractBean abstractBean; + private List abstractBeanList; + private Map abstractBeanMap; @DynamoDbPartitionKey public String getId() { @@ -45,4 +49,20 @@ public AbstractBean getAbstractBean() { public void setAbstractBean(AbstractBean abstractBean) { this.abstractBean = abstractBean; } + + public List getAbstractBeanList() { + return abstractBeanList; + } + + public void setAbstractBeanList(List abstractBeanList) { + this.abstractBeanList = abstractBeanList; + } + + public Map getAbstractBeanMap() { + return abstractBeanMap; + } + + public void setAbstractBeanMap(Map abstractBeanMap) { + this.abstractBeanMap = abstractBeanMap; + } } diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/ParameterizedAbstractBean.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/ParameterizedAbstractBean.java new file mode 100644 index 000000000000..7fc7b22fa0b3 --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/ParameterizedAbstractBean.java @@ -0,0 +1,30 @@ +/* + * 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.enhanced.dynamodb.mapper.testbeans; + +import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean; + +@DynamoDbBean +public class ParameterizedAbstractBean { + private String attribute2; + + public String getAttribute2() { + return attribute2; + } + public void setAttribute2(String attribute2) { + this.attribute2 = attribute2; + } +} diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/ParameterizedDocumentBean.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/ParameterizedDocumentBean.java new file mode 100644 index 000000000000..70ee1f915ae2 --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/testbeans/ParameterizedDocumentBean.java @@ -0,0 +1,68 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.enhanced.dynamodb.mapper.testbeans; + +import java.util.List; +import java.util.Map; +import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean; +import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey; + +@DynamoDbBean +public class ParameterizedDocumentBean { + private String id; + private String attribute1; + private ParameterizedAbstractBean abstractBean; + private List> abstractBeanList; + private Map> abstractBeanMap; + + @DynamoDbPartitionKey + public String getId() { + return this.id; + } + public void setId(String id) { + this.id = id; + } + + public String getAttribute1() { + return attribute1; + } + public void setAttribute1(String attribute1) { + this.attribute1 = attribute1; + } + + public ParameterizedAbstractBean getAbstractBean() { + return abstractBean; + } + public void setAbstractBean(ParameterizedAbstractBean abstractBean) { + this.abstractBean = abstractBean; + } + + public List> getAbstractBeanList() { + return abstractBeanList; + } + + public void setAbstractBeanList(List> abstractBeanList) { + this.abstractBeanList = abstractBeanList; + } + + public Map> getAbstractBeanMap() { + return abstractBeanMap; + } + + public void setAbstractBeanMap(Map> abstractBeanMap) { + this.abstractBeanMap = abstractBeanMap; + } +} diff --git a/services-custom/pom.xml b/services-custom/pom.xml index 9e9985b8886e..6d8c2183dcab 100644 --- a/services-custom/pom.xml +++ b/services-custom/pom.xml @@ -19,7 +19,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.11.6 + 2.11.7-SNAPSHOT services-custom AWS Java SDK :: Custom Services diff --git a/services/accessanalyzer/pom.xml b/services/accessanalyzer/pom.xml index 3d98aa65b6f2..0fdf0c605093 100644 --- a/services/accessanalyzer/pom.xml +++ b/services/accessanalyzer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT accessanalyzer AWS Java SDK :: Services :: AccessAnalyzer diff --git a/services/acm/pom.xml b/services/acm/pom.xml index 3a237c0348b4..f9065739b3b9 100644 --- a/services/acm/pom.xml +++ b/services/acm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT acm AWS Java SDK :: Services :: AWS Certificate Manager diff --git a/services/acmpca/pom.xml b/services/acmpca/pom.xml index a7c19015924f..6483b365e726 100644 --- a/services/acmpca/pom.xml +++ b/services/acmpca/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT acmpca AWS Java SDK :: Services :: ACM PCA diff --git a/services/alexaforbusiness/pom.xml b/services/alexaforbusiness/pom.xml index f66ea82c4020..bb73ac68557b 100644 --- a/services/alexaforbusiness/pom.xml +++ b/services/alexaforbusiness/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 alexaforbusiness diff --git a/services/amplify/pom.xml b/services/amplify/pom.xml index 5a36d6af765a..b8b1fd0d86b3 100644 --- a/services/amplify/pom.xml +++ b/services/amplify/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT amplify AWS Java SDK :: Services :: Amplify diff --git a/services/apigateway/pom.xml b/services/apigateway/pom.xml index 77cadf1e7a65..ad875f46953f 100644 --- a/services/apigateway/pom.xml +++ b/services/apigateway/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT apigateway AWS Java SDK :: Services :: Amazon API Gateway diff --git a/services/apigatewaymanagementapi/pom.xml b/services/apigatewaymanagementapi/pom.xml index a6fcee1814e3..4522bb73a3af 100644 --- a/services/apigatewaymanagementapi/pom.xml +++ b/services/apigatewaymanagementapi/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT apigatewaymanagementapi AWS Java SDK :: Services :: ApiGatewayManagementApi diff --git a/services/apigatewayv2/pom.xml b/services/apigatewayv2/pom.xml index 06ba5dedbb3a..59e70a85ef07 100644 --- a/services/apigatewayv2/pom.xml +++ b/services/apigatewayv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT apigatewayv2 AWS Java SDK :: Services :: ApiGatewayV2 diff --git a/services/appconfig/pom.xml b/services/appconfig/pom.xml index 0f45ffd75ad8..5f028c4bc2fa 100644 --- a/services/appconfig/pom.xml +++ b/services/appconfig/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT appconfig AWS Java SDK :: Services :: AppConfig diff --git a/services/applicationautoscaling/pom.xml b/services/applicationautoscaling/pom.xml index 5ccaad0faa47..36d2f6cd8d5d 100644 --- a/services/applicationautoscaling/pom.xml +++ b/services/applicationautoscaling/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT applicationautoscaling AWS Java SDK :: Services :: AWS Application Auto Scaling diff --git a/services/applicationdiscovery/pom.xml b/services/applicationdiscovery/pom.xml index 7e11b38d2d0b..0674fab2806b 100644 --- a/services/applicationdiscovery/pom.xml +++ b/services/applicationdiscovery/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT applicationdiscovery AWS Java SDK :: Services :: AWS Application Discovery Service diff --git a/services/applicationinsights/pom.xml b/services/applicationinsights/pom.xml index 627a383ae398..a2cde7a57be9 100644 --- a/services/applicationinsights/pom.xml +++ b/services/applicationinsights/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT applicationinsights AWS Java SDK :: Services :: Application Insights diff --git a/services/appmesh/pom.xml b/services/appmesh/pom.xml index be0d13cc1476..5c0265facf58 100644 --- a/services/appmesh/pom.xml +++ b/services/appmesh/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT appmesh AWS Java SDK :: Services :: App Mesh diff --git a/services/appstream/pom.xml b/services/appstream/pom.xml index c9ad5c170ca1..6e14801581da 100644 --- a/services/appstream/pom.xml +++ b/services/appstream/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT appstream AWS Java SDK :: Services :: Amazon AppStream diff --git a/services/appsync/pom.xml b/services/appsync/pom.xml index ce193bba093b..848a2a0035cc 100644 --- a/services/appsync/pom.xml +++ b/services/appsync/pom.xml @@ -21,7 +21,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT appsync diff --git a/services/athena/pom.xml b/services/athena/pom.xml index 3947170a13f7..aa5b03839fd8 100644 --- a/services/athena/pom.xml +++ b/services/athena/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT athena AWS Java SDK :: Services :: Amazon Athena diff --git a/services/autoscaling/pom.xml b/services/autoscaling/pom.xml index 0228dea45fc1..10f056f9c2da 100644 --- a/services/autoscaling/pom.xml +++ b/services/autoscaling/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT autoscaling AWS Java SDK :: Services :: Auto Scaling diff --git a/services/autoscalingplans/pom.xml b/services/autoscalingplans/pom.xml index 38693faf7932..0b4225cf25dd 100644 --- a/services/autoscalingplans/pom.xml +++ b/services/autoscalingplans/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT autoscalingplans AWS Java SDK :: Services :: Auto Scaling Plans diff --git a/services/backup/pom.xml b/services/backup/pom.xml index e106444d337a..bf1944ce0167 100644 --- a/services/backup/pom.xml +++ b/services/backup/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT backup AWS Java SDK :: Services :: Backup diff --git a/services/batch/pom.xml b/services/batch/pom.xml index b98741a8330c..2878c04a5926 100644 --- a/services/batch/pom.xml +++ b/services/batch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT batch AWS Java SDK :: Services :: AWS Batch diff --git a/services/budgets/pom.xml b/services/budgets/pom.xml index d20121461cd2..9ed266d9397e 100644 --- a/services/budgets/pom.xml +++ b/services/budgets/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT budgets AWS Java SDK :: Services :: AWS Budgets diff --git a/services/chime/pom.xml b/services/chime/pom.xml index 9ec32cc69c56..d2904b828c8f 100644 --- a/services/chime/pom.xml +++ b/services/chime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT chime AWS Java SDK :: Services :: Chime diff --git a/services/cloud9/pom.xml b/services/cloud9/pom.xml index 4fd3dee46c2f..d013772fbdb1 100644 --- a/services/cloud9/pom.xml +++ b/services/cloud9/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 cloud9 diff --git a/services/clouddirectory/pom.xml b/services/clouddirectory/pom.xml index a71e2a03d76c..91c667dac901 100644 --- a/services/clouddirectory/pom.xml +++ b/services/clouddirectory/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT clouddirectory AWS Java SDK :: Services :: Amazon CloudDirectory diff --git a/services/cloudformation/pom.xml b/services/cloudformation/pom.xml index cb2dd664bdfd..fcf7ad243e6d 100644 --- a/services/cloudformation/pom.xml +++ b/services/cloudformation/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT cloudformation AWS Java SDK :: Services :: AWS CloudFormation diff --git a/services/cloudfront/pom.xml b/services/cloudfront/pom.xml index ba56df070c29..3b2107395314 100644 --- a/services/cloudfront/pom.xml +++ b/services/cloudfront/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT cloudfront AWS Java SDK :: Services :: Amazon CloudFront diff --git a/services/cloudhsm/pom.xml b/services/cloudhsm/pom.xml index 605080e28002..e02f03a6f2f7 100644 --- a/services/cloudhsm/pom.xml +++ b/services/cloudhsm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT cloudhsm AWS Java SDK :: Services :: AWS CloudHSM diff --git a/services/cloudhsmv2/pom.xml b/services/cloudhsmv2/pom.xml index 8ab915f3ef67..1383493d024a 100644 --- a/services/cloudhsmv2/pom.xml +++ b/services/cloudhsmv2/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 cloudhsmv2 diff --git a/services/cloudsearch/pom.xml b/services/cloudsearch/pom.xml index 403963a3d299..3f76e02b7278 100644 --- a/services/cloudsearch/pom.xml +++ b/services/cloudsearch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT cloudsearch AWS Java SDK :: Services :: Amazon CloudSearch diff --git a/services/cloudsearchdomain/pom.xml b/services/cloudsearchdomain/pom.xml index 2f5e0990b239..18ff04007dbb 100644 --- a/services/cloudsearchdomain/pom.xml +++ b/services/cloudsearchdomain/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT cloudsearchdomain AWS Java SDK :: Services :: Amazon CloudSearch Domain diff --git a/services/cloudtrail/pom.xml b/services/cloudtrail/pom.xml index ec3d7c295501..15ec0c6b3842 100644 --- a/services/cloudtrail/pom.xml +++ b/services/cloudtrail/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT cloudtrail AWS Java SDK :: Services :: AWS CloudTrail diff --git a/services/cloudwatch/pom.xml b/services/cloudwatch/pom.xml index b6df59238cc7..f39e70ede886 100644 --- a/services/cloudwatch/pom.xml +++ b/services/cloudwatch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT cloudwatch AWS Java SDK :: Services :: Amazon CloudWatch diff --git a/services/cloudwatchevents/pom.xml b/services/cloudwatchevents/pom.xml index 0919097e9332..39f415f0c8c0 100644 --- a/services/cloudwatchevents/pom.xml +++ b/services/cloudwatchevents/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT cloudwatchevents AWS Java SDK :: Services :: Amazon CloudWatch Events diff --git a/services/cloudwatchlogs/pom.xml b/services/cloudwatchlogs/pom.xml index a73d5e0ebc5b..9a84fc273013 100644 --- a/services/cloudwatchlogs/pom.xml +++ b/services/cloudwatchlogs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT cloudwatchlogs AWS Java SDK :: Services :: Amazon CloudWatch Logs diff --git a/services/codebuild/pom.xml b/services/codebuild/pom.xml index 794a8023193a..7586b67493b6 100644 --- a/services/codebuild/pom.xml +++ b/services/codebuild/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT codebuild AWS Java SDK :: Services :: AWS Code Build diff --git a/services/codecommit/pom.xml b/services/codecommit/pom.xml index 11d3f396c659..a33d9f3b31c8 100644 --- a/services/codecommit/pom.xml +++ b/services/codecommit/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT codecommit AWS Java SDK :: Services :: AWS CodeCommit diff --git a/services/codedeploy/pom.xml b/services/codedeploy/pom.xml index 5ca8211d8bd4..72a7e65e2470 100644 --- a/services/codedeploy/pom.xml +++ b/services/codedeploy/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT codedeploy AWS Java SDK :: Services :: AWS CodeDeploy diff --git a/services/codeguruprofiler/pom.xml b/services/codeguruprofiler/pom.xml index 3e6950c4d565..2a5bf237f500 100644 --- a/services/codeguruprofiler/pom.xml +++ b/services/codeguruprofiler/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT codeguruprofiler AWS Java SDK :: Services :: CodeGuruProfiler diff --git a/services/codegurureviewer/pom.xml b/services/codegurureviewer/pom.xml index 60dc53494135..0e980c92b36c 100644 --- a/services/codegurureviewer/pom.xml +++ b/services/codegurureviewer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT codegurureviewer AWS Java SDK :: Services :: CodeGuru Reviewer diff --git a/services/codepipeline/pom.xml b/services/codepipeline/pom.xml index c0a48a413d7f..1f253962767d 100644 --- a/services/codepipeline/pom.xml +++ b/services/codepipeline/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT codepipeline AWS Java SDK :: Services :: AWS CodePipeline diff --git a/services/codestar/pom.xml b/services/codestar/pom.xml index e0c4d713e8d5..6a4f7bb48812 100644 --- a/services/codestar/pom.xml +++ b/services/codestar/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT codestar AWS Java SDK :: Services :: AWS CodeStar diff --git a/services/codestarconnections/pom.xml b/services/codestarconnections/pom.xml index c135b22077de..b9eb40b643d5 100644 --- a/services/codestarconnections/pom.xml +++ b/services/codestarconnections/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT codestarconnections AWS Java SDK :: Services :: CodeStar connections diff --git a/services/codestarnotifications/pom.xml b/services/codestarnotifications/pom.xml index 718a1772406b..325e8cc0e5d9 100644 --- a/services/codestarnotifications/pom.xml +++ b/services/codestarnotifications/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT codestarnotifications AWS Java SDK :: Services :: Codestar Notifications diff --git a/services/cognitoidentity/pom.xml b/services/cognitoidentity/pom.xml index 21c57d2b2640..d4d1b9eab766 100644 --- a/services/cognitoidentity/pom.xml +++ b/services/cognitoidentity/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT cognitoidentity AWS Java SDK :: Services :: Amazon Cognito Identity diff --git a/services/cognitoidentityprovider/pom.xml b/services/cognitoidentityprovider/pom.xml index 45dde9ec60f7..acd97538860a 100644 --- a/services/cognitoidentityprovider/pom.xml +++ b/services/cognitoidentityprovider/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT cognitoidentityprovider AWS Java SDK :: Services :: Amazon Cognito Identity Provider Service diff --git a/services/cognitosync/pom.xml b/services/cognitosync/pom.xml index 7f8ba1db5329..fd92a73fb133 100644 --- a/services/cognitosync/pom.xml +++ b/services/cognitosync/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT cognitosync AWS Java SDK :: Services :: Amazon Cognito Sync diff --git a/services/comprehend/pom.xml b/services/comprehend/pom.xml index 33ccff1ae8b3..e860dd576ec8 100644 --- a/services/comprehend/pom.xml +++ b/services/comprehend/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 comprehend diff --git a/services/comprehendmedical/pom.xml b/services/comprehendmedical/pom.xml index e0b6952ea260..59efecbc594d 100644 --- a/services/comprehendmedical/pom.xml +++ b/services/comprehendmedical/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT comprehendmedical AWS Java SDK :: Services :: ComprehendMedical diff --git a/services/computeoptimizer/pom.xml b/services/computeoptimizer/pom.xml index e8ac2fd80284..45629247eafb 100644 --- a/services/computeoptimizer/pom.xml +++ b/services/computeoptimizer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT computeoptimizer AWS Java SDK :: Services :: Compute Optimizer diff --git a/services/config/pom.xml b/services/config/pom.xml index 06af51bb30e2..bbda296f064f 100644 --- a/services/config/pom.xml +++ b/services/config/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT config AWS Java SDK :: Services :: AWS Config diff --git a/services/connect/pom.xml b/services/connect/pom.xml index 302190fc4d50..8ffebdecaa0d 100644 --- a/services/connect/pom.xml +++ b/services/connect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT connect AWS Java SDK :: Services :: Connect diff --git a/services/connectparticipant/pom.xml b/services/connectparticipant/pom.xml index 2c02947f1f48..a246d2fae714 100644 --- a/services/connectparticipant/pom.xml +++ b/services/connectparticipant/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT connectparticipant AWS Java SDK :: Services :: ConnectParticipant diff --git a/services/costandusagereport/pom.xml b/services/costandusagereport/pom.xml index c510a0e40392..e78079b67c2d 100644 --- a/services/costandusagereport/pom.xml +++ b/services/costandusagereport/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT costandusagereport AWS Java SDK :: Services :: AWS Cost and Usage Report diff --git a/services/costexplorer/pom.xml b/services/costexplorer/pom.xml index 3944517d9b3d..121410494704 100644 --- a/services/costexplorer/pom.xml +++ b/services/costexplorer/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 costexplorer diff --git a/services/databasemigration/pom.xml b/services/databasemigration/pom.xml index e2c54871d9f6..bd71cd3c9432 100644 --- a/services/databasemigration/pom.xml +++ b/services/databasemigration/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT databasemigration AWS Java SDK :: Services :: AWS Database Migration Service diff --git a/services/dataexchange/pom.xml b/services/dataexchange/pom.xml index cdcdd888d439..42bbcf0a9f03 100644 --- a/services/dataexchange/pom.xml +++ b/services/dataexchange/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT dataexchange AWS Java SDK :: Services :: DataExchange diff --git a/services/datapipeline/pom.xml b/services/datapipeline/pom.xml index 7e2d637ea7b5..aa70ccc55bbd 100644 --- a/services/datapipeline/pom.xml +++ b/services/datapipeline/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT datapipeline AWS Java SDK :: Services :: AWS Data Pipeline diff --git a/services/datasync/pom.xml b/services/datasync/pom.xml index 40433e4207f7..5be64cc56ca7 100644 --- a/services/datasync/pom.xml +++ b/services/datasync/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT datasync AWS Java SDK :: Services :: DataSync diff --git a/services/dax/pom.xml b/services/dax/pom.xml index 1c457793154c..902b70a569a5 100644 --- a/services/dax/pom.xml +++ b/services/dax/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT dax AWS Java SDK :: Services :: Amazon DynamoDB Accelerator (DAX) diff --git a/services/detective/pom.xml b/services/detective/pom.xml index bbcb7fdaa061..6879aaa68427 100644 --- a/services/detective/pom.xml +++ b/services/detective/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT detective AWS Java SDK :: Services :: Detective diff --git a/services/devicefarm/pom.xml b/services/devicefarm/pom.xml index 5901acb37e74..4f9217a6f765 100644 --- a/services/devicefarm/pom.xml +++ b/services/devicefarm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT devicefarm AWS Java SDK :: Services :: AWS Device Farm diff --git a/services/directconnect/pom.xml b/services/directconnect/pom.xml index e6af448acf9f..7d48e6efe643 100644 --- a/services/directconnect/pom.xml +++ b/services/directconnect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT directconnect AWS Java SDK :: Services :: AWS Direct Connect diff --git a/services/directory/pom.xml b/services/directory/pom.xml index a9b31fb1ff37..8254f90b7b3f 100644 --- a/services/directory/pom.xml +++ b/services/directory/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT directory AWS Java SDK :: Services :: AWS Directory Service diff --git a/services/dlm/pom.xml b/services/dlm/pom.xml index 1b8df3feafad..fe6514e39cfa 100644 --- a/services/dlm/pom.xml +++ b/services/dlm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT dlm AWS Java SDK :: Services :: DLM diff --git a/services/docdb/pom.xml b/services/docdb/pom.xml index 2b84a1e83608..6d1de4b708a6 100644 --- a/services/docdb/pom.xml +++ b/services/docdb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT docdb AWS Java SDK :: Services :: DocDB diff --git a/services/dynamodb/pom.xml b/services/dynamodb/pom.xml index 537e89dc9975..bfd523fda72d 100644 --- a/services/dynamodb/pom.xml +++ b/services/dynamodb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT dynamodb AWS Java SDK :: Services :: Amazon DynamoDB diff --git a/services/ebs/pom.xml b/services/ebs/pom.xml index a4511b483efd..742259785a9b 100644 --- a/services/ebs/pom.xml +++ b/services/ebs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT ebs AWS Java SDK :: Services :: EBS diff --git a/services/ec2/pom.xml b/services/ec2/pom.xml index 7aa72ff5f456..876185d48dea 100644 --- a/services/ec2/pom.xml +++ b/services/ec2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT ec2 AWS Java SDK :: Services :: Amazon EC2 diff --git a/services/ec2instanceconnect/pom.xml b/services/ec2instanceconnect/pom.xml index ed10d29900a9..8a57241e9b12 100644 --- a/services/ec2instanceconnect/pom.xml +++ b/services/ec2instanceconnect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT ec2instanceconnect AWS Java SDK :: Services :: EC2 Instance Connect diff --git a/services/ecr/pom.xml b/services/ecr/pom.xml index c349f4991e3a..15f220ac7e38 100644 --- a/services/ecr/pom.xml +++ b/services/ecr/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT ecr AWS Java SDK :: Services :: Amazon EC2 Container Registry diff --git a/services/ecs/pom.xml b/services/ecs/pom.xml index de1c8d4a9009..f622b8947c0e 100644 --- a/services/ecs/pom.xml +++ b/services/ecs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT ecs AWS Java SDK :: Services :: Amazon EC2 Container Service diff --git a/services/efs/pom.xml b/services/efs/pom.xml index 175e30eb53b5..56bf6aef6f89 100644 --- a/services/efs/pom.xml +++ b/services/efs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT efs AWS Java SDK :: Services :: Amazon Elastic File System diff --git a/services/eks/pom.xml b/services/eks/pom.xml index 33e5b20f2fce..5438459426b1 100644 --- a/services/eks/pom.xml +++ b/services/eks/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT eks AWS Java SDK :: Services :: EKS diff --git a/services/elasticache/pom.xml b/services/elasticache/pom.xml index 6b03991e9b2e..dbd92ac6616e 100644 --- a/services/elasticache/pom.xml +++ b/services/elasticache/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT elasticache AWS Java SDK :: Services :: Amazon ElastiCache diff --git a/services/elasticbeanstalk/pom.xml b/services/elasticbeanstalk/pom.xml index 835b14f28632..bcc2994a1ff7 100644 --- a/services/elasticbeanstalk/pom.xml +++ b/services/elasticbeanstalk/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT elasticbeanstalk AWS Java SDK :: Services :: AWS Elastic Beanstalk diff --git a/services/elasticinference/pom.xml b/services/elasticinference/pom.xml index 3b4c7021d51e..801b97af47f7 100644 --- a/services/elasticinference/pom.xml +++ b/services/elasticinference/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT elasticinference AWS Java SDK :: Services :: Elastic Inference diff --git a/services/elasticloadbalancing/pom.xml b/services/elasticloadbalancing/pom.xml index 4c21b86f3285..607aafa5e828 100644 --- a/services/elasticloadbalancing/pom.xml +++ b/services/elasticloadbalancing/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT elasticloadbalancing AWS Java SDK :: Services :: Elastic Load Balancing diff --git a/services/elasticloadbalancingv2/pom.xml b/services/elasticloadbalancingv2/pom.xml index b0a831d2be98..b92528a35adf 100644 --- a/services/elasticloadbalancingv2/pom.xml +++ b/services/elasticloadbalancingv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT elasticloadbalancingv2 AWS Java SDK :: Services :: Elastic Load Balancing V2 diff --git a/services/elasticsearch/pom.xml b/services/elasticsearch/pom.xml index 26822eb6088e..490c23f67f60 100644 --- a/services/elasticsearch/pom.xml +++ b/services/elasticsearch/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT elasticsearch AWS Java SDK :: Services :: Amazon Elasticsearch Service diff --git a/services/elastictranscoder/pom.xml b/services/elastictranscoder/pom.xml index 623ce1395c4a..c4ca7a39a662 100644 --- a/services/elastictranscoder/pom.xml +++ b/services/elastictranscoder/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT elastictranscoder AWS Java SDK :: Services :: Amazon Elastic Transcoder diff --git a/services/emr/pom.xml b/services/emr/pom.xml index 98848be3e116..b33f723ef539 100644 --- a/services/emr/pom.xml +++ b/services/emr/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT emr AWS Java SDK :: Services :: Amazon EMR diff --git a/services/eventbridge/pom.xml b/services/eventbridge/pom.xml index 56502246ba40..a555204ef7d7 100644 --- a/services/eventbridge/pom.xml +++ b/services/eventbridge/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT eventbridge AWS Java SDK :: Services :: EventBridge diff --git a/services/firehose/pom.xml b/services/firehose/pom.xml index 52a9dcd18da9..043f53f56dc8 100644 --- a/services/firehose/pom.xml +++ b/services/firehose/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT firehose AWS Java SDK :: Services :: Amazon Kinesis Firehose diff --git a/services/fms/pom.xml b/services/fms/pom.xml index 357bb3b3b101..e456d412bb01 100644 --- a/services/fms/pom.xml +++ b/services/fms/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT fms AWS Java SDK :: Services :: FMS diff --git a/services/forecast/pom.xml b/services/forecast/pom.xml index 1f0bfb057a1e..debecbe1aab0 100644 --- a/services/forecast/pom.xml +++ b/services/forecast/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT forecast AWS Java SDK :: Services :: Forecast diff --git a/services/forecastquery/pom.xml b/services/forecastquery/pom.xml index c4ab72971407..49c366c46f15 100644 --- a/services/forecastquery/pom.xml +++ b/services/forecastquery/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT forecastquery AWS Java SDK :: Services :: Forecastquery diff --git a/services/frauddetector/pom.xml b/services/frauddetector/pom.xml index 2f498222a921..21a2495c164e 100644 --- a/services/frauddetector/pom.xml +++ b/services/frauddetector/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT frauddetector AWS Java SDK :: Services :: FraudDetector diff --git a/services/fsx/pom.xml b/services/fsx/pom.xml index 1d15d967b1a1..7c0281b499dc 100644 --- a/services/fsx/pom.xml +++ b/services/fsx/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT fsx AWS Java SDK :: Services :: FSx diff --git a/services/gamelift/pom.xml b/services/gamelift/pom.xml index b6f826f0f7e2..7b36fa813d7f 100644 --- a/services/gamelift/pom.xml +++ b/services/gamelift/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT gamelift AWS Java SDK :: Services :: AWS GameLift diff --git a/services/glacier/pom.xml b/services/glacier/pom.xml index 5701cd7fe7ab..34eaea0fd7bb 100644 --- a/services/glacier/pom.xml +++ b/services/glacier/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT glacier AWS Java SDK :: Services :: Amazon Glacier diff --git a/services/globalaccelerator/pom.xml b/services/globalaccelerator/pom.xml index f3d1f65412f0..34ec3e711255 100644 --- a/services/globalaccelerator/pom.xml +++ b/services/globalaccelerator/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT globalaccelerator AWS Java SDK :: Services :: Global Accelerator diff --git a/services/glue/pom.xml b/services/glue/pom.xml index 32ff11a7d7db..c5c791fbb651 100644 --- a/services/glue/pom.xml +++ b/services/glue/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 glue diff --git a/services/greengrass/pom.xml b/services/greengrass/pom.xml index 160991a93eb8..19743f4b60f8 100644 --- a/services/greengrass/pom.xml +++ b/services/greengrass/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT greengrass AWS Java SDK :: Services :: AWS Greengrass diff --git a/services/groundstation/pom.xml b/services/groundstation/pom.xml index 2af174682015..bf7dfd4294b6 100644 --- a/services/groundstation/pom.xml +++ b/services/groundstation/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT groundstation AWS Java SDK :: Services :: GroundStation diff --git a/services/guardduty/pom.xml b/services/guardduty/pom.xml index 03d71fe0d5e4..ba6a9533b6d0 100644 --- a/services/guardduty/pom.xml +++ b/services/guardduty/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 guardduty diff --git a/services/health/pom.xml b/services/health/pom.xml index c446c3c1108d..4d8cf3c044a1 100644 --- a/services/health/pom.xml +++ b/services/health/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT health AWS Java SDK :: Services :: AWS Health APIs and Notifications diff --git a/services/iam/pom.xml b/services/iam/pom.xml index 6d0e9b1dd44c..229eac2eb99c 100644 --- a/services/iam/pom.xml +++ b/services/iam/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT iam AWS Java SDK :: Services :: AWS IAM diff --git a/services/imagebuilder/pom.xml b/services/imagebuilder/pom.xml index aa0340b36e22..b1da6d2495a0 100644 --- a/services/imagebuilder/pom.xml +++ b/services/imagebuilder/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT imagebuilder AWS Java SDK :: Services :: Imagebuilder diff --git a/services/inspector/pom.xml b/services/inspector/pom.xml index 9c04d19ce4cd..2d1cfc5b6274 100644 --- a/services/inspector/pom.xml +++ b/services/inspector/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT inspector AWS Java SDK :: Services :: Amazon Inspector Service diff --git a/services/iot/pom.xml b/services/iot/pom.xml index 1e0b12c5a591..c0846c83414e 100644 --- a/services/iot/pom.xml +++ b/services/iot/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT iot AWS Java SDK :: Services :: AWS IoT diff --git a/services/iot1clickdevices/pom.xml b/services/iot1clickdevices/pom.xml index a49e4510ac61..dd4b93cd4eb2 100644 --- a/services/iot1clickdevices/pom.xml +++ b/services/iot1clickdevices/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT iot1clickdevices AWS Java SDK :: Services :: IoT 1Click Devices Service diff --git a/services/iot1clickprojects/pom.xml b/services/iot1clickprojects/pom.xml index cd4c461246f8..f9dce5c37e74 100644 --- a/services/iot1clickprojects/pom.xml +++ b/services/iot1clickprojects/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT iot1clickprojects AWS Java SDK :: Services :: IoT 1Click Projects diff --git a/services/iotanalytics/pom.xml b/services/iotanalytics/pom.xml index 2ae2dea0855d..ea2325f18a1f 100644 --- a/services/iotanalytics/pom.xml +++ b/services/iotanalytics/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT iotanalytics AWS Java SDK :: Services :: IoTAnalytics diff --git a/services/iotdataplane/pom.xml b/services/iotdataplane/pom.xml index a015be4f4189..d22f41995f02 100644 --- a/services/iotdataplane/pom.xml +++ b/services/iotdataplane/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT iotdataplane AWS Java SDK :: Services :: AWS IoT Data Plane diff --git a/services/iotevents/pom.xml b/services/iotevents/pom.xml index f0ee31a8c297..2e6560869b40 100644 --- a/services/iotevents/pom.xml +++ b/services/iotevents/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT iotevents AWS Java SDK :: Services :: IoT Events diff --git a/services/ioteventsdata/pom.xml b/services/ioteventsdata/pom.xml index 2c18ad6f6c73..dc6acd3a0019 100644 --- a/services/ioteventsdata/pom.xml +++ b/services/ioteventsdata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT ioteventsdata AWS Java SDK :: Services :: IoT Events Data diff --git a/services/iotjobsdataplane/pom.xml b/services/iotjobsdataplane/pom.xml index bbce7cc09e79..52ab79b568f6 100644 --- a/services/iotjobsdataplane/pom.xml +++ b/services/iotjobsdataplane/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT iotjobsdataplane AWS Java SDK :: Services :: IoT Jobs Data Plane diff --git a/services/iotsecuretunneling/pom.xml b/services/iotsecuretunneling/pom.xml index 640695fdda37..579f614c4c03 100644 --- a/services/iotsecuretunneling/pom.xml +++ b/services/iotsecuretunneling/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT iotsecuretunneling AWS Java SDK :: Services :: IoTSecureTunneling diff --git a/services/iotthingsgraph/pom.xml b/services/iotthingsgraph/pom.xml index 5ceeb6ae0256..5503fb0de492 100644 --- a/services/iotthingsgraph/pom.xml +++ b/services/iotthingsgraph/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT iotthingsgraph AWS Java SDK :: Services :: IoTThingsGraph diff --git a/services/kafka/pom.xml b/services/kafka/pom.xml index dab1492d3848..25fc1ae14c47 100644 --- a/services/kafka/pom.xml +++ b/services/kafka/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT kafka AWS Java SDK :: Services :: Kafka diff --git a/services/kendra/pom.xml b/services/kendra/pom.xml index 8d4e5088fd2d..19812901c5f2 100644 --- a/services/kendra/pom.xml +++ b/services/kendra/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT kendra AWS Java SDK :: Services :: Kendra diff --git a/services/kinesis/pom.xml b/services/kinesis/pom.xml index 8e38380dd6f9..ff7db00eda30 100644 --- a/services/kinesis/pom.xml +++ b/services/kinesis/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT kinesis AWS Java SDK :: Services :: Amazon Kinesis diff --git a/services/kinesisanalytics/pom.xml b/services/kinesisanalytics/pom.xml index 5ff1827a429c..0ad9bea80eec 100644 --- a/services/kinesisanalytics/pom.xml +++ b/services/kinesisanalytics/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT kinesisanalytics AWS Java SDK :: Services :: Amazon Kinesis Analytics diff --git a/services/kinesisanalyticsv2/pom.xml b/services/kinesisanalyticsv2/pom.xml index 5526dee99982..5b4785f2e06e 100644 --- a/services/kinesisanalyticsv2/pom.xml +++ b/services/kinesisanalyticsv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT kinesisanalyticsv2 AWS Java SDK :: Services :: Kinesis Analytics V2 diff --git a/services/kinesisvideo/pom.xml b/services/kinesisvideo/pom.xml index bfc4c6be1b26..d640cb4bb134 100644 --- a/services/kinesisvideo/pom.xml +++ b/services/kinesisvideo/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 kinesisvideo diff --git a/services/kinesisvideoarchivedmedia/pom.xml b/services/kinesisvideoarchivedmedia/pom.xml index 0651a4fa787f..fabdf01d31b2 100644 --- a/services/kinesisvideoarchivedmedia/pom.xml +++ b/services/kinesisvideoarchivedmedia/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT kinesisvideoarchivedmedia AWS Java SDK :: Services :: Kinesis Video Archived Media diff --git a/services/kinesisvideomedia/pom.xml b/services/kinesisvideomedia/pom.xml index 6586bc81c32c..7fc8e4211e1b 100644 --- a/services/kinesisvideomedia/pom.xml +++ b/services/kinesisvideomedia/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT kinesisvideomedia AWS Java SDK :: Services :: Kinesis Video Media diff --git a/services/kinesisvideosignaling/pom.xml b/services/kinesisvideosignaling/pom.xml index 3d4a752af614..5b88956b259c 100644 --- a/services/kinesisvideosignaling/pom.xml +++ b/services/kinesisvideosignaling/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT kinesisvideosignaling AWS Java SDK :: Services :: Kinesis Video Signaling diff --git a/services/kms/pom.xml b/services/kms/pom.xml index d30f16558cec..1a52dc20cef8 100644 --- a/services/kms/pom.xml +++ b/services/kms/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT kms AWS Java SDK :: Services :: AWS KMS diff --git a/services/lakeformation/pom.xml b/services/lakeformation/pom.xml index a1404673e353..5848fc3a2ba7 100644 --- a/services/lakeformation/pom.xml +++ b/services/lakeformation/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT lakeformation AWS Java SDK :: Services :: LakeFormation diff --git a/services/lambda/pom.xml b/services/lambda/pom.xml index 087265c5be14..320dcb9a83df 100644 --- a/services/lambda/pom.xml +++ b/services/lambda/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT lambda AWS Java SDK :: Services :: AWS Lambda diff --git a/services/lexmodelbuilding/pom.xml b/services/lexmodelbuilding/pom.xml index 570ec1eeb45c..7505646f4c25 100644 --- a/services/lexmodelbuilding/pom.xml +++ b/services/lexmodelbuilding/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT lexmodelbuilding AWS Java SDK :: Services :: Amazon Lex Model Building diff --git a/services/lexruntime/pom.xml b/services/lexruntime/pom.xml index 65fe424b5eb6..009c2662cfe9 100644 --- a/services/lexruntime/pom.xml +++ b/services/lexruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT lexruntime AWS Java SDK :: Services :: Amazon Lex Runtime diff --git a/services/licensemanager/pom.xml b/services/licensemanager/pom.xml index ce1adf3c12e4..4a767732e264 100644 --- a/services/licensemanager/pom.xml +++ b/services/licensemanager/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT licensemanager AWS Java SDK :: Services :: License Manager diff --git a/services/lightsail/pom.xml b/services/lightsail/pom.xml index 66618947aad0..90f72c133e9f 100644 --- a/services/lightsail/pom.xml +++ b/services/lightsail/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT lightsail AWS Java SDK :: Services :: Amazon Lightsail diff --git a/services/machinelearning/pom.xml b/services/machinelearning/pom.xml index b64a0f63b102..fbba5cbdbe52 100644 --- a/services/machinelearning/pom.xml +++ b/services/machinelearning/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT machinelearning AWS Java SDK :: Services :: Amazon Machine Learning diff --git a/services/macie/pom.xml b/services/macie/pom.xml index 327cef6c74b4..135f8f45e677 100644 --- a/services/macie/pom.xml +++ b/services/macie/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT macie AWS Java SDK :: Services :: Macie diff --git a/services/managedblockchain/pom.xml b/services/managedblockchain/pom.xml index a99ed7393540..248bb46fc97a 100644 --- a/services/managedblockchain/pom.xml +++ b/services/managedblockchain/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT managedblockchain AWS Java SDK :: Services :: ManagedBlockchain diff --git a/services/marketplacecatalog/pom.xml b/services/marketplacecatalog/pom.xml index 05e38651df70..2415e918505b 100644 --- a/services/marketplacecatalog/pom.xml +++ b/services/marketplacecatalog/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT marketplacecatalog AWS Java SDK :: Services :: Marketplace Catalog diff --git a/services/marketplacecommerceanalytics/pom.xml b/services/marketplacecommerceanalytics/pom.xml index aa8799a6191a..ac23e4d27c50 100644 --- a/services/marketplacecommerceanalytics/pom.xml +++ b/services/marketplacecommerceanalytics/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT marketplacecommerceanalytics AWS Java SDK :: Services :: AWS Marketplace Commerce Analytics diff --git a/services/marketplaceentitlement/pom.xml b/services/marketplaceentitlement/pom.xml index e737e4705bce..f7f065e1afc0 100644 --- a/services/marketplaceentitlement/pom.xml +++ b/services/marketplaceentitlement/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT marketplaceentitlement AWS Java SDK :: Services :: AWS Marketplace Entitlement diff --git a/services/marketplacemetering/pom.xml b/services/marketplacemetering/pom.xml index 29ce1a60c521..1dd70bbb659c 100644 --- a/services/marketplacemetering/pom.xml +++ b/services/marketplacemetering/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT marketplacemetering AWS Java SDK :: Services :: AWS Marketplace Metering Service diff --git a/services/mediaconnect/pom.xml b/services/mediaconnect/pom.xml index 6de0fa72c9c4..23a833b2517a 100644 --- a/services/mediaconnect/pom.xml +++ b/services/mediaconnect/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT mediaconnect AWS Java SDK :: Services :: MediaConnect diff --git a/services/mediaconvert/pom.xml b/services/mediaconvert/pom.xml index 7265a49bcf74..3a38364b51cb 100644 --- a/services/mediaconvert/pom.xml +++ b/services/mediaconvert/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 mediaconvert diff --git a/services/medialive/pom.xml b/services/medialive/pom.xml index 4853a3c0dac5..81d2bb3dfe1f 100644 --- a/services/medialive/pom.xml +++ b/services/medialive/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 medialive diff --git a/services/mediapackage/pom.xml b/services/mediapackage/pom.xml index 83fb0fe6030f..84088666c570 100644 --- a/services/mediapackage/pom.xml +++ b/services/mediapackage/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 mediapackage diff --git a/services/mediapackagevod/pom.xml b/services/mediapackagevod/pom.xml index 2fb97a2d2934..0e603008f97b 100644 --- a/services/mediapackagevod/pom.xml +++ b/services/mediapackagevod/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT mediapackagevod AWS Java SDK :: Services :: MediaPackage Vod diff --git a/services/mediastore/pom.xml b/services/mediastore/pom.xml index ae2efdcfa20b..050948c21818 100644 --- a/services/mediastore/pom.xml +++ b/services/mediastore/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 mediastore diff --git a/services/mediastoredata/pom.xml b/services/mediastoredata/pom.xml index e3d02cb557e3..b1a298553b09 100644 --- a/services/mediastoredata/pom.xml +++ b/services/mediastoredata/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 mediastoredata diff --git a/services/mediatailor/pom.xml b/services/mediatailor/pom.xml index e932f849909b..1adb7f6e3c0a 100644 --- a/services/mediatailor/pom.xml +++ b/services/mediatailor/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT mediatailor AWS Java SDK :: Services :: MediaTailor diff --git a/services/migrationhub/pom.xml b/services/migrationhub/pom.xml index d78a88eea5ae..bdfe75b990a2 100644 --- a/services/migrationhub/pom.xml +++ b/services/migrationhub/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 migrationhub diff --git a/services/migrationhubconfig/pom.xml b/services/migrationhubconfig/pom.xml index c86d8ebc4f6d..f316c553ed64 100644 --- a/services/migrationhubconfig/pom.xml +++ b/services/migrationhubconfig/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT migrationhubconfig AWS Java SDK :: Services :: MigrationHub Config diff --git a/services/mobile/pom.xml b/services/mobile/pom.xml index 4d9e253fd7d4..e462a8e48511 100644 --- a/services/mobile/pom.xml +++ b/services/mobile/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 mobile diff --git a/services/mq/pom.xml b/services/mq/pom.xml index 8e5609e5fdf9..cfd5fd5a7474 100644 --- a/services/mq/pom.xml +++ b/services/mq/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 mq diff --git a/services/mturk/pom.xml b/services/mturk/pom.xml index 2abc18fce065..255af0ce2a22 100644 --- a/services/mturk/pom.xml +++ b/services/mturk/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT mturk AWS Java SDK :: Services :: Amazon Mechanical Turk Requester diff --git a/services/neptune/pom.xml b/services/neptune/pom.xml index 5e2a683d7b74..7954a101fd7e 100644 --- a/services/neptune/pom.xml +++ b/services/neptune/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT neptune AWS Java SDK :: Services :: Neptune diff --git a/services/networkmanager/pom.xml b/services/networkmanager/pom.xml index 1749140f7761..b91696e23087 100644 --- a/services/networkmanager/pom.xml +++ b/services/networkmanager/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT networkmanager AWS Java SDK :: Services :: NetworkManager diff --git a/services/opsworks/pom.xml b/services/opsworks/pom.xml index 4afe0de227e8..1f9cde8c028f 100644 --- a/services/opsworks/pom.xml +++ b/services/opsworks/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT opsworks AWS Java SDK :: Services :: AWS OpsWorks diff --git a/services/opsworkscm/pom.xml b/services/opsworkscm/pom.xml index 08bde460e4a3..f756260ade45 100644 --- a/services/opsworkscm/pom.xml +++ b/services/opsworkscm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT opsworkscm AWS Java SDK :: Services :: AWS OpsWorks for Chef Automate diff --git a/services/organizations/pom.xml b/services/organizations/pom.xml index f93708ba4cc4..e9934f9bf225 100644 --- a/services/organizations/pom.xml +++ b/services/organizations/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT organizations AWS Java SDK :: Services :: AWS Organizations diff --git a/services/outposts/pom.xml b/services/outposts/pom.xml index f0ddb19d4984..b94480797bf0 100644 --- a/services/outposts/pom.xml +++ b/services/outposts/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT outposts AWS Java SDK :: Services :: Outposts diff --git a/services/personalize/pom.xml b/services/personalize/pom.xml index 95f0bce77d28..d0b69f5c3f5a 100644 --- a/services/personalize/pom.xml +++ b/services/personalize/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT personalize AWS Java SDK :: Services :: Personalize diff --git a/services/personalizeevents/pom.xml b/services/personalizeevents/pom.xml index acd9f375c07e..ebc50cdff54d 100644 --- a/services/personalizeevents/pom.xml +++ b/services/personalizeevents/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT personalizeevents AWS Java SDK :: Services :: Personalize Events diff --git a/services/personalizeruntime/pom.xml b/services/personalizeruntime/pom.xml index d2296e04dbc8..1061c8dfcc79 100644 --- a/services/personalizeruntime/pom.xml +++ b/services/personalizeruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT personalizeruntime AWS Java SDK :: Services :: Personalize Runtime diff --git a/services/pi/pom.xml b/services/pi/pom.xml index f19631405157..567ffb98e7df 100644 --- a/services/pi/pom.xml +++ b/services/pi/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT pi AWS Java SDK :: Services :: PI diff --git a/services/pinpoint/pom.xml b/services/pinpoint/pom.xml index 9800ae66d407..91646b602615 100644 --- a/services/pinpoint/pom.xml +++ b/services/pinpoint/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT pinpoint AWS Java SDK :: Services :: Amazon Pinpoint diff --git a/services/pinpointemail/pom.xml b/services/pinpointemail/pom.xml index 8e7b98048593..9dfa78a91c61 100644 --- a/services/pinpointemail/pom.xml +++ b/services/pinpointemail/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT pinpointemail AWS Java SDK :: Services :: Pinpoint Email diff --git a/services/pinpointsmsvoice/pom.xml b/services/pinpointsmsvoice/pom.xml index 579792781555..a0ec8d966ba5 100644 --- a/services/pinpointsmsvoice/pom.xml +++ b/services/pinpointsmsvoice/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT pinpointsmsvoice AWS Java SDK :: Services :: Pinpoint SMS Voice diff --git a/services/polly/pom.xml b/services/polly/pom.xml index ef598c23f00c..1a829ca934a2 100644 --- a/services/polly/pom.xml +++ b/services/polly/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT polly AWS Java SDK :: Services :: Amazon Polly diff --git a/services/pom.xml b/services/pom.xml index 472fa81d392a..792ed77f80a5 100644 --- a/services/pom.xml +++ b/services/pom.xml @@ -19,7 +19,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.11.6 + 2.11.7-SNAPSHOT services AWS Java SDK :: Services diff --git a/services/pricing/pom.xml b/services/pricing/pom.xml index 69723de4d64c..975f7df83b41 100644 --- a/services/pricing/pom.xml +++ b/services/pricing/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 pricing diff --git a/services/qldb/pom.xml b/services/qldb/pom.xml index 192e46edf5d7..73f984b7c363 100644 --- a/services/qldb/pom.xml +++ b/services/qldb/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT qldb AWS Java SDK :: Services :: QLDB diff --git a/services/qldbsession/pom.xml b/services/qldbsession/pom.xml index e556884516ab..c6475616a147 100644 --- a/services/qldbsession/pom.xml +++ b/services/qldbsession/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT qldbsession AWS Java SDK :: Services :: QLDB Session diff --git a/services/quicksight/pom.xml b/services/quicksight/pom.xml index 2dfbcf3bfb7f..2e41f0de18db 100644 --- a/services/quicksight/pom.xml +++ b/services/quicksight/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT quicksight AWS Java SDK :: Services :: QuickSight diff --git a/services/ram/pom.xml b/services/ram/pom.xml index 0cf4f5bb5ecf..c16d558b1557 100644 --- a/services/ram/pom.xml +++ b/services/ram/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT ram AWS Java SDK :: Services :: RAM diff --git a/services/rds/pom.xml b/services/rds/pom.xml index 3ab069b018e1..b656ee50b09c 100644 --- a/services/rds/pom.xml +++ b/services/rds/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT rds AWS Java SDK :: Services :: Amazon RDS diff --git a/services/rdsdata/pom.xml b/services/rdsdata/pom.xml index 400aac080169..bcfc10133269 100644 --- a/services/rdsdata/pom.xml +++ b/services/rdsdata/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT rdsdata AWS Java SDK :: Services :: RDS Data diff --git a/services/redshift/pom.xml b/services/redshift/pom.xml index 83f0c1a787c6..9632889131d9 100644 --- a/services/redshift/pom.xml +++ b/services/redshift/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT redshift AWS Java SDK :: Services :: Amazon Redshift diff --git a/services/rekognition/pom.xml b/services/rekognition/pom.xml index c5675c0d18da..6bcf2c4592c0 100644 --- a/services/rekognition/pom.xml +++ b/services/rekognition/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT rekognition AWS Java SDK :: Services :: Amazon Rekognition diff --git a/services/resourcegroups/pom.xml b/services/resourcegroups/pom.xml index 33e1145a759a..313b856c86c0 100644 --- a/services/resourcegroups/pom.xml +++ b/services/resourcegroups/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 resourcegroups diff --git a/services/resourcegroupstaggingapi/pom.xml b/services/resourcegroupstaggingapi/pom.xml index ae07893565dd..73215c478212 100644 --- a/services/resourcegroupstaggingapi/pom.xml +++ b/services/resourcegroupstaggingapi/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT resourcegroupstaggingapi AWS Java SDK :: Services :: AWS Resource Groups Tagging API diff --git a/services/robomaker/pom.xml b/services/robomaker/pom.xml index da62ab84b1db..5214c8eb7978 100644 --- a/services/robomaker/pom.xml +++ b/services/robomaker/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT robomaker AWS Java SDK :: Services :: RoboMaker diff --git a/services/route53/pom.xml b/services/route53/pom.xml index 2ce583aeadfa..59c2adef69fa 100644 --- a/services/route53/pom.xml +++ b/services/route53/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT route53 AWS Java SDK :: Services :: Amazon Route53 diff --git a/services/route53domains/pom.xml b/services/route53domains/pom.xml index 6576c27bb36b..1d6b8795200e 100644 --- a/services/route53domains/pom.xml +++ b/services/route53domains/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT route53domains AWS Java SDK :: Services :: Amazon Route53 Domains diff --git a/services/route53resolver/pom.xml b/services/route53resolver/pom.xml index 4bd46f397e94..96cb6da6ac99 100644 --- a/services/route53resolver/pom.xml +++ b/services/route53resolver/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT route53resolver AWS Java SDK :: Services :: Route53Resolver diff --git a/services/s3/pom.xml b/services/s3/pom.xml index 1c119acfdb7d..4f4f69e44838 100644 --- a/services/s3/pom.xml +++ b/services/s3/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT s3 AWS Java SDK :: Services :: Amazon S3 diff --git a/services/s3control/pom.xml b/services/s3control/pom.xml index f92c37c3428b..ab0e6ccbbdca 100644 --- a/services/s3control/pom.xml +++ b/services/s3control/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT s3control AWS Java SDK :: Services :: Amazon S3 Control diff --git a/services/sagemaker/pom.xml b/services/sagemaker/pom.xml index cdb88c11a8db..364059a99649 100644 --- a/services/sagemaker/pom.xml +++ b/services/sagemaker/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 sagemaker diff --git a/services/sagemakera2iruntime/pom.xml b/services/sagemakera2iruntime/pom.xml index da3e3e13ca89..cad8e84f8ffe 100644 --- a/services/sagemakera2iruntime/pom.xml +++ b/services/sagemakera2iruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT sagemakera2iruntime AWS Java SDK :: Services :: SageMaker A2I Runtime diff --git a/services/sagemakerruntime/pom.xml b/services/sagemakerruntime/pom.xml index 0b08c949f1a4..cfc976dfe257 100644 --- a/services/sagemakerruntime/pom.xml +++ b/services/sagemakerruntime/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT sagemakerruntime AWS Java SDK :: Services :: SageMaker Runtime diff --git a/services/savingsplans/pom.xml b/services/savingsplans/pom.xml index 8f670ae000ec..9fb96757cf34 100644 --- a/services/savingsplans/pom.xml +++ b/services/savingsplans/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT savingsplans AWS Java SDK :: Services :: Savingsplans diff --git a/services/schemas/pom.xml b/services/schemas/pom.xml index c7221129709f..cb638b6c88f1 100644 --- a/services/schemas/pom.xml +++ b/services/schemas/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT schemas AWS Java SDK :: Services :: Schemas diff --git a/services/secretsmanager/pom.xml b/services/secretsmanager/pom.xml index 777a4f4cf6e8..7f6816dfcb37 100644 --- a/services/secretsmanager/pom.xml +++ b/services/secretsmanager/pom.xml @@ -22,7 +22,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT secretsmanager AWS Java SDK :: Services :: AWS Secrets Manager diff --git a/services/securityhub/pom.xml b/services/securityhub/pom.xml index 6f670f81612a..f59fc19e7f54 100644 --- a/services/securityhub/pom.xml +++ b/services/securityhub/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT securityhub AWS Java SDK :: Services :: SecurityHub diff --git a/services/serverlessapplicationrepository/pom.xml b/services/serverlessapplicationrepository/pom.xml index 6e20527f1745..de5b62b21aa4 100644 --- a/services/serverlessapplicationrepository/pom.xml +++ b/services/serverlessapplicationrepository/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 serverlessapplicationrepository diff --git a/services/servicecatalog/pom.xml b/services/servicecatalog/pom.xml index 749915767c13..9cd179abeea5 100644 --- a/services/servicecatalog/pom.xml +++ b/services/servicecatalog/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT servicecatalog AWS Java SDK :: Services :: AWS Service Catalog diff --git a/services/servicediscovery/pom.xml b/services/servicediscovery/pom.xml index c4248cf79c2f..c9511a06bbbf 100644 --- a/services/servicediscovery/pom.xml +++ b/services/servicediscovery/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 servicediscovery diff --git a/services/servicequotas/pom.xml b/services/servicequotas/pom.xml index b14c5d932f5a..a08e75fabfbe 100644 --- a/services/servicequotas/pom.xml +++ b/services/servicequotas/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT servicequotas AWS Java SDK :: Services :: Service Quotas diff --git a/services/ses/pom.xml b/services/ses/pom.xml index 357dfb038cb6..092b9115def9 100644 --- a/services/ses/pom.xml +++ b/services/ses/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT ses AWS Java SDK :: Services :: Amazon SES diff --git a/services/sesv2/pom.xml b/services/sesv2/pom.xml index d6be95cba94d..66bb56abfc80 100644 --- a/services/sesv2/pom.xml +++ b/services/sesv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT sesv2 AWS Java SDK :: Services :: SESv2 diff --git a/services/sfn/pom.xml b/services/sfn/pom.xml index 8690a604fb1a..2f6b8ea9228e 100644 --- a/services/sfn/pom.xml +++ b/services/sfn/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT sfn AWS Java SDK :: Services :: AWS Step Functions diff --git a/services/shield/pom.xml b/services/shield/pom.xml index 04d1ece8098a..314c01faa664 100644 --- a/services/shield/pom.xml +++ b/services/shield/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT shield AWS Java SDK :: Services :: AWS Shield diff --git a/services/signer/pom.xml b/services/signer/pom.xml index 9a55ef5a6b8b..1996a1cad6f3 100644 --- a/services/signer/pom.xml +++ b/services/signer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT signer AWS Java SDK :: Services :: Signer diff --git a/services/sms/pom.xml b/services/sms/pom.xml index f6ddb751afd6..d7b35ca85196 100644 --- a/services/sms/pom.xml +++ b/services/sms/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT sms AWS Java SDK :: Services :: AWS Server Migration diff --git a/services/snowball/pom.xml b/services/snowball/pom.xml index 32433df69dba..6cf0162bbc1e 100644 --- a/services/snowball/pom.xml +++ b/services/snowball/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT snowball AWS Java SDK :: Services :: Amazon Snowball diff --git a/services/sns/pom.xml b/services/sns/pom.xml index df630d7579b4..c84d3b63f7bc 100644 --- a/services/sns/pom.xml +++ b/services/sns/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT sns AWS Java SDK :: Services :: Amazon SNS diff --git a/services/sqs/pom.xml b/services/sqs/pom.xml index 34a3ef58b3ce..89cb42af213b 100644 --- a/services/sqs/pom.xml +++ b/services/sqs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT sqs AWS Java SDK :: Services :: Amazon SQS diff --git a/services/ssm/pom.xml b/services/ssm/pom.xml index 5c9a094e05f5..89df1a6ed1f6 100644 --- a/services/ssm/pom.xml +++ b/services/ssm/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT ssm AWS Java SDK :: Services :: AWS Simple Systems Management (SSM) diff --git a/services/sso/pom.xml b/services/sso/pom.xml index 4dab9f3b4f6c..fbb3af743ce9 100644 --- a/services/sso/pom.xml +++ b/services/sso/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT sso AWS Java SDK :: Services :: SSO diff --git a/services/ssooidc/pom.xml b/services/ssooidc/pom.xml index f5c3716d645a..3498a1b27e66 100644 --- a/services/ssooidc/pom.xml +++ b/services/ssooidc/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT ssooidc AWS Java SDK :: Services :: SSO OIDC diff --git a/services/storagegateway/pom.xml b/services/storagegateway/pom.xml index 82b2e9e95a8c..1fecf3546b5e 100644 --- a/services/storagegateway/pom.xml +++ b/services/storagegateway/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT storagegateway AWS Java SDK :: Services :: AWS Storage Gateway diff --git a/services/sts/pom.xml b/services/sts/pom.xml index e329176fa408..f6b787edd8b7 100644 --- a/services/sts/pom.xml +++ b/services/sts/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT sts AWS Java SDK :: Services :: AWS STS diff --git a/services/support/pom.xml b/services/support/pom.xml index 4d5e0b60b460..69b6d0c015ca 100644 --- a/services/support/pom.xml +++ b/services/support/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT support AWS Java SDK :: Services :: AWS Support diff --git a/services/swf/pom.xml b/services/swf/pom.xml index 0ae8929e1b70..0ecaba98b050 100644 --- a/services/swf/pom.xml +++ b/services/swf/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT swf AWS Java SDK :: Services :: Amazon SWF diff --git a/services/textract/pom.xml b/services/textract/pom.xml index 8c775684f84c..1be4d4c6c96c 100644 --- a/services/textract/pom.xml +++ b/services/textract/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT textract AWS Java SDK :: Services :: Textract diff --git a/services/transcribe/pom.xml b/services/transcribe/pom.xml index cc012b875883..0bc6cb5de679 100644 --- a/services/transcribe/pom.xml +++ b/services/transcribe/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT transcribe AWS Java SDK :: Services :: Transcribe diff --git a/services/transcribestreaming/pom.xml b/services/transcribestreaming/pom.xml index 4829676504f4..e143c69d2428 100644 --- a/services/transcribestreaming/pom.xml +++ b/services/transcribestreaming/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT transcribestreaming AWS Java SDK :: Services :: AWS Transcribe Streaming diff --git a/services/transfer/pom.xml b/services/transfer/pom.xml index 4370a27a1780..2e7daf458cc5 100644 --- a/services/transfer/pom.xml +++ b/services/transfer/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT transfer AWS Java SDK :: Services :: Transfer diff --git a/services/translate/pom.xml b/services/translate/pom.xml index a8f17134797c..0b36d56b233d 100644 --- a/services/translate/pom.xml +++ b/services/translate/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 translate diff --git a/services/waf/pom.xml b/services/waf/pom.xml index 1239ebcaa5fd..2299ac2f3fff 100644 --- a/services/waf/pom.xml +++ b/services/waf/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT waf AWS Java SDK :: Services :: AWS WAF diff --git a/services/wafv2/pom.xml b/services/wafv2/pom.xml index 8be38bd4552d..9dad6feebdc4 100644 --- a/services/wafv2/pom.xml +++ b/services/wafv2/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT wafv2 AWS Java SDK :: Services :: WAFV2 diff --git a/services/workdocs/pom.xml b/services/workdocs/pom.xml index a91c805e1896..906fa4feb99b 100644 --- a/services/workdocs/pom.xml +++ b/services/workdocs/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT workdocs AWS Java SDK :: Services :: Amazon WorkDocs diff --git a/services/worklink/pom.xml b/services/worklink/pom.xml index 20f34e79eb47..5f8ff9a74daf 100644 --- a/services/worklink/pom.xml +++ b/services/worklink/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT worklink AWS Java SDK :: Services :: WorkLink diff --git a/services/workmail/pom.xml b/services/workmail/pom.xml index 22c32e9efe98..f5f3b5d88e68 100644 --- a/services/workmail/pom.xml +++ b/services/workmail/pom.xml @@ -20,7 +20,7 @@ services software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0 workmail diff --git a/services/workmailmessageflow/pom.xml b/services/workmailmessageflow/pom.xml index 650c7e6e2a6d..f305e5c86643 100644 --- a/services/workmailmessageflow/pom.xml +++ b/services/workmailmessageflow/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT workmailmessageflow AWS Java SDK :: Services :: WorkMailMessageFlow diff --git a/services/workspaces/pom.xml b/services/workspaces/pom.xml index 523f7a039df3..da21714ce48f 100644 --- a/services/workspaces/pom.xml +++ b/services/workspaces/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT workspaces AWS Java SDK :: Services :: Amazon WorkSpaces diff --git a/services/xray/pom.xml b/services/xray/pom.xml index 85d1242ababc..28bde4ad8754 100644 --- a/services/xray/pom.xml +++ b/services/xray/pom.xml @@ -21,7 +21,7 @@ software.amazon.awssdk services - 2.11.6 + 2.11.7-SNAPSHOT xray AWS Java SDK :: Services :: AWS X-Ray diff --git a/test/codegen-generated-classes-test/pom.xml b/test/codegen-generated-classes-test/pom.xml index e0911299fcb6..5425b17f4b18 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.11.6 + 2.11.7-SNAPSHOT ../../pom.xml diff --git a/test/http-client-tests/pom.xml b/test/http-client-tests/pom.xml index 6adb32dd9770..a2418e8b8d4a 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.11.6 + 2.11.7-SNAPSHOT ../../pom.xml http-client-tests diff --git a/test/module-path-tests/pom.xml b/test/module-path-tests/pom.xml index 33d2de97c94f..8dc169c3ff50 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.11.6 + 2.11.7-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/protocol-tests-core/pom.xml b/test/protocol-tests-core/pom.xml index f311f00712b9..b94cf28cba87 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.11.6 + 2.11.7-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/protocol-tests/pom.xml b/test/protocol-tests/pom.xml index 64f99d15f222..51d1d3b03c7f 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.11.6 + 2.11.7-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/sdk-benchmarks/pom.xml b/test/sdk-benchmarks/pom.xml index 475d593b3633..d9ca43c61758 100755 --- a/test/sdk-benchmarks/pom.xml +++ b/test/sdk-benchmarks/pom.xml @@ -19,7 +19,7 @@ software.amazon.awssdk aws-sdk-java-pom - 2.11.6 + 2.11.7-SNAPSHOT ../../pom.xml @@ -201,6 +201,18 @@ org.eclipse.jetty.http2 http2-hpack + + software.amazon.awssdk.crt + aws-crt + 0.5.1 + compile + + + software.amazon.awssdk + aws-crt-client + ${awsjavasdk.version} + compile + 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 aad591c87952..6f815db83983 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 @@ -36,9 +36,14 @@ import software.amazon.awssdk.benchmark.apicall.protocol.XmlProtocolBenchmark; import software.amazon.awssdk.benchmark.coldstart.V2DefaultClientCreationBenchmark; import software.amazon.awssdk.benchmark.coldstart.V2OptimizedClientCreationBenchmark; +import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientDeleteV1MapperComparisonBenchmark; import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientGetOverheadBenchmark; +import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientGetV1MapperComparisonBenchmark; import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientPutOverheadBenchmark; -import software.amazon.awssdk.benchmark.enhanced.dynamodb.V1MapperComparisonBenchmark; +import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientPutV1MapperComparisonBenchmark; +import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientQueryV1MapperComparisonBenchmark; +import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientScanV1MapperComparisonBenchmark; +import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientUpdateV1MapperComparisonBenchmark; import software.amazon.awssdk.utils.Logger; @@ -64,7 +69,12 @@ public class BenchmarkRunner { private static final List MAPPER_BENCHMARKS = Arrays.asList( EnhancedClientGetOverheadBenchmark.class.getSimpleName(), EnhancedClientPutOverheadBenchmark.class.getSimpleName(), - V1MapperComparisonBenchmark.class.getSimpleName() + EnhancedClientGetV1MapperComparisonBenchmark.class.getSimpleName(), + EnhancedClientPutV1MapperComparisonBenchmark.class.getSimpleName(), + EnhancedClientUpdateV1MapperComparisonBenchmark.class.getSimpleName(), + EnhancedClientDeleteV1MapperComparisonBenchmark.class.getSimpleName(), + EnhancedClientScanV1MapperComparisonBenchmark.class.getSimpleName(), + EnhancedClientQueryV1MapperComparisonBenchmark.class.getSimpleName() ); private static final Logger log = Logger.loggerFor(BenchmarkRunner.class); diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/async/AwsCrtClientBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/async/AwsCrtClientBenchmark.java new file mode 100644 index 000000000000..36402b2f61e0 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/async/AwsCrtClientBenchmark.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.benchmark.apicall.httpclient.async; + +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 java.util.Collection; +import java.util.concurrent.CountDownLatch; +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.results.RunResult; +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.crt.io.EventLoopGroup; +import software.amazon.awssdk.crt.io.HostResolver; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient; +import software.amazon.awssdk.services.protocolrestjson.ProtocolRestJsonAsyncClient; + +/** + * Using aws-crt-client to test against local mock https server. + */ +@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 AwsCrtClientBenchmark implements SdkHttpClientBenchmark { + + private MockServer mockServer; + private SdkAsyncHttpClient sdkHttpClient; + private ProtocolRestJsonAsyncClient client; + private EventLoopGroup eventLoopGroup; + private HostResolver hostResolver; + + @Setup(Level.Trial) + public void setup() throws Exception { + mockServer = new MockServer(); + mockServer.start(); + + int numThreads = Runtime.getRuntime().availableProcessors(); + eventLoopGroup = new EventLoopGroup(numThreads); + hostResolver = new HostResolver(eventLoopGroup); + + sdkHttpClient = AwsCrtAsyncHttpClient.builder() + .verifyPeer(false) + .eventLoopGroup(this.eventLoopGroup) + .hostResolver(this.hostResolver) + .build(); + + client = ProtocolRestJsonAsyncClient.builder() + .endpointOverride(mockServer.getHttpsUri()) + .httpClient(sdkHttpClient) + .build(); + + // Making sure the request actually succeeds + client.allTypes().join(); + } + + @TearDown(Level.Trial) + public void tearDown() throws Exception { + mockServer.stop(); + client.close(); + sdkHttpClient.close(); + hostResolver.close(); + eventLoopGroup.close(); + } + + @Override + @Benchmark + @OperationsPerInvocation(CONCURRENT_CALLS) + public void concurrentApiCall(Blackhole blackhole) { + CountDownLatch countDownLatch = new CountDownLatch(CONCURRENT_CALLS); + for (int i = 0; i < CONCURRENT_CALLS; i++) { + countDownUponCompletion(blackhole, client.allTypes(), countDownLatch); + } + + awaitCountdownLatchUninterruptibly(countDownLatch, 10, TimeUnit.SECONDS); + + } + + @Override + @Benchmark + public void sequentialApiCall(Blackhole blackhole) { + CountDownLatch countDownLatch = new CountDownLatch(1); + countDownUponCompletion(blackhole, client.allTypes(), countDownLatch); + awaitCountdownLatchUninterruptibly(countDownLatch, 1, TimeUnit.SECONDS); + } + + public static void main(String... args) throws Exception { + Options opt = new OptionsBuilder() + .include(AwsCrtClientBenchmark.class.getSimpleName()) + .addProfiler(StackProfiler.class) + .build(); + Collection run = new Runner(opt).run(); + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/async/AwsCrtClientNonTlsBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/async/AwsCrtClientNonTlsBenchmark.java new file mode 100644 index 000000000000..87c8c4730848 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/apicall/httpclient/async/AwsCrtClientNonTlsBenchmark.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.benchmark.apicall.httpclient.async; + +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 java.util.Collection; +import java.util.concurrent.CountDownLatch; +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.results.RunResult; +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.crt.io.EventLoopGroup; +import software.amazon.awssdk.crt.io.HostResolver; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient; +import software.amazon.awssdk.services.protocolrestjson.ProtocolRestJsonAsyncClient; + +/** + * Using aws-crt-client to test against local mock https server. + */ +@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 AwsCrtClientNonTlsBenchmark implements SdkHttpClientBenchmark { + + private MockServer mockServer; + private SdkAsyncHttpClient sdkHttpClient; + private ProtocolRestJsonAsyncClient client; + private EventLoopGroup eventLoopGroup; + private HostResolver hostResolver; + + @Setup(Level.Trial) + public void setup() throws Exception { + mockServer = new MockServer(); + mockServer.start(); + + int numThreads = Runtime.getRuntime().availableProcessors(); + eventLoopGroup = new EventLoopGroup(numThreads); + hostResolver = new HostResolver(eventLoopGroup); + + sdkHttpClient = AwsCrtAsyncHttpClient.builder() + .verifyPeer(false) + .eventLoopGroup(eventLoopGroup) + .hostResolver(hostResolver) + .build(); + + client = ProtocolRestJsonAsyncClient.builder() + .endpointOverride(mockServer.getHttpUri()) + .httpClient(sdkHttpClient) + .build(); + + // Making sure the request actually succeeds + client.allTypes().join(); + } + + @TearDown(Level.Trial) + public void tearDown() throws Exception { + mockServer.stop(); + client.close(); + sdkHttpClient.close(); + hostResolver.close(); + eventLoopGroup.close(); + } + + @Override + @Benchmark + @OperationsPerInvocation(CONCURRENT_CALLS) + public void concurrentApiCall(Blackhole blackhole) { + CountDownLatch countDownLatch = new CountDownLatch(CONCURRENT_CALLS); + for (int i = 0; i < CONCURRENT_CALLS; i++) { + countDownUponCompletion(blackhole, client.allTypes(), countDownLatch); + } + + awaitCountdownLatchUninterruptibly(countDownLatch, 10, TimeUnit.SECONDS); + + } + + @Override + @Benchmark + public void sequentialApiCall(Blackhole blackhole) { + CountDownLatch countDownLatch = new CountDownLatch(1); + countDownUponCompletion(blackhole, client.allTypes(), countDownLatch); + awaitCountdownLatchUninterruptibly(countDownLatch, 1, TimeUnit.SECONDS); + } + + public static void main(String... args) throws Exception { + Options opt = new OptionsBuilder() + .include(AwsCrtClientNonTlsBenchmark.class.getSimpleName()) + .addProfiler(StackProfiler.class) + .build(); + Collection run = new Runner(opt).run(); + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientDeleteV1MapperComparisonBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientDeleteV1MapperComparisonBenchmark.java new file mode 100644 index 000000000000..063b78bffd0a --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientDeleteV1MapperComparisonBenchmark.java @@ -0,0 +1,120 @@ +/* + * 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.enhanced.dynamodb; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; +import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient; +import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable; +import software.amazon.awssdk.enhanced.dynamodb.Key; +import software.amazon.awssdk.enhanced.dynamodb.TableSchema; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; + +@BenchmarkMode(Mode.Throughput) +@Warmup(iterations = 5) +@Measurement(iterations = 5) +@Fork(2) +@State(Scope.Benchmark) +public class EnhancedClientDeleteV1MapperComparisonBenchmark { + @Benchmark + public void v2Delete(TestState s) { + s.v2Table.deleteItem(s.key); + } + + @Benchmark + public void v1Delete(TestState s) { + s.v1DdbMapper.delete(s.testItem.v1Key); + } + + private static DynamoDbClient getV2Client(Blackhole bh) { + return new V2TestDynamoDbDeleteItemClient(bh); + } + + private static AmazonDynamoDB getV1Client(Blackhole bh) { + return new V1TestDynamoDbDeleteItemClient(bh); + } + + @State(Scope.Benchmark) + public static class TestState { + @Param({"TINY", "SMALL", "HUGE", "HUGE_FLAT"}) + public TestItem testItem; + + private final Key key = Key.builder().partitionValue("key").build(); + + private DynamoDbTable v2Table; + private DynamoDBMapper v1DdbMapper; + + + @Setup + public void setup(Blackhole bh) { + DynamoDbEnhancedClient v2DdbEnh = DynamoDbEnhancedClient.builder() + .dynamoDbClient(getV2Client(bh)) + .build(); + + v2Table = v2DdbEnh.table(testItem.name(), testItem.schema); + + v1DdbMapper = new DynamoDBMapper(getV1Client(bh)); + } + + public enum TestItem { + TINY( + V2ItemFactory.TINY_BEAN_TABLE_SCHEMA, + new V1ItemFactory.V1TinyBean("hashKey") + ), + + SMALL( + V2ItemFactory.SMALL_BEAN_TABLE_SCHEMA, + new V1ItemFactory.V1SmallBean("hashKey") + ), + + HUGE( + V2ItemFactory.HUGE_BEAN_TABLE_SCHEMA, + new V1ItemFactory.V1HugeBean("hashKey") + + ), + + HUGE_FLAT( + V2ItemFactory.HUGE_BEAN_FLAT_TABLE_SCHEMA, + new V1ItemFactory.V1HugeBeanFlat("hashKey") + ), + ; + + // V2 + private TableSchema schema; + + // V1 + private Object v1Key; + + TestItem(TableSchema schema, + Object v1Key) { + this.schema = schema; + + this.v1Key = v1Key; + } + } + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1MapperComparisonBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientGetV1MapperComparisonBenchmark.java similarity index 80% rename from test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1MapperComparisonBenchmark.java rename to test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientGetV1MapperComparisonBenchmark.java index be9fd3c9f870..12bc62d18454 100644 --- a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1MapperComparisonBenchmark.java +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientGetV1MapperComparisonBenchmark.java @@ -41,7 +41,7 @@ @Measurement(iterations = 5) @Fork(2) @State(Scope.Benchmark) -public class V1MapperComparisonBenchmark { +public class EnhancedClientGetV1MapperComparisonBenchmark { private static final V2ItemFactory V2_ITEM_FACTORY = new V2ItemFactory(); private static final V1ItemFactory V1_ITEM_FACTORY = new V1ItemFactory(); @@ -55,22 +55,12 @@ public Object v1Get(TestState s) { return s.v1DdbMapper.load(s.testItem.v1Key); } - @Benchmark - public void v2Put(TestState s) { - s.v2Table.putItem(s.testItem.v2Bean); - } - - @Benchmark - public void v1Put(TestState s) { - s.v1DdbMapper.save(s.testItem.v1Bean); - } - private static DynamoDbClient getV2Client(Blackhole bh, GetItemResponse getItemResponse) { - return new V2TestDynamoDbClient(bh, getItemResponse); + return new V2TestDynamoDbGetItemClient(bh, getItemResponse); } private static AmazonDynamoDB getV1Client(Blackhole bh, GetItemResult getItemResult) { - return new V1TestDynamoDbClient(bh, getItemResult); + return new V1TestDynamoDbGetItemClient(bh, getItemResult); } @State(Scope.Benchmark) @@ -80,7 +70,7 @@ public static class TestState { private final Key key = Key.builder().partitionValue("key").build(); - private DynamoDbTable v2Table; + private DynamoDbTable v2Table; private DynamoDBMapper v1DdbMapper; @@ -99,68 +89,54 @@ public enum TestItem { TINY( V2ItemFactory.TINY_BEAN_TABLE_SCHEMA, GetItemResponse.builder().item(V2_ITEM_FACTORY.tiny()).build(), - V2_ITEM_FACTORY.tinyBean(), new V1ItemFactory.V1TinyBean("hashKey"), - new GetItemResult().withItem(V1_ITEM_FACTORY.tiny()), - V1_ITEM_FACTORY.v1TinyBean() + new GetItemResult().withItem(V1_ITEM_FACTORY.tiny()) ), SMALL( V2ItemFactory.SMALL_BEAN_TABLE_SCHEMA, GetItemResponse.builder().item(V2_ITEM_FACTORY.small()).build(), - V2_ITEM_FACTORY.smallBean(), new V1ItemFactory.V1SmallBean("hashKey"), - new GetItemResult().withItem(V1_ITEM_FACTORY.small()), - V1_ITEM_FACTORY.v1SmallBean() + new GetItemResult().withItem(V1_ITEM_FACTORY.small()) ), HUGE( V2ItemFactory.HUGE_BEAN_TABLE_SCHEMA, GetItemResponse.builder().item(V2_ITEM_FACTORY.huge()).build(), - V2_ITEM_FACTORY.hugeBean(), new V1ItemFactory.V1HugeBean("hashKey"), - new GetItemResult().withItem(V1_ITEM_FACTORY.huge()), - V1_ITEM_FACTORY.v1hugeBean() + new GetItemResult().withItem(V1_ITEM_FACTORY.huge()) ), HUGE_FLAT( V2ItemFactory.HUGE_BEAN_FLAT_TABLE_SCHEMA, GetItemResponse.builder().item(V2_ITEM_FACTORY.hugeFlat()).build(), - V2_ITEM_FACTORY.hugeBeanFlat(), new V1ItemFactory.V1HugeBeanFlat("hashKey"), - new GetItemResult().withItem(V1_ITEM_FACTORY.hugeFlat()), - V1_ITEM_FACTORY.v1HugeBeanFlat() + new GetItemResult().withItem(V1_ITEM_FACTORY.hugeFlat()) ), ; // V2 - private TableSchema schema; + private TableSchema schema; private GetItemResponse v2Response; - private Object v2Bean; // V1 private Object v1Key; private GetItemResult v1Response; - private Object v1Bean; TestItem(TableSchema schema, GetItemResponse v2Response, - Object v2Bean, Object v1Key, - GetItemResult v1Response, - Object v1Bean) { + GetItemResult v1Response) { this.schema = schema; this.v2Response = v2Response; - this.v2Bean = v2Bean; this.v1Key = v1Key; this.v1Response = v1Response; - this.v1Bean = v1Bean; } } } diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientPutV1MapperComparisonBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientPutV1MapperComparisonBenchmark.java new file mode 100644 index 000000000000..cd233506b282 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientPutV1MapperComparisonBenchmark.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.benchmark.enhanced.dynamodb; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; +import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient; +import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable; +import software.amazon.awssdk.enhanced.dynamodb.TableSchema; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; + +@BenchmarkMode(Mode.Throughput) +@Warmup(iterations = 5) +@Measurement(iterations = 5) +@Fork(2) +@State(Scope.Benchmark) +public class EnhancedClientPutV1MapperComparisonBenchmark { + private static final V2ItemFactory V2_ITEM_FACTORY = new V2ItemFactory(); + private static final V1ItemFactory V1_ITEM_FACTORY = new V1ItemFactory(); + private static final DynamoDBMapperConfig MAPPER_CONFIG = + DynamoDBMapperConfig.builder() + .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.PUT) + .build(); + + @Benchmark + public void v2Put(TestState s) { + s.v2Table.putItem(s.testItem.v2Bean); + } + + @Benchmark + public void v1Put(TestState s) { + s.v1DdbMapper.save(s.testItem.v1Bean); + } + + private static DynamoDbClient getV2Client(Blackhole bh) { + return new V2TestDynamoDbPutItemClient(bh); + } + + private static AmazonDynamoDB getV1Client(Blackhole bh) { + return new V1TestDynamoDbPutItemClient(bh); + } + + @State(Scope.Benchmark) + public static class TestState { + @Param({"TINY", "SMALL", "HUGE", "HUGE_FLAT"}) + public TestItem testItem; + + private DynamoDbTable v2Table; + private DynamoDBMapper v1DdbMapper; + + + @Setup + public void setup(Blackhole bh) { + DynamoDbEnhancedClient v2DdbEnh = DynamoDbEnhancedClient.builder() + .dynamoDbClient(getV2Client(bh)) + .build(); + + v2Table = v2DdbEnh.table(testItem.name(), testItem.schema); + + v1DdbMapper = new DynamoDBMapper(getV1Client(bh), MAPPER_CONFIG); + } + + public enum TestItem { + TINY( + V2ItemFactory.TINY_BEAN_TABLE_SCHEMA, + V2_ITEM_FACTORY.tinyBean(), + + V1_ITEM_FACTORY.v1TinyBean() + ), + + SMALL( + V2ItemFactory.SMALL_BEAN_TABLE_SCHEMA, + V2_ITEM_FACTORY.smallBean(), + + V1_ITEM_FACTORY.v1SmallBean() + ), + + HUGE( + V2ItemFactory.HUGE_BEAN_TABLE_SCHEMA, + V2_ITEM_FACTORY.hugeBean(), + + V1_ITEM_FACTORY.v1hugeBean() + ), + + HUGE_FLAT( + V2ItemFactory.HUGE_BEAN_FLAT_TABLE_SCHEMA, + V2_ITEM_FACTORY.hugeBeanFlat(), + + V1_ITEM_FACTORY.v1HugeBeanFlat() + ), + ; + + // V2 + private TableSchema schema; + private Object v2Bean; + + // V1 + private Object v1Bean; + + TestItem(TableSchema schema, + Object v2Bean, + + Object v1Bean) { + this.schema = schema; + this.v2Bean = v2Bean; + + this.v1Bean = v1Bean; + } + } + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientQueryV1MapperComparisonBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientQueryV1MapperComparisonBenchmark.java new file mode 100644 index 000000000000..b25b560dbdc6 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientQueryV1MapperComparisonBenchmark.java @@ -0,0 +1,175 @@ +/* + * 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.enhanced.dynamodb; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression; +import com.amazonaws.services.dynamodbv2.model.QueryResult; +import java.util.Arrays; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; +import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient; +import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable; +import software.amazon.awssdk.enhanced.dynamodb.Key; +import software.amazon.awssdk.enhanced.dynamodb.TableSchema; +import software.amazon.awssdk.enhanced.dynamodb.model.QueryConditional; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; +import software.amazon.awssdk.services.dynamodb.model.QueryResponse; + +@BenchmarkMode(Mode.Throughput) +@Warmup(iterations = 5) +@Measurement(iterations = 5) +@Fork(2) +@State(Scope.Benchmark) +public class EnhancedClientQueryV1MapperComparisonBenchmark { + private static final V2ItemFactory V2_ITEM_FACTORY = new V2ItemFactory(); + private static final V1ItemFactory V1_ITEM_FACTORY = new V1ItemFactory(); + + @Benchmark + public Object v2Query(TestState s) { + return s.v2Table.query(QueryConditional.keyEqualTo(s.key)).iterator().next(); + } + + @Benchmark + public Object v1Query(TestState s) { + return s.v1DdbMapper.query(s.testItem.getV1BeanClass(), s.testItem.v1QueryExpression).iterator().next(); + } + + private static DynamoDbClient getV2Client(Blackhole bh, QueryResponse queryResponse) { + return new V2TestDynamoDbQueryClient(bh, queryResponse); + } + + private static AmazonDynamoDB getV1Client(Blackhole bh, QueryResult queryResult) { + return new V1TestDynamoDbQueryClient(bh, queryResult); + } + + @State(Scope.Benchmark) + public static class TestState { + @Param({"TINY", "SMALL", "HUGE", "HUGE_FLAT"}) + public TestItem testItem; + + private DynamoDbTable v2Table; + private DynamoDBMapper v1DdbMapper; + + private final Key key = Key.builder().partitionValue("key").build(); + + @Setup + public void setup(Blackhole bh) { + DynamoDbEnhancedClient v2DdbEnh = DynamoDbEnhancedClient.builder() + .dynamoDbClient(getV2Client(bh, testItem.v2Response)) + .build(); + + v2Table = v2DdbEnh.table(testItem.name(), testItem.schema); + + v1DdbMapper = new DynamoDBMapper(getV1Client(bh, testItem.v1Response)); + } + + public enum TestItem { + TINY( + V2ItemFactory.TINY_BEAN_TABLE_SCHEMA, + QueryResponse.builder() + .items(Arrays.asList(V2_ITEM_FACTORY.tiny(), + V2_ITEM_FACTORY.tiny(), + V2_ITEM_FACTORY.tiny())) + .build(), + + V1ItemFactory.V1TinyBean.class, + new DynamoDBQueryExpression().withHashKeyValues(new V1ItemFactory.V1TinyBean("hashKey")), + new QueryResult().withItems( + Arrays.asList(V1_ITEM_FACTORY.tiny(), V1_ITEM_FACTORY.tiny(), V1_ITEM_FACTORY.tiny())) + ), + SMALL( + V2ItemFactory.SMALL_BEAN_TABLE_SCHEMA, + QueryResponse.builder() + .items(Arrays.asList(V2_ITEM_FACTORY.small(), + V2_ITEM_FACTORY.small(), + V2_ITEM_FACTORY.small())) + .build(), + + V1ItemFactory.V1SmallBean.class, + new DynamoDBQueryExpression().withHashKeyValues(new V1ItemFactory.V1SmallBean("hashKey")), + new QueryResult().withItems( + Arrays.asList(V1_ITEM_FACTORY.small(), V1_ITEM_FACTORY.small(), V1_ITEM_FACTORY.small())) + ), + + HUGE( + V2ItemFactory.HUGE_BEAN_TABLE_SCHEMA, + QueryResponse.builder() + .items(Arrays.asList(V2_ITEM_FACTORY.huge(), + V2_ITEM_FACTORY.huge(), + V2_ITEM_FACTORY.huge())) + .build(), + + V1ItemFactory.V1HugeBean.class, + new DynamoDBQueryExpression().withHashKeyValues(new V1ItemFactory.V1HugeBean("hashKey")), + new QueryResult().withItems( + Arrays.asList(V1_ITEM_FACTORY.huge(), V1_ITEM_FACTORY.huge(), V1_ITEM_FACTORY.huge())) + ), + + HUGE_FLAT( + V2ItemFactory.HUGE_BEAN_FLAT_TABLE_SCHEMA, + QueryResponse.builder() + .items(Arrays.asList(V2_ITEM_FACTORY.hugeFlat(), + V2_ITEM_FACTORY.hugeFlat(), + V2_ITEM_FACTORY.hugeFlat())) + .build(), + + V1ItemFactory.V1HugeBeanFlat.class, + new DynamoDBQueryExpression().withHashKeyValues(new V1ItemFactory.V1HugeBeanFlat("hashKey")), + new QueryResult().withItems( + Arrays.asList(V1_ITEM_FACTORY.hugeFlat(), V1_ITEM_FACTORY.hugeFlat(), V1_ITEM_FACTORY.hugeFlat())) + ), + ; + + // V2 + private TableSchema schema; + private QueryResponse v2Response; + + // V1 + private Class v1BeanClass; + private DynamoDBQueryExpression v1QueryExpression; + private QueryResult v1Response; + + TestItem(TableSchema schema, + QueryResponse v2Response, + + Class v1BeanClass, + DynamoDBQueryExpression v1QueryExpression, + QueryResult v1Response) { + this.schema = schema; + this.v2Response = v2Response; + + this.v1BeanClass = v1BeanClass; + this.v1QueryExpression = v1QueryExpression; + this.v1Response = v1Response; + } + + public Class getV1BeanClass() { + return v1BeanClass; + } + } + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientScanV1MapperComparisonBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientScanV1MapperComparisonBenchmark.java new file mode 100644 index 000000000000..f1875255adc2 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientScanV1MapperComparisonBenchmark.java @@ -0,0 +1,166 @@ +/* + * 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.enhanced.dynamodb; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression; +import com.amazonaws.services.dynamodbv2.model.ScanResult; +import java.util.Arrays; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; +import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient; +import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable; +import software.amazon.awssdk.enhanced.dynamodb.TableSchema; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; +import software.amazon.awssdk.services.dynamodb.model.ScanResponse; + +@BenchmarkMode(Mode.Throughput) +@Warmup(iterations = 5) +@Measurement(iterations = 5) +@Fork(2) +@State(Scope.Benchmark) +public class EnhancedClientScanV1MapperComparisonBenchmark { + private static final V2ItemFactory V2_ITEM_FACTORY = new V2ItemFactory(); + private static final V1ItemFactory V1_ITEM_FACTORY = new V1ItemFactory(); + private static final DynamoDBScanExpression V1_SCAN_EXPRESSION = new DynamoDBScanExpression(); + + @Benchmark + public Object v2Scan(TestState s) { + return s.v2Table.scan().iterator().next(); + } + + @Benchmark + public Object v1Scan(TestState s) { + return s.v1DdbMapper.scan(s.testItem.getV1BeanClass(), V1_SCAN_EXPRESSION).iterator().next(); + } + + private static DynamoDbClient getV2Client(Blackhole bh, ScanResponse scanResponse) { + return new V2TestDynamoDbScanClient(bh, scanResponse); + } + + private static AmazonDynamoDB getV1Client(Blackhole bh, ScanResult scanResult) { + return new V1TestDynamoDbScanClient(bh, scanResult); + } + + @State(Scope.Benchmark) + public static class TestState { + @Param({"TINY", "SMALL", "HUGE", "HUGE_FLAT"}) + public TestItem testItem; + + private DynamoDbTable v2Table; + private DynamoDBMapper v1DdbMapper; + + + @Setup + public void setup(Blackhole bh) { + DynamoDbEnhancedClient v2DdbEnh = DynamoDbEnhancedClient.builder() + .dynamoDbClient(getV2Client(bh, testItem.v2Response)) + .build(); + + v2Table = v2DdbEnh.table(testItem.name(), testItem.schema); + + v1DdbMapper = new DynamoDBMapper(getV1Client(bh, testItem.v1Response)); + } + + public enum TestItem { + TINY( + V2ItemFactory.TINY_BEAN_TABLE_SCHEMA, + ScanResponse.builder() + .items(Arrays.asList(V2_ITEM_FACTORY.tiny(), + V2_ITEM_FACTORY.tiny(), + V2_ITEM_FACTORY.tiny())) + .build(), + + V1ItemFactory.V1TinyBean.class, + new ScanResult().withItems( + Arrays.asList(V1_ITEM_FACTORY.tiny(), V1_ITEM_FACTORY.tiny(), V1_ITEM_FACTORY.tiny())) + ), + SMALL( + V2ItemFactory.SMALL_BEAN_TABLE_SCHEMA, + ScanResponse.builder() + .items(Arrays.asList(V2_ITEM_FACTORY.small(), + V2_ITEM_FACTORY.small(), + V2_ITEM_FACTORY.small())) + .build(), + + V1ItemFactory.V1SmallBean.class, + new ScanResult().withItems( + Arrays.asList(V1_ITEM_FACTORY.small(), V1_ITEM_FACTORY.small(), V1_ITEM_FACTORY.small())) + ), + + HUGE( + V2ItemFactory.HUGE_BEAN_TABLE_SCHEMA, + ScanResponse.builder() + .items(Arrays.asList(V2_ITEM_FACTORY.huge(), + V2_ITEM_FACTORY.huge(), + V2_ITEM_FACTORY.huge())) + .build(), + + V1ItemFactory.V1HugeBean.class, + new ScanResult().withItems( + Arrays.asList(V1_ITEM_FACTORY.huge(), V1_ITEM_FACTORY.huge(), V1_ITEM_FACTORY.huge())) + ), + + HUGE_FLAT( + V2ItemFactory.HUGE_BEAN_FLAT_TABLE_SCHEMA, + ScanResponse.builder() + .items(Arrays.asList(V2_ITEM_FACTORY.hugeFlat(), + V2_ITEM_FACTORY.hugeFlat(), + V2_ITEM_FACTORY.hugeFlat())) + .build(), + + V1ItemFactory.V1HugeBeanFlat.class, + new ScanResult().withItems( + Arrays.asList(V1_ITEM_FACTORY.hugeFlat(), V1_ITEM_FACTORY.hugeFlat(), V1_ITEM_FACTORY.hugeFlat())) + ), + ; + + // V2 + private TableSchema schema; + private ScanResponse v2Response; + + // V1 + private Class v1BeanClass; + private ScanResult v1Response; + + TestItem(TableSchema schema, + ScanResponse v2Response, + + Class v1BeanClass, + ScanResult v1Response) { + this.schema = schema; + this.v2Response = v2Response; + + this.v1BeanClass = v1BeanClass; + this.v1Response = v1Response; + } + + public Class getV1BeanClass() { + return v1BeanClass; + } + } + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientUpdateV1MapperComparisonBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientUpdateV1MapperComparisonBenchmark.java new file mode 100644 index 000000000000..a538526b6470 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/EnhancedClientUpdateV1MapperComparisonBenchmark.java @@ -0,0 +1,152 @@ +/* + * 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.enhanced.dynamodb; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig; +import com.amazonaws.services.dynamodbv2.model.UpdateItemResult; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; +import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient; +import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable; +import software.amazon.awssdk.enhanced.dynamodb.TableSchema; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; +import software.amazon.awssdk.services.dynamodb.model.UpdateItemResponse; + +@BenchmarkMode(Mode.Throughput) +@Warmup(iterations = 5) +@Measurement(iterations = 5) +@Fork(2) +@State(Scope.Benchmark) +public class EnhancedClientUpdateV1MapperComparisonBenchmark { + private static final V2ItemFactory V2_ITEM_FACTORY = new V2ItemFactory(); + private static final V1ItemFactory V1_ITEM_FACTORY = new V1ItemFactory(); + private static final DynamoDBMapperConfig MAPPER_CONFIG = + DynamoDBMapperConfig.builder() + .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.UPDATE) + .build(); + + @Benchmark + public void v2Update(TestState s) { + s.v2Table.updateItem(s.testItem.v2Bean); + } + + @Benchmark + public void v1Update(TestState s) { + s.v1DdbMapper.save(s.testItem.v1Bean); + } + + private static DynamoDbClient getV2Client(Blackhole bh, UpdateItemResponse updateItemResponse) { + return new V2TestDynamoDbUpdateItemClient(bh, updateItemResponse); + } + + private static AmazonDynamoDB getV1Client(Blackhole bh, UpdateItemResult updateItemResult) { + return new V1TestDynamoDbUpdateItemClient(bh, updateItemResult); + } + + @State(Scope.Benchmark) + public static class TestState { + @Param({"TINY", "SMALL", "HUGE", "HUGE_FLAT"}) + public TestItem testItem; + + private DynamoDbTable v2Table; + private DynamoDBMapper v1DdbMapper; + + + @Setup + public void setup(Blackhole bh) { + DynamoDbEnhancedClient v2DdbEnh = DynamoDbEnhancedClient.builder() + .dynamoDbClient(getV2Client(bh, testItem.v2UpdateItemResponse)) + .build(); + + v2Table = v2DdbEnh.table(testItem.name(), testItem.schema); + + v1DdbMapper = new DynamoDBMapper(getV1Client(bh, testItem.v1UpdateItemResult), MAPPER_CONFIG); + } + + public enum TestItem { + TINY( + V2ItemFactory.TINY_BEAN_TABLE_SCHEMA, + V2_ITEM_FACTORY.tinyBean(), + UpdateItemResponse.builder().attributes(V2_ITEM_FACTORY.tiny()).build(), + + V1_ITEM_FACTORY.v1TinyBean(), + new UpdateItemResult().withAttributes(V1_ITEM_FACTORY.tiny()) + ), + + SMALL( + V2ItemFactory.SMALL_BEAN_TABLE_SCHEMA, + V2_ITEM_FACTORY.smallBean(), + UpdateItemResponse.builder().attributes(V2_ITEM_FACTORY.small()).build(), + + V1_ITEM_FACTORY.v1SmallBean(), + new UpdateItemResult().withAttributes(V1_ITEM_FACTORY.small()) + ), + + HUGE( + V2ItemFactory.HUGE_BEAN_TABLE_SCHEMA, + V2_ITEM_FACTORY.hugeBean(), + UpdateItemResponse.builder().attributes(V2_ITEM_FACTORY.huge()).build(), + + V1_ITEM_FACTORY.v1hugeBean(), + new UpdateItemResult().withAttributes(V1_ITEM_FACTORY.huge()) + ), + + HUGE_FLAT( + V2ItemFactory.HUGE_BEAN_FLAT_TABLE_SCHEMA, + V2_ITEM_FACTORY.hugeBeanFlat(), + UpdateItemResponse.builder().attributes(V2_ITEM_FACTORY.hugeFlat()).build(), + + V1_ITEM_FACTORY.v1HugeBeanFlat(), + new UpdateItemResult().withAttributes(V1_ITEM_FACTORY.hugeFlat()) + ), + ; + + // V2 + private TableSchema schema; + private Object v2Bean; + private UpdateItemResponse v2UpdateItemResponse; + + // V1 + private Object v1Bean; + private UpdateItemResult v1UpdateItemResult; + + TestItem(TableSchema schema, + Object v2Bean, + UpdateItemResponse v2UpdateItemResponse, + + Object v1Bean, + UpdateItemResult v1UpdateItemResult) { + this.schema = schema; + this.v2Bean = v2Bean; + this.v2UpdateItemResponse = v2UpdateItemResponse; + + this.v1Bean = v1Bean; + this.v1UpdateItemResult = v1UpdateItemResult; + } + } + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbBaseClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbBaseClient.java new file mode 100644 index 000000000000..b3cbb5213b05 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbBaseClient.java @@ -0,0 +1,27 @@ +/* + * 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.enhanced.dynamodb; + +import com.amazonaws.services.dynamodbv2.AbstractAmazonDynamoDB; +import org.openjdk.jmh.infra.Blackhole; + +abstract class V1TestDynamoDbBaseClient extends AbstractAmazonDynamoDB { + protected final Blackhole bh; + + protected V1TestDynamoDbBaseClient(Blackhole bh) { + this.bh = bh; + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbDeleteItemClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbDeleteItemClient.java new file mode 100644 index 000000000000..cafcfdcdff47 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbDeleteItemClient.java @@ -0,0 +1,34 @@ +/* + * 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.enhanced.dynamodb; + +import com.amazonaws.services.dynamodbv2.model.DeleteItemRequest; +import com.amazonaws.services.dynamodbv2.model.DeleteItemResult; +import org.openjdk.jmh.infra.Blackhole; + +public class V1TestDynamoDbDeleteItemClient extends V1TestDynamoDbBaseClient { + private static final DeleteItemResult DELETE_ITEM_RESULT = new DeleteItemResult(); + + public V1TestDynamoDbDeleteItemClient(Blackhole bh) { + super(bh); + } + + @Override + public DeleteItemResult deleteItem(DeleteItemRequest request) { + bh.consume(request); + return DELETE_ITEM_RESULT; + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbGetItemClient.java similarity index 52% rename from test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbClient.java rename to test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbGetItemClient.java index 4b4f5bdc9e78..a2994ae9bb8b 100644 --- a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbClient.java +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbGetItemClient.java @@ -15,41 +15,21 @@ package software.amazon.awssdk.benchmark.enhanced.dynamodb; -import com.amazonaws.services.dynamodbv2.AbstractAmazonDynamoDB; import com.amazonaws.services.dynamodbv2.model.GetItemRequest; import com.amazonaws.services.dynamodbv2.model.GetItemResult; -import com.amazonaws.services.dynamodbv2.model.PutItemRequest; -import com.amazonaws.services.dynamodbv2.model.PutItemResult; -import com.amazonaws.services.dynamodbv2.model.UpdateItemRequest; -import com.amazonaws.services.dynamodbv2.model.UpdateItemResult; import org.openjdk.jmh.infra.Blackhole; -public final class V1TestDynamoDbClient extends AbstractAmazonDynamoDB { - private static final UpdateItemResult UPDATE_ITEM_RESULT = new UpdateItemResult(); - private static final PutItemResult PUT_ITEM_RESULT = new PutItemResult(); - - private final Blackhole bh; +public class V1TestDynamoDbGetItemClient extends V1TestDynamoDbBaseClient { private final GetItemResult getItemResult; - public V1TestDynamoDbClient(Blackhole bh, GetItemResult getItemResult) { - this.bh = bh; + public V1TestDynamoDbGetItemClient(Blackhole bh, GetItemResult getItemResult) { + super(bh); this.getItemResult = getItemResult; } @Override public GetItemResult getItem(GetItemRequest request) { - return getItemResult; - } - - @Override - public UpdateItemResult updateItem(UpdateItemRequest request) { bh.consume(request); - return UPDATE_ITEM_RESULT; - } - - @Override - public PutItemResult putItem(PutItemRequest request) { - bh.consume(request); - return PUT_ITEM_RESULT; + return getItemResult; } } diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbPutItemClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbPutItemClient.java new file mode 100644 index 000000000000..3cc51c551ce3 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbPutItemClient.java @@ -0,0 +1,34 @@ +/* + * 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.enhanced.dynamodb; + +import com.amazonaws.services.dynamodbv2.model.PutItemRequest; +import com.amazonaws.services.dynamodbv2.model.PutItemResult; +import org.openjdk.jmh.infra.Blackhole; + +public class V1TestDynamoDbPutItemClient extends V1TestDynamoDbBaseClient { + private static final PutItemResult PUT_ITEM_RESULT = new PutItemResult(); + + public V1TestDynamoDbPutItemClient(Blackhole bh) { + super(bh); + } + + @Override + public PutItemResult putItem(PutItemRequest request) { + bh.consume(request); + return PUT_ITEM_RESULT; + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbQueryClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbQueryClient.java new file mode 100644 index 000000000000..b64a18edbcd0 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbQueryClient.java @@ -0,0 +1,35 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.benchmark.enhanced.dynamodb; + +import com.amazonaws.services.dynamodbv2.model.QueryRequest; +import com.amazonaws.services.dynamodbv2.model.QueryResult; +import org.openjdk.jmh.infra.Blackhole; + +public class V1TestDynamoDbQueryClient extends V1TestDynamoDbBaseClient { + private final QueryResult queryResult; + + public V1TestDynamoDbQueryClient(Blackhole bh, QueryResult queryResult) { + super(bh); + this.queryResult = queryResult; + } + + @Override + public QueryResult query(QueryRequest request) { + bh.consume(request); + return queryResult; + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbScanClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbScanClient.java new file mode 100644 index 000000000000..c7f4370d8b3e --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbScanClient.java @@ -0,0 +1,35 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.benchmark.enhanced.dynamodb; + +import com.amazonaws.services.dynamodbv2.model.ScanRequest; +import com.amazonaws.services.dynamodbv2.model.ScanResult; +import org.openjdk.jmh.infra.Blackhole; + +public class V1TestDynamoDbScanClient extends V1TestDynamoDbBaseClient { + private final ScanResult scanResult; + + public V1TestDynamoDbScanClient(Blackhole bh, ScanResult scanResult) { + super(bh); + this.scanResult = scanResult; + } + + @Override + public ScanResult scan(ScanRequest request) { + bh.consume(request); + return scanResult; + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbUpdateItemClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbUpdateItemClient.java new file mode 100644 index 000000000000..ded1121b3060 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V1TestDynamoDbUpdateItemClient.java @@ -0,0 +1,35 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.benchmark.enhanced.dynamodb; + +import com.amazonaws.services.dynamodbv2.model.UpdateItemRequest; +import com.amazonaws.services.dynamodbv2.model.UpdateItemResult; +import org.openjdk.jmh.infra.Blackhole; + +public class V1TestDynamoDbUpdateItemClient extends V1TestDynamoDbBaseClient { + private final UpdateItemResult updateItemResult; + + public V1TestDynamoDbUpdateItemClient(Blackhole bh, UpdateItemResult updateItemResult) { + super(bh); + this.updateItemResult = updateItemResult; + } + + @Override + public UpdateItemResult updateItem(UpdateItemRequest request) { + bh.consume(request); + return updateItemResult; + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbBaseClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbBaseClient.java new file mode 100644 index 000000000000..f05ab204f49d --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbBaseClient.java @@ -0,0 +1,36 @@ +/* + * 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.enhanced.dynamodb; + +import org.openjdk.jmh.infra.Blackhole; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; + +abstract class V2TestDynamoDbBaseClient implements DynamoDbClient { + protected final Blackhole bh; + + protected V2TestDynamoDbBaseClient(Blackhole bh) { + this.bh = bh; + } + + @Override + public String serviceName() { + return "DynamoDB"; + } + + @Override + public void close() { + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbDeleteItemClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbDeleteItemClient.java new file mode 100644 index 000000000000..8694e79a5bff --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbDeleteItemClient.java @@ -0,0 +1,34 @@ +/* + * 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.enhanced.dynamodb; + +import org.openjdk.jmh.infra.Blackhole; +import software.amazon.awssdk.services.dynamodb.model.DeleteItemRequest; +import software.amazon.awssdk.services.dynamodb.model.DeleteItemResponse; + +public final class V2TestDynamoDbDeleteItemClient extends V2TestDynamoDbBaseClient { + private static final DeleteItemResponse DELETE_ITEM_RESPONSE = DeleteItemResponse.builder().build(); + + public V2TestDynamoDbDeleteItemClient(Blackhole bh) { + super(bh); + } + + @Override + public DeleteItemResponse deleteItem(DeleteItemRequest deleteItemRequest) { + bh.consume(deleteItemRequest); + return DELETE_ITEM_RESPONSE; + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbGetItemClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbGetItemClient.java new file mode 100644 index 000000000000..2017d876d4e7 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbGetItemClient.java @@ -0,0 +1,35 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.benchmark.enhanced.dynamodb; + +import org.openjdk.jmh.infra.Blackhole; +import software.amazon.awssdk.services.dynamodb.model.GetItemRequest; +import software.amazon.awssdk.services.dynamodb.model.GetItemResponse; + +public final class V2TestDynamoDbGetItemClient extends V2TestDynamoDbBaseClient { + private final GetItemResponse getItemResponse; + + public V2TestDynamoDbGetItemClient(Blackhole bh, GetItemResponse getItemResponse) { + super(bh); + this.getItemResponse = getItemResponse; + } + + @Override + public GetItemResponse getItem(GetItemRequest getItemRequest) { + bh.consume(getItemRequest); + return getItemResponse; + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbPutItemClient.java similarity index 58% rename from test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbClient.java rename to test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbPutItemClient.java index 7f2ecbf056d2..5b2d611f641b 100644 --- a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbClient.java +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbPutItemClient.java @@ -16,25 +16,14 @@ package software.amazon.awssdk.benchmark.enhanced.dynamodb; import org.openjdk.jmh.infra.Blackhole; -import software.amazon.awssdk.services.dynamodb.DynamoDbClient; -import software.amazon.awssdk.services.dynamodb.model.GetItemRequest; -import software.amazon.awssdk.services.dynamodb.model.GetItemResponse; import software.amazon.awssdk.services.dynamodb.model.PutItemRequest; import software.amazon.awssdk.services.dynamodb.model.PutItemResponse; -public final class V2TestDynamoDbClient implements DynamoDbClient { +public final class V2TestDynamoDbPutItemClient extends V2TestDynamoDbBaseClient { private static final PutItemResponse PUT_ITEM_RESPONSE = PutItemResponse.builder().build(); - private final Blackhole bh; - private final GetItemResponse getItemResponse; - public V2TestDynamoDbClient(Blackhole bh, GetItemResponse getItemResponse) { - this.bh = bh; - this.getItemResponse = getItemResponse; - } - - @Override - public GetItemResponse getItem(GetItemRequest getItemRequest) { - return getItemResponse; + public V2TestDynamoDbPutItemClient(Blackhole bh) { + super(bh); } @Override @@ -42,13 +31,4 @@ public PutItemResponse putItem(PutItemRequest putItemRequest) { bh.consume(putItemRequest); return PUT_ITEM_RESPONSE; } - - @Override - public String serviceName() { - return "DynamoDB"; - } - - @Override - public void close() { - } } diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbQueryClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbQueryClient.java new file mode 100644 index 000000000000..c925c50a490c --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbQueryClient.java @@ -0,0 +1,41 @@ +/* + * 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.enhanced.dynamodb; + +import org.openjdk.jmh.infra.Blackhole; +import software.amazon.awssdk.services.dynamodb.model.QueryRequest; +import software.amazon.awssdk.services.dynamodb.model.QueryResponse; +import software.amazon.awssdk.services.dynamodb.paginators.QueryIterable; + +public final class V2TestDynamoDbQueryClient extends V2TestDynamoDbBaseClient { + private final QueryResponse queryResponse; + + public V2TestDynamoDbQueryClient(Blackhole bh, QueryResponse queryResponse) { + super(bh); + this.queryResponse = queryResponse; + } + + @Override + public QueryResponse query(QueryRequest queryRequest) { + bh.consume(queryRequest); + return this.queryResponse; + } + + @Override + public QueryIterable queryPaginator(QueryRequest queryRequest) { + return new QueryIterable(this, queryRequest); + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbScanClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbScanClient.java new file mode 100644 index 000000000000..c6d4a4d40bc5 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbScanClient.java @@ -0,0 +1,41 @@ +/* + * 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.enhanced.dynamodb; + +import org.openjdk.jmh.infra.Blackhole; +import software.amazon.awssdk.services.dynamodb.model.ScanRequest; +import software.amazon.awssdk.services.dynamodb.model.ScanResponse; +import software.amazon.awssdk.services.dynamodb.paginators.ScanIterable; + +public final class V2TestDynamoDbScanClient extends V2TestDynamoDbBaseClient { + private final ScanResponse scanResponse; + + public V2TestDynamoDbScanClient(Blackhole bh, ScanResponse scanResponse) { + super(bh); + this.scanResponse = scanResponse; + } + + @Override + public ScanResponse scan(ScanRequest scanRequest) { + bh.consume(scanRequest); + return this.scanResponse; + } + + @Override + public ScanIterable scanPaginator(ScanRequest scanRequest) { + return new ScanIterable(this, scanRequest); + } +} diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbUpdateItemClient.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbUpdateItemClient.java new file mode 100644 index 000000000000..77a9238240ed --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/enhanced/dynamodb/V2TestDynamoDbUpdateItemClient.java @@ -0,0 +1,35 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.benchmark.enhanced.dynamodb; + +import org.openjdk.jmh.infra.Blackhole; +import software.amazon.awssdk.services.dynamodb.model.UpdateItemRequest; +import software.amazon.awssdk.services.dynamodb.model.UpdateItemResponse; + +public final class V2TestDynamoDbUpdateItemClient extends V2TestDynamoDbBaseClient { + private final UpdateItemResponse updateItemResponse; + + public V2TestDynamoDbUpdateItemClient(Blackhole bh, UpdateItemResponse updateItemResponse) { + super(bh); + this.updateItemResponse = updateItemResponse; + } + + @Override + public UpdateItemResponse updateItem(UpdateItemRequest updateItemRequest) { + bh.consume(updateItemRequest); + return this.updateItemResponse; + } +} diff --git a/test/sdk-benchmarks/src/main/resources/software/amazon/awssdk/benchmark/baseline.json b/test/sdk-benchmarks/src/main/resources/software/amazon/awssdk/benchmark/baseline.json index 793e13f608f3..c09d97fbbfc4 100644 --- a/test/sdk-benchmarks/src/main/resources/software/amazon/awssdk/benchmark/baseline.json +++ b/test/sdk-benchmarks/src/main/resources/software/amazon/awssdk/benchmark/baseline.json @@ -949,5 +949,917 @@ "n": 10, "sum": 1460228.4478369893 } + }, { + "id": "enhanced.dynamodb.EnhancedClientDeleteV1MapperComparisonBenchmark.v1Delete-Throughput-testItem-TINY", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.606" + }, + "statistics": { + "mean": 6829142.946589122, + "variance": 4.8591555126432484E8, + "standardDeviation": 22043.492265617188, + "max": 6863185.870054239, + "min": 6799116.445357319, + "n": 10, + "sum": 6.829142946589121E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientDeleteV1MapperComparisonBenchmark.v1Delete-Throughput-testItem-SMALL", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.624" + }, + "statistics": { + "mean": 6808359.910172634, + "variance": 2.000208296099299E8, + "standardDeviation": 14142.87204247885, + "max": 6828977.335348215, + "min": 6786067.374609099, + "n": 10, + "sum": 6.808359910172634E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientDeleteV1MapperComparisonBenchmark.v1Delete-Throughput-testItem-HUGE", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.625" + }, + "statistics": { + "mean": 6760046.190670421, + "variance": 9.75658503627617E7, + "standardDeviation": 9877.542728976763, + "max": 6769841.418495995, + "min": 6737158.221512942, + "n": 10, + "sum": 6.760046190670422E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientDeleteV1MapperComparisonBenchmark.v1Delete-Throughput-testItem-HUGE_FLAT", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.625" + }, + "statistics": { + "mean": 7063555.657198062, + "variance": 6.158453354962092E9, + "standardDeviation": 78475.81382159788, + "max": 7153269.815249109, + "min": 6982305.90267853, + "n": 10, + "sum": 7.063555657198063E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientDeleteV1MapperComparisonBenchmark.v2Delete-Throughput-testItem-TINY", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.625" + }, + "statistics": { + "mean": 5218929.153482059, + "variance": 3.1478391403761997E9, + "standardDeviation": 56105.6070315276, + "max": 5273880.789650345, + "min": 5160076.774620201, + "n": 10, + "sum": 5.2189291534820594E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientDeleteV1MapperComparisonBenchmark.v2Delete-Throughput-testItem-SMALL", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.626" + }, + "statistics": { + "mean": 5269447.416256654, + "variance": 2.1756235980490078E10, + "standardDeviation": 147499.9524762299, + "max": 5418528.555564518, + "min": 5118992.6530110575, + "n": 10, + "sum": 5.269447416256654E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientDeleteV1MapperComparisonBenchmark.v2Delete-Throughput-testItem-HUGE", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.626" + }, + "statistics": { + "mean": 5233493.1041884385, + "variance": 2.4967218721697645E9, + "standardDeviation": 49967.20796852436, + "max": 5285980.226391762, + "min": 5183225.859548674, + "n": 10, + "sum": 5.2334931041884385E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientDeleteV1MapperComparisonBenchmark.v2Delete-Throughput-testItem-HUGE_FLAT", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.626" + }, + "statistics": { + "mean": 5333879.183913028, + "variance": 3.8387871248915306E10, + "standardDeviation": 195928.2298417339, + "max": 5527130.395795353, + "min": 5146070.989876449, + "n": 10, + "sum": 5.333879183913028E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientGetV1MapperComparisonBenchmark.v1Get-Throughput-testItem-TINY", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.632" + }, + "statistics": { + "mean": 4254457.087292329, + "variance": 4.95382992951288E8, + "standardDeviation": 22257.200923550292, + "max": 4275041.386231237, + "min": 4212061.286162632, + "n": 10, + "sum": 4.254457087292329E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientGetV1MapperComparisonBenchmark.v1Get-Throughput-testItem-SMALL", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.632" + }, + "statistics": { + "mean": 2541003.3761009574, + "variance": 4.786259780180736E9, + "standardDeviation": 69182.7997422823, + "max": 2611159.8604039275, + "min": 2472696.999220222, + "n": 10, + "sum": 2.5410033761009574E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientGetV1MapperComparisonBenchmark.v1Get-Throughput-testItem-HUGE", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.632" + }, + "statistics": { + "mean": 276072.8892665714, + "variance": 4934364.084565594, + "standardDeviation": 2221.3428561493142, + "max": 278598.68048084766, + "min": 273875.57772019814, + "n": 10, + "sum": 2760728.8926657136 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientGetV1MapperComparisonBenchmark.v1Get-Throughput-testItem-HUGE_FLAT", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.632" + }, + "statistics": { + "mean": 334086.66986329446, + "variance": 472003.25447557855, + "standardDeviation": 687.024930024798, + "max": 334829.371548133, + "min": 333094.44110854296, + "n": 10, + "sum": 3340866.6986329444 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientGetV1MapperComparisonBenchmark.v2Get-Throughput-testItem-TINY", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.632" + }, + "statistics": { + "mean": 3668470.1459464533, + "variance": 1.8762186153251028E9, + "standardDeviation": 43315.33926134139, + "max": 3720709.233930492, + "min": 3625326.4459771872, + "n": 10, + "sum": 3.6684701459464535E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientGetV1MapperComparisonBenchmark.v2Get-Throughput-testItem-SMALL", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.633" + }, + "statistics": { + "mean": 1705518.9560612484, + "variance": 1.4169945463025673E10, + "standardDeviation": 119037.58004523476, + "max": 1820514.4691287102, + "min": 1585840.1952959616, + "n": 10, + "sum": 1.7055189560612485E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientGetV1MapperComparisonBenchmark.v2Get-Throughput-testItem-HUGE", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.633" + }, + "statistics": { + "mean": 136996.69293126452, + "variance": 799817.5891452621, + "standardDeviation": 894.3252144188165, + "max": 138025.7200620876, + "min": 136055.1512978183, + "n": 10, + "sum": 1369966.9293126452 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientGetV1MapperComparisonBenchmark.v2Get-Throughput-testItem-HUGE_FLAT", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.633" + }, + "statistics": { + "mean": 283351.0162156861, + "variance": 1.0298588244596072E7, + "standardDeviation": 3209.1413562814696, + "max": 286589.6531841922, + "min": 280136.4515638473, + "n": 10, + "sum": 2833510.1621568613 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientPutV1MapperComparisonBenchmark.v1Put-Throughput-testItem-TINY", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.636" + }, + "statistics": { + "mean": 3989391.9219655544, + "variance": 3.417569254965252E8, + "standardDeviation": 18486.668858843263, + "max": 4010282.791681061, + "min": 3965936.2642360986, + "n": 10, + "sum": 3.989391921965554E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientPutV1MapperComparisonBenchmark.v1Put-Throughput-testItem-SMALL", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.637" + }, + "statistics": { + "mean": 2171253.7675951715, + "variance": 3.6857165241080485E7, + "standardDeviation": 6071.0102323320525, + "max": 2178298.2850115495, + "min": 2163119.833040153, + "n": 10, + "sum": 2.1712537675951716E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientPutV1MapperComparisonBenchmark.v1Put-Throughput-testItem-HUGE", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.637" + }, + "statistics": { + "mean": 244529.021162057, + "variance": 2376417.2502670567, + "standardDeviation": 1541.5632488701385, + "max": 246111.53410013518, + "min": 242947.81433874564, + "n": 10, + "sum": 2445290.21162057 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientPutV1MapperComparisonBenchmark.v1Put-Throughput-testItem-HUGE_FLAT", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.637" + }, + "statistics": { + "mean": 176271.52763779167, + "variance": 5.385414480327478E7, + "standardDeviation": 7338.5383288005505, + "max": 183889.15456415596, + "min": 169198.1849380892, + "n": 10, + "sum": 1762715.2763779168 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientPutV1MapperComparisonBenchmark.v2Put-Throughput-testItem-TINY", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.637" + }, + "statistics": { + "mean": 3980473.869357331, + "variance": 1.240006254392538E10, + "standardDeviation": 111355.56808676152, + "max": 4093377.541940185, + "min": 3863525.2091401936, + "n": 10, + "sum": 3.980473869357331E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientPutV1MapperComparisonBenchmark.v2Put-Throughput-testItem-SMALL", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.638" + }, + "statistics": { + "mean": 1537572.9568381808, + "variance": 2.4221168643443692E8, + "standardDeviation": 15563.151558551273, + "max": 1553592.9100167484, + "min": 1520555.0802638964, + "n": 10, + "sum": 1.5375729568381809E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientPutV1MapperComparisonBenchmark.v2Put-Throughput-testItem-HUGE", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.638" + }, + "statistics": { + "mean": 122705.30057333391, + "variance": 9716028.256289382, + "standardDeviation": 3117.0544198472667, + "max": 125727.08296444424, + "min": 119636.09183915379, + "n": 10, + "sum": 1227053.005733339 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientPutV1MapperComparisonBenchmark.v2Put-Throughput-testItem-HUGE_FLAT", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.638" + }, + "statistics": { + "mean": 149741.39277360524, + "variance": 2.650470812611804E8, + "standardDeviation": 16280.266621317367, + "max": 165654.0707152279, + "min": 134059.54954768566, + "n": 10, + "sum": 1497413.9277360525 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientQueryV1MapperComparisonBenchmark.v1Query-Throughput-testItem-TINY", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.638" + }, + "statistics": { + "mean": 1252512.7584237454, + "variance": 3.138983828405156E9, + "standardDeviation": 56026.63499091442, + "max": 1307114.8285281677, + "min": 1197753.879018399, + "n": 10, + "sum": 1.2525127584237454E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientQueryV1MapperComparisonBenchmark.v1Query-Throughput-testItem-SMALL", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.638" + }, + "statistics": { + "mean": 696709.8287589755, + "variance": 1020982.5317724581, + "standardDeviation": 1010.4368024633991, + "max": 697947.9778716824, + "min": 694879.5744542086, + "n": 10, + "sum": 6967098.287589755 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientQueryV1MapperComparisonBenchmark.v1Query-Throughput-testItem-HUGE", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.638" + }, + "statistics": { + "mean": 87840.49274328267, + "variance": 910501.0389601943, + "standardDeviation": 954.20178105063, + "max": 88811.92214743672, + "min": 86825.8942896014, + "n": 10, + "sum": 878404.9274328267 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientQueryV1MapperComparisonBenchmark.v1Query-Throughput-testItem-HUGE_FLAT", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.639" + }, + "statistics": { + "mean": 98567.58634308925, + "variance": 512461.66059423453, + "standardDeviation": 715.8642752604956, + "max": 99409.22741703335, + "min": 97780.25847544703, + "n": 10, + "sum": 985675.8634308925 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientQueryV1MapperComparisonBenchmark.v2Query-Throughput-testItem-TINY", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.639" + }, + "statistics": { + "mean": 559019.8433378737, + "variance": 2.2290777068769585E7, + "standardDeviation": 4721.3109481127785, + "max": 564241.3270141733, + "min": 554165.3844559088, + "n": 10, + "sum": 5590198.433378737 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientQueryV1MapperComparisonBenchmark.v2Query-Throughput-testItem-SMALL", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.639" + }, + "statistics": { + "mean": 333270.58140860766, + "variance": 2.1224538043119207E7, + "standardDeviation": 4607.009663883852, + "max": 338138.9613235646, + "min": 328731.43888478086, + "n": 10, + "sum": 3332705.8140860763 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientQueryV1MapperComparisonBenchmark.v2Query-Throughput-testItem-HUGE", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.639" + }, + "statistics": { + "mean": 37840.02739826469, + "variance": 1.078376036635714E7, + "standardDeviation": 3283.863633946626, + "max": 40994.11267324832, + "min": 34707.83375925676, + "n": 10, + "sum": 378400.2739826469 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientQueryV1MapperComparisonBenchmark.v2Query-Throughput-testItem-HUGE_FLAT", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.639" + }, + "statistics": { + "mean": 87298.81206391682, + "variance": 7797412.220043027, + "standardDeviation": 2792.3846833921407, + "max": 90058.97987038516, + "min": 84505.01102617542, + "n": 10, + "sum": 872988.1206391682 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientScanV1MapperComparisonBenchmark.v1Scan-Throughput-testItem-TINY", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.639" + }, + "statistics": { + "mean": 1816952.3977204207, + "variance": 9.556202520739132E9, + "standardDeviation": 97755.83113420464, + "max": 1911328.3244720402, + "min": 1719772.0220435418, + "n": 10, + "sum": 1.8169523977204207E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientScanV1MapperComparisonBenchmark.v1Scan-Throughput-testItem-SMALL", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.64" + }, + "statistics": { + "mean": 967205.4743976349, + "variance": 1.3978351648120623E7, + "standardDeviation": 3738.7633848801697, + "max": 972027.7812119337, + "min": 962347.443999356, + "n": 10, + "sum": 9672054.743976349 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientScanV1MapperComparisonBenchmark.v1Scan-Throughput-testItem-HUGE", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.64" + }, + "statistics": { + "mean": 91879.33897708468, + "variance": 24930.40149699446, + "standardDeviation": 157.89363982439082, + "max": 92166.21433729483, + "min": 91599.279501587, + "n": 10, + "sum": 918793.3897708468 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientScanV1MapperComparisonBenchmark.v1Scan-Throughput-testItem-HUGE_FLAT", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.64" + }, + "statistics": { + "mean": 116637.4994496019, + "variance": 158699.03677887947, + "standardDeviation": 398.37047679123947, + "max": 117246.77112486717, + "min": 116185.84450622648, + "n": 10, + "sum": 1166374.994496019 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientScanV1MapperComparisonBenchmark.v2Scan-Throughput-testItem-TINY", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.64" + }, + "statistics": { + "mean": 2410421.1020664377, + "variance": 2.804147820060836E8, + "standardDeviation": 16745.58992708479, + "max": 2432181.1127997516, + "min": 2390376.4629096705, + "n": 10, + "sum": 2.410421102066438E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientScanV1MapperComparisonBenchmark.v2Scan-Throughput-testItem-SMALL", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.64" + }, + "statistics": { + "mean": 750074.5784853816, + "variance": 8.396679536063066E7, + "standardDeviation": 9163.339749274315, + "max": 759160.8566629316, + "min": 740079.8184763982, + "n": 10, + "sum": 7500745.784853815 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientScanV1MapperComparisonBenchmark.v2Scan-Throughput-testItem-HUGE", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.64" + }, + "statistics": { + "mean": 42561.66188409884, + "variance": 1.5191447556632824E7, + "standardDeviation": 3897.620755875669, + "max": 46321.96537040448, + "min": 38791.36393438352, + "n": 10, + "sum": 425616.6188409884 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientScanV1MapperComparisonBenchmark.v2Scan-Throughput-testItem-HUGE_FLAT", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.641" + }, + "statistics": { + "mean": 96898.57710736312, + "variance": 553760.3709290832, + "standardDeviation": 744.1507716377664, + "max": 97657.81360405144, + "min": 96100.91050397762, + "n": 10, + "sum": 968985.7710736311 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientUpdateV1MapperComparisonBenchmark.v1Update-Throughput-testItem-TINY", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.641" + }, + "statistics": { + "mean": 2661602.8279100014, + "variance": 1.2703172099024662E10, + "standardDeviation": 112708.34973073052, + "max": 2774023.757066647, + "min": 2548193.0483390293, + "n": 10, + "sum": 2.6616028279100016E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientUpdateV1MapperComparisonBenchmark.v1Update-Throughput-testItem-SMALL", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.641" + }, + "statistics": { + "mean": 1507250.535625762, + "variance": 5.655196829680228E8, + "standardDeviation": 23780.65774885175, + "max": 1532785.2783910045, + "min": 1483174.272510075, + "n": 10, + "sum": 1.5072505356257621E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientUpdateV1MapperComparisonBenchmark.v1Update-Throughput-testItem-HUGE", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.641" + }, + "statistics": { + "mean": 219532.91136539596, + "variance": 866308.2840868158, + "standardDeviation": 930.756834026383, + "max": 220708.66325981263, + "min": 218469.68829126397, + "n": 10, + "sum": 2195329.1136539597 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientUpdateV1MapperComparisonBenchmark.v1Update-Throughput-testItem-HUGE_FLAT", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.641" + }, + "statistics": { + "mean": 145165.8982342992, + "variance": 6301083.691173323, + "standardDeviation": 2510.1959467685633, + "max": 147743.46373358855, + "min": 142678.49316236615, + "n": 10, + "sum": 1451658.982342992 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientUpdateV1MapperComparisonBenchmark.v2Update-Throughput-testItem-TINY", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.641" + }, + "statistics": { + "mean": 1335244.2925506658, + "variance": 9.767359974615078E8, + "standardDeviation": 31252.775836099867, + "max": 1365680.545124737, + "min": 1304606.9981228167, + "n": 10, + "sum": 1.3352442925506659E7 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientUpdateV1MapperComparisonBenchmark.v2Update-Throughput-testItem-SMALL", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.642" + }, + "statistics": { + "mean": 233466.6326390164, + "variance": 2551174.8672474767, + "standardDeviation": 1597.2397651096333, + "max": 235398.290118424, + "min": 231742.0022814813, + "n": 10, + "sum": 2334666.326390164 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientUpdateV1MapperComparisonBenchmark.v2Update-Throughput-testItem-HUGE", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.642" + }, + "statistics": { + "mean": 38060.01754411877, + "variance": 122853.00414046083, + "standardDeviation": 350.5039288516761, + "max": 38432.896736590395, + "min": 37715.230222863865, + "n": 10, + "sum": 380600.1754411877 + } + }, { + "id": "enhanced.dynamodb.EnhancedClientUpdateV1MapperComparisonBenchmark.v2Update-Throughput-testItem-HUGE_FLAT", + "params": { + "sdkVersion": "2.11.5-SNAPSHOT", + "jdkVersion": "1.8.0_242", + "jvmName": "OpenJDK 64-Bit Server VM", + "jvmVersion": "25.242-b08", + "mode": "Throughput", + "date": "2020-03-31T20:56:25.642" + }, + "statistics": { + "mean": 16831.633221796015, + "variance": 2523.4549523643527, + "standardDeviation": 50.23400195449645, + "max": 16909.85307725241, + "min": 16772.938959396386, + "n": 10, + "sum": 168316.33221796015 + } } ] diff --git a/test/service-test-utils/pom.xml b/test/service-test-utils/pom.xml index 4584c9982cbb..856b653dfc85 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.11.6 + 2.11.7-SNAPSHOT ../../pom.xml service-test-utils diff --git a/test/stability-tests/pom.xml b/test/stability-tests/pom.xml index 0600a48d3fe0..7b53a97f1159 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.11.6 + 2.11.7-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/test/test-utils/pom.xml b/test/test-utils/pom.xml index f5c747040b0e..f3aa993aed68 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.11.6 + 2.11.7-SNAPSHOT ../../pom.xml test-utils diff --git a/test/tests-coverage-reporting/pom.xml b/test/tests-coverage-reporting/pom.xml index 3a7a2c69fb64..19241e6d8b83 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.11.6 + 2.11.7-SNAPSHOT ../../pom.xml 4.0.0 @@ -102,6 +102,11 @@ software.amazon.awssdk ${awsjavasdk.version} + + aws-crt-client + software.amazon.awssdk + ${awsjavasdk.version} + url-connection-client software.amazon.awssdk @@ -244,4 +249,4 @@ - \ No newline at end of file + diff --git a/utils/pom.xml b/utils/pom.xml index a0c4f603f4cc..0bd681e7e767 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -20,7 +20,7 @@ aws-sdk-java-pom software.amazon.awssdk - 2.11.6 + 2.11.7-SNAPSHOT 4.0.0