Skip to content

Commit df8b220

Browse files
zoewanggQuanzzzzjoviegasdagnir
authored
Merge transfer manager change into mainline (#2649)
* Add download implementation for API requests * Add S3CrtAsyncClient skeleton * Add support for adapting the sdk configurations to crt configurations. * Implement getObject in S3CrtAsyncClient * Implement S3 CRT upload * Fix checkstyle errors, add stability tests * Upgrade crt to 0.11.5 * Update APIs * Fix CRT S3 Client builder - Return the correct type from builder methods - Make max throughput and part size nullable * Implement S3TransferManager#upload * Implement TransferManager download and add s3-benchmarks module * Move s3 crt related classes to s3-transfermanager * Add requestLogger and requestIdLogger * Various fixes and refactoring * Add user-agent header in transfer manager * Refactor UserAgentUtils and make it a protected API * Fix sdk-benchmarks version * Rename module and package for transfermanager * Fix stability tests to not create a new client per request * Various renaming * Remove the option to pass bucket and key to DownloadRequest and UploadRequest and remove unused files * Add README for S3TransferManager * Add validation in S3ClientConfiguration * Fix CRT/SDK POJO conversion and add more tests * Update to use CRT DelegateCredentialsProvider * Provide HTTP request-level data to PutObjectResponse * Update Javadocs * Fix the race condition in the FileAsyncRequestBody which causes the request to hang * Add request cancellation logic and tests * Fixed an issue where the future gets stuck when upload fails * Offload completion of execution future to a separate thread * Wrap CrtS3RuntimeException to SdkServiceException * Revert "Wrap CrtS3RuntimeException to SdkServiceException" * Update s3 crt client tests to verify resources are closed properly * Wrap CrtS3RuntimeException to S3ServiceException * Update version * Bump up CRT version, clean up resources in tests, fix credential adapter TODO (#2594) * Remove buffer copy since it's no longer needed (#2611) * Fix fd remaining open longer than necessary (#2616) In FileAsyncRequestBody, the file was not being closed until a request() read past the end of the file without ready any bytes; i.e. if a read() call reads up to the end of the file, it would not complete the subscription on the subsequent request() signal. This fixes this issue by signaling complete if we know we've reached the end. * Cancel sub on finish and exception (#2619) * Bump up crt version (#2640) Bump up crt version * Fix merge conflict * Merge 'origin/master' into transfer manager branch (#2647) Co-authored-by: Quanzzzz <[email protected]> Co-authored-by: John Viegas <[email protected]> Co-authored-by: Dongie Agnir <[email protected]>
1 parent c62ccb2 commit df8b220

File tree

95 files changed

+7685
-139
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+7685
-139
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "bugfix",
3+
"category": "AWS SDK for Java v2",
4+
"contributor": "",
5+
"description": "Fix issue in `FileAsyncRequestBody` where the underlying file channel would only be closed when enough requests are sent to read *past* the end of the file; if just enough requests are sent to read to the end of the file, the file is not closed, leaving an open file descriptor around longer than it needs to be."
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"category": "Amazon S3 Transfer Manager [Preview]",
3+
"contributor": "",
4+
"type": "feature",
5+
"description": "This release includes the preview release of the Amazon S3 Transfer Manager. Visit our [Developer Guide](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/transfer-manager.html) for more information."
6+
}

buildspecs/release-to-maven.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ phases:
2626
if ! curl -f --head $SONATYPE_URL; then
2727
mkdir -p $CREDENTIALS
2828
aws s3 cp s3://aws-java-sdk-release-credentials/ $CREDENTIALS/ --recursive
29-
mvn clean deploy -B -s $SETTINGS_XML -Dgpg.homedir=$GPG_HOME -Ppublishing -DperformRelease -Dspotbugs.skip -DskipTests -Dcheckstyle.skip -Djapicmp.skip -Ddoclint=none -pl !:protocol-tests,!:protocol-tests-core,!:codegen-generated-classes-test,!:sdk-benchmarks,!:module-path-tests,!:tests-coverage-reporting,!:stability-tests,!:sdk-native-image-test,!:auth-sts-testing -DautoReleaseAfterClose=true -DstagingProgressTimeoutMinutes=30
29+
mvn clean deploy -B -s $SETTINGS_XML -Dgpg.homedir=$GPG_HOME -Ppublishing -DperformRelease -Dspotbugs.skip -DskipTests -Dcheckstyle.skip -Djapicmp.skip -Ddoclint=none -pl !:protocol-tests,!:protocol-tests-core,!:codegen-generated-classes-test,!:sdk-benchmarks,!:module-path-tests,!:tests-coverage-reporting,!:stability-tests,!:sdk-native-image-test,!:auth-sts-testing,!:s3-benchmarks -DautoReleaseAfterClose=true -DstagingProgressTimeoutMinutes=30
3030
else
3131
echo "This version was already released."
3232
fi

core/auth/src/main/java/software/amazon/awssdk/auth/credentials/InstanceProfileCredentialsProvider.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import software.amazon.awssdk.core.SdkSystemSetting;
2525
import software.amazon.awssdk.core.exception.SdkClientException;
2626
import software.amazon.awssdk.core.exception.SdkServiceException;
27-
import software.amazon.awssdk.core.internal.util.UserAgentUtils;
27+
import software.amazon.awssdk.core.util.SdkUserAgent;
2828
import software.amazon.awssdk.regions.util.HttpResourcesUtils;
2929
import software.amazon.awssdk.regions.util.ResourcesEndpointProvider;
3030
import software.amazon.awssdk.utils.ToString;
@@ -160,7 +160,7 @@ public URI endpoint() throws IOException {
160160
@Override
161161
public Map<String, String> headers() {
162162
Map<String, String> requestHeaders = new HashMap<>();
163-
requestHeaders.put("User-Agent", UserAgentUtils.getUserAgent());
163+
requestHeaders.put("User-Agent", SdkUserAgent.create().userAgent());
164164
requestHeaders.put("Accept", "*/*");
165165
requestHeaders.put("Connection", "keep-alive");
166166

@@ -195,7 +195,7 @@ public URI endpoint() {
195195
@Override
196196
public Map<String, String> headers() {
197197
Map<String, String> requestHeaders = new HashMap<>();
198-
requestHeaders.put("User-Agent", UserAgentUtils.getUserAgent());
198+
requestHeaders.put("User-Agent", SdkUserAgent.create().userAgent());
199199
requestHeaders.put("Accept", "*/*");
200200
requestHeaders.put("Connection", "keep-alive");
201201
requestHeaders.put(EC2_METADATA_TOKEN_TTL_HEADER, DEFAULT_TOKEN_TTL);

core/auth/src/test/java/software/amazon/awssdk/auth/credentials/ContainerCredentialsProviderTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.junit.ClassRule;
3434
import org.junit.Test;
3535
import software.amazon.awssdk.core.exception.SdkClientException;
36-
import software.amazon.awssdk.core.internal.util.UserAgentUtils;
36+
import software.amazon.awssdk.core.util.SdkUserAgent;
3737
import software.amazon.awssdk.regions.util.ResourcesEndpointProvider;
3838
import software.amazon.awssdk.testutils.EnvironmentVariableHelper;
3939

@@ -122,7 +122,7 @@ private void stubForCorruptedSuccessResponse() {
122122

123123
private void stubFor200Response(String body) {
124124
stubFor(get(urlPathEqualTo(CREDENTIALS_PATH))
125-
.withHeader("User-Agent", equalTo(UserAgentUtils.getUserAgent()))
125+
.withHeader("User-Agent", equalTo(SdkUserAgent.create().userAgent()))
126126
.willReturn(aResponse()
127127
.withStatus(200)
128128
.withHeader("Content-Type", "application/json")

core/auth/src/test/java/software/amazon/awssdk/auth/credentials/HttpCredentialsProviderTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import org.junit.ClassRule;
3636
import org.junit.Test;
3737
import software.amazon.awssdk.core.exception.SdkClientException;
38-
import software.amazon.awssdk.core.internal.util.UserAgentUtils;
38+
import software.amazon.awssdk.core.util.SdkUserAgent;
3939
import software.amazon.awssdk.regions.util.ResourcesEndpointProvider;
4040
import software.amazon.awssdk.utils.DateUtils;
4141
import software.amazon.awssdk.utils.IoUtils;
@@ -132,7 +132,7 @@ public void basicCachingFunctionalityWorks() {
132132
private void stubForSuccessResponseWithCustomBody(String body) {
133133
stubFor(
134134
get(urlPathEqualTo(CREDENTIALS_PATH))
135-
.withHeader("User-Agent", equalTo(UserAgentUtils.getUserAgent()))
135+
.withHeader("User-Agent", equalTo(SdkUserAgent.create().userAgent()))
136136
.willReturn(aResponse()
137137
.withStatus(200)
138138
.withHeader("Content-Type", "application/json")

core/auth/src/test/java/software/amazon/awssdk/auth/credentials/InstanceProfileCredentialsProviderTest.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,11 @@
2323
import static com.github.tomakehurst.wiremock.client.WireMock.putRequestedFor;
2424
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
2525
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
26-
import static org.assertj.core.api.Assertions.assertThat;
27-
import static org.hamcrest.Matchers.instanceOf;
2826
import com.github.tomakehurst.wiremock.WireMockServer;
2927
import com.github.tomakehurst.wiremock.client.WireMock;
3028
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
3129
import com.github.tomakehurst.wiremock.junit.WireMockRule;
3230
import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder;
33-
import java.net.SocketTimeoutException;
3431
import java.time.Duration;
3532
import java.time.Instant;
3633
import org.junit.AfterClass;
@@ -40,8 +37,7 @@
4037
import org.junit.rules.ExpectedException;
4138
import software.amazon.awssdk.core.SdkSystemSetting;
4239
import software.amazon.awssdk.core.exception.SdkClientException;
43-
import software.amazon.awssdk.core.internal.util.UserAgentUtils;
44-
import software.amazon.awssdk.profiles.ProfileFileSystemSetting;
40+
import software.amazon.awssdk.core.util.SdkUserAgent;
4541
import software.amazon.awssdk.utils.DateUtils;
4642

4743
public class InstanceProfileCredentialsProviderTest {
@@ -94,7 +90,7 @@ public void resolveCredentials_requestsIncludeUserAgent() {
9490
provider.resolveCredentials();
9591

9692
String userAgentHeader = "User-Agent";
97-
String userAgent = UserAgentUtils.getUserAgent();
93+
String userAgent = SdkUserAgent.create().userAgent();
9894
WireMock.verify(putRequestedFor(urlPathEqualTo(TOKEN_RESOURCE_PATH)).withHeader(userAgentHeader, equalTo(userAgent)));
9995
WireMock.verify(getRequestedFor(urlPathEqualTo(CREDENTIALS_RESOURCE_PATH)).withHeader(userAgentHeader, equalTo(userAgent)));
10096
WireMock.verify(getRequestedFor(urlPathEqualTo(CREDENTIALS_RESOURCE_PATH + "some-profile")).withHeader(userAgentHeader, equalTo(userAgent)));
@@ -235,7 +231,7 @@ public void resolveCredentials_customProfileFileAndName_usesCorrectEndpoint() {
235231
provider.resolveCredentials();
236232

237233
String userAgentHeader = "User-Agent";
238-
String userAgent = UserAgentUtils.getUserAgent();
234+
String userAgent = SdkUserAgent.create().userAgent();
239235
mockMetadataEndpoint_2.verify(putRequestedFor(urlPathEqualTo(TOKEN_RESOURCE_PATH)).withHeader(userAgentHeader, equalTo(userAgent)));
240236
mockMetadataEndpoint_2.verify(getRequestedFor(urlPathEqualTo(CREDENTIALS_RESOURCE_PATH)).withHeader(userAgentHeader, equalTo(userAgent)));
241237
mockMetadataEndpoint_2.verify(getRequestedFor(urlPathEqualTo(CREDENTIALS_RESOURCE_PATH + "some-profile")).withHeader(userAgentHeader, equalTo(userAgent)));

core/regions/src/main/java/software/amazon/awssdk/regions/internal/util/EC2MetadataUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import software.amazon.awssdk.core.SdkSystemSetting;
3333
import software.amazon.awssdk.core.exception.SdkClientException;
3434
import software.amazon.awssdk.core.exception.SdkServiceException;
35-
import software.amazon.awssdk.core.internal.util.UserAgentUtils;
35+
import software.amazon.awssdk.core.util.SdkUserAgent;
3636
import software.amazon.awssdk.protocols.jsoncore.JsonNode;
3737
import software.amazon.awssdk.protocols.jsoncore.JsonNodeParser;
3838
import software.amazon.awssdk.regions.util.HttpResourcesUtils;
@@ -633,7 +633,7 @@ public URI endpoint() {
633633
@Override
634634
public Map<String, String> headers() {
635635
Map<String, String> requestHeaders = new HashMap<>();
636-
requestHeaders.put("User-Agent", UserAgentUtils.getUserAgent());
636+
requestHeaders.put("User-Agent", SdkUserAgent.create().userAgent());
637637
requestHeaders.put("Accept", "*/*");
638638
requestHeaders.put("Connection", "keep-alive");
639639

core/regions/src/main/java/software/amazon/awssdk/regions/internal/util/InstanceProviderTokenEndpointProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import java.util.HashMap;
2020
import java.util.Map;
2121
import software.amazon.awssdk.annotations.SdkInternalApi;
22-
import software.amazon.awssdk.core.internal.util.UserAgentUtils;
22+
import software.amazon.awssdk.core.util.SdkUserAgent;
2323
import software.amazon.awssdk.regions.util.ResourcesEndpointProvider;
2424

2525
@SdkInternalApi
@@ -43,7 +43,7 @@ public URI endpoint() {
4343
@Override
4444
public Map<String, String> headers() {
4545
Map<String, String> requestHeaders = new HashMap<>();
46-
requestHeaders.put("User-Agent", UserAgentUtils.getUserAgent());
46+
requestHeaders.put("User-Agent", SdkUserAgent.create().userAgent());
4747
requestHeaders.put("Accept", "*/*");
4848
requestHeaders.put("Connection", "keep-alive");
4949
requestHeaders.put(EC2_METADATA_TOKEN_TTL_HEADER, DEFAULT_TOKEN_TTL);

core/regions/src/main/java/software/amazon/awssdk/regions/util/ResourcesEndpointProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import java.util.HashMap;
2121
import java.util.Map;
2222
import software.amazon.awssdk.annotations.SdkProtectedApi;
23-
import software.amazon.awssdk.core.internal.util.UserAgentUtils;
23+
import software.amazon.awssdk.core.util.SdkUserAgent;
2424

2525
/**
2626
* <p>
@@ -57,7 +57,7 @@ default ResourcesEndpointRetryPolicy retryPolicy() {
5757
*/
5858
default Map<String, String> headers() {
5959
Map<String, String> requestHeaders = new HashMap<>();
60-
requestHeaders.put("User-Agent", UserAgentUtils.getUserAgent());
60+
requestHeaders.put("User-Agent", SdkUserAgent.create().userAgent());
6161
requestHeaders.put("Accept", "*/*");
6262
requestHeaders.put("Connection", "keep-alive");
6363

core/regions/src/test/java/software/amazon/awssdk/regions/util/HttpCredentialsUtilsTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@
3636
import org.mockito.runners.MockitoJUnitRunner;
3737
import software.amazon.awssdk.core.exception.SdkClientException;
3838
import software.amazon.awssdk.core.exception.SdkServiceException;
39-
import software.amazon.awssdk.core.internal.util.UserAgentUtils;
40-
import software.amazon.awssdk.core.util.VersionInfo;
39+
import software.amazon.awssdk.core.util.SdkUserAgent;
4140
import software.amazon.awssdk.regions.internal.util.ConnectionUtils;
4241
import software.amazon.awssdk.regions.internal.util.SocketUtils;
4342

@@ -53,7 +52,7 @@ public class HttpCredentialsUtilsTest {
5352
private static Map<String, String> headers = new HashMap<String, String>()
5453
{
5554
{
56-
put("User-Agent", UserAgentUtils.getUserAgent());
55+
put("User-Agent", SdkUserAgent.create().userAgent());
5756
put("Accept", "*/*");
5857
put("Connection", "keep-alive");
5958
}

core/sdk-core/src/main/java/software/amazon/awssdk/core/client/builder/SdkDefaultClientBuilder.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@
6363
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
6464
import software.amazon.awssdk.core.internal.http.loader.DefaultSdkAsyncHttpClientBuilder;
6565
import software.amazon.awssdk.core.internal.http.loader.DefaultSdkHttpClientBuilder;
66-
import software.amazon.awssdk.core.internal.util.UserAgentUtils;
6766
import software.amazon.awssdk.core.retry.RetryMode;
6867
import software.amazon.awssdk.core.retry.RetryPolicy;
68+
import software.amazon.awssdk.core.util.SdkUserAgent;
6969
import software.amazon.awssdk.http.ExecutableHttpRequest;
7070
import software.amazon.awssdk.http.HttpExecuteRequest;
7171
import software.amazon.awssdk.http.SdkHttpClient;
@@ -205,7 +205,7 @@ private SdkClientConfiguration mergeGlobalDefaults(SdkClientConfiguration config
205205
.option(ADDITIONAL_HTTP_HEADERS, new LinkedHashMap<>())
206206
.option(PROFILE_FILE, profileFile)
207207
.option(PROFILE_NAME, ProfileFileSystemSetting.AWS_PROFILE.getStringValueOrThrow())
208-
.option(USER_AGENT_PREFIX, UserAgentUtils.getUserAgent())
208+
.option(USER_AGENT_PREFIX, SdkUserAgent.create().userAgent())
209209
.option(USER_AGENT_SUFFIX, "")
210210
.option(CRC32_FROM_COMPRESSED_DATA_ENABLED, false));
211211
}
@@ -298,6 +298,9 @@ protected AttributeMap childHttpConfig() {
298298
* Finalize which async executor service will be used for the created client. The default async executor
299299
* service has at least 8 core threads and can scale up to at least 64 threads when needed depending
300300
* on the number of processors available.
301+
*
302+
* This uses the same default executor in S3NativeClientConfiguration#resolveAsyncFutureCompletionExecutor.
303+
* Make sure you update that method if you update the defaults here.
301304
*/
302305
private Executor resolveAsyncFutureCompletionExecutor(SdkClientConfiguration config) {
303306
Supplier<Executor> defaultExecutor = () -> {

0 commit comments

Comments
 (0)