Open chetanyachopra opened 1 month ago
just FYI: on increasing value of .minPartSize(12*MB)
property of .crtBuilder()
i am succefully able to upload file .. problem is I don't know file size prior
and on running in debug mode I got these logs
ig.env_IS_UNDEFINED 2024-08-05 14:50:20,768 [restartedMain] INFO com.example.demo.DemoApplication - Started DemoApplication in 2.256 seconds (process running for 4.304)
ig.env_IS_UNDEFINED 2024-08-05 14:50:34,738 [http-nio-8080-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
ig.env_IS_UNDEFINED 2024-08-05 14:50:34,738 [http-nio-8080-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
ig.env_IS_UNDEFINED 2024-08-05 14:50:34,739 [http-nio-8080-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 1 ms
ig.env_IS_UNDEFINED 2024-08-05 14:50:34,809 [http-nio-8080-exec-1] DEBUG software.amazon.awssdk.core.interceptor.ExecutionInterceptorChain - Creating an interceptor chain that will apply interceptors in the following order: [software.amazon.awssdk.core.internal.interceptor.HttpChecksumValidationInterceptor@7ec9850d, software.amazon.awssdk.awscore.interceptor.HelpfulUnknownHostExceptionInterceptor@eb120d2, software.amazon.awssdk.awscore.eventstream.EventStreamInitialRequestInterceptor@4a67f5b7, software.amazon.awssdk.awscore.interceptor.TraceIdExecutionInterceptor@35a319ef, software.amazon.awssdk.services.s3.auth.scheme.internal.S3AuthSchemeInterceptor@77013bb, software.amazon.awssdk.services.s3.endpoints.internal.S3ResolveEndpointInterceptor@401437, software.amazon.awssdk.services.s3.endpoints.internal.S3RequestSetEndpointInterceptor@75ff83c5, software.amazon.awssdk.services.s3.internal.handlers.StreamingRequestInterceptor@58be90f4, software.amazon.awssdk.services.s3.internal.handlers.CreateBucketInterceptor@5fd4ad93, software.amazon.awssdk.services.s3.internal.handlers.CreateMultipartUploadRequestInterceptor@5fb5ebf2, software.amazon.awssdk.services.s3.internal.handlers.DecodeUrlEncodedResponseInterceptor@565dba6a, software.amazon.awssdk.services.s3.internal.handlers.GetBucketPolicyInterceptor@7a48a965, software.amazon.awssdk.services.s3.internal.handlers.S3ExpressChecksumInterceptor@a3b8a, software.amazon.awssdk.services.s3.internal.handlers.AsyncChecksumValidationInterceptor@7090aa02, software.amazon.awssdk.services.s3.internal.handlers.SyncChecksumValidationInterceptor@4b25c090, software.amazon.awssdk.services.s3.internal.handlers.EnableTrailingChecksumInterceptor@74994b10, software.amazon.awssdk.services.s3.internal.handlers.ExceptionTranslationInterceptor@251ee862, software.amazon.awssdk.services.s3.internal.handlers.GetObjectInterceptor@502b8679, software.amazon.awssdk.services.s3.internal.handlers.CopySourceInterceptor@356fedac, software.amazon.awssdk.services.s3.internal.handlers.ObjectMetadataInterceptor@b90e1da, software.amazon.awssdk.transfer.s3.internal.ApplyUserAgentInterceptor@599f4532, software.amazon.awssdk.services.s3.internal.crt.DefaultS3CrtAsyncClient$ValidateRequestInterceptor@558b1836, software.amazon.awssdk.services.s3.internal.crt.DefaultS3CrtAsyncClient$AttachHttpAttributesExecutionInterceptor@1fc39da6]
ig.env_IS_UNDEFINED 2024-08-05 14:50:34,828 [http-nio-8080-exec-1] DEBUG software.amazon.awssdk.core.interceptor.ExecutionInterceptorChain - Interceptor 'software.amazon.awssdk.transfer.s3.internal.ApplyUserAgentInterceptor@599f4532' modified the message with its modifyRequest method.
ig.env_IS_UNDEFINED 2024-08-05 14:50:34,846 [http-nio-8080-exec-1] DEBUG software.amazon.awssdk.core.interceptor.ExecutionInterceptorChain - Interceptor 'software.amazon.awssdk.services.s3.endpoints.internal.S3RequestSetEndpointInterceptor@75ff83c5' modified the message with its modifyHttpRequest method.
ig.env_IS_UNDEFINED 2024-08-05 14:50:34,846 [http-nio-8080-exec-1] DEBUG software.amazon.awssdk.core.interceptor.ExecutionInterceptorChain - Interceptor 'software.amazon.awssdk.services.s3.internal.handlers.StreamingRequestInterceptor@58be90f4' modified the message with its modifyHttpRequest method.
ig.env_IS_UNDEFINED 2024-08-05 14:50:34,868 [http-nio-8080-exec-1] DEBUG software.amazon.awssdk.request - Sending Request: DefaultSdkHttpFullRequest(httpMethod=PUT, protocol=https, host=dtu-coh-clst1.igi.ig.local, port=3000, encodedPath=/broker-charge-loader-test-inbound/archived/ig-EquitySwapFinancingExtractFTP.120124.0538.txt, headers=[amz-sdk-invocation-id, Content-Length, Content-Type, Expect, User-Agent], queryParameters=[])
ig.env_IS_UNDEFINED 2024-08-05 14:50:41,387 [AwsEventLoop 7] DEBUG software.amazon.awssdk.requestId - Received failed response: 400, Request ID: not available, Extended Request ID: not available
ig.env_IS_UNDEFINED 2024-08-05 14:50:41,387 [AwsEventLoop 7] DEBUG software.amazon.awssdk.request - Received failed response: 400, Request ID: not available, Extended Request ID: not available
java.util.concurrent.CompletionException: software.amazon.awssdk.services.s3.model.S3Exception: null (Service: S3, Status Code: 400, Request ID: null)
at software.amazon.awssdk.utils.CompletableFutureUtils.errorAsCompletionException(CompletableFutureUtils.java:65)
at software.amazon.awssdk.core.internal.http.pipeline.stages.AsyncExecutionFailureExceptionReportingStage.lambda$execute$0(AsyncExecutionFailureExceptionReportingStage.java:51)
at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162)
at software.amazon.awssdk.utils.CompletableFutureUtils.lambda$forwardExceptionTo$0(CompletableFutureUtils.java:79)
at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162)
at software.amazon.awssdk.core.internal.http.pipeline.stages.AsyncRetryableStage$RetryingExecutor.maybeAttemptExecute(AsyncRetryableStage.java:103)
at software.amazon.awssdk.core.internal.http.pipeline.stages.AsyncRetryableStage$RetryingExecutor.maybeRetryExecute(AsyncRetryableStage.java:184)
at software.amazon.awssdk.core.internal.http.pipeline.stages.AsyncRetryableStage$RetryingExecutor.lambda$attemptExecute$1(AsyncRetryableStage.java:170)
at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)
at software.amazon.awssdk.core.internal.http.pipeline.stages.MakeAsyncHttpRequestStage.lambda$execute$0(MakeAsyncHttpRequestStage.java:110)
at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)
at software.amazon.awssdk.core.internal.http.pipeline.stages.MakeAsyncHttpRequestStage.completeResponseFuture(MakeAsyncHttpRequestStage.java:253)
at software.amazon.awssdk.core.internal.http.pipeline.stages.MakeAsyncHttpRequestStage.lambda$executeHttpRequest$3(MakeAsyncHttpRequestStage.java:167)
at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
at java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: software.amazon.awssdk.services.s3.model.S3Exception: null (Service: S3, Status Code: 400, Request ID: null)
at software.amazon.awssdk.protocols.xml.internal.unmarshall.AwsXmlPredicatedResponseHandler.handleErrorResponse(AwsXmlPredicatedResponseHandler.java:156)
at software.amazon.awssdk.protocols.xml.internal.unmarshall.AwsXmlPredicatedResponseHandler.handleResponse(AwsXmlPredicatedResponseHandler.java:108)
at software.amazon.awssdk.protocols.xml.internal.unmarshall.AwsXmlPredicatedResponseHandler.handle(AwsXmlPredicatedResponseHandler.java:85)
at software.amazon.awssdk.protocols.xml.internal.unmarshall.AwsXmlPredicatedResponseHandler.handle(AwsXmlPredicatedResponseHandler.java:43)
at software.amazon.awssdk.core.internal.handler.BaseClientHandler.lambda$successTransformationResponseHandler$7(BaseClientHandler.java:279)
at software.amazon.awssdk.core.internal.http.async.AsyncResponseHandler.lambda$prepare$0(AsyncResponseHandler.java:92)
at java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)
at software.amazon.awssdk.core.internal.http.async.AsyncResponseHandler$BaosSubscriber.onComplete(AsyncResponseHandler.java:135)
at software.amazon.awssdk.core.internal.metrics.BytesReadTrackingPublisher$BytesReadTracker.onComplete(BytesReadTrackingPublisher.java:74)
at software.amazon.awssdk.utils.async.SimplePublisher.doProcessQueue(SimplePublisher.java:275)
at software.amazon.awssdk.utils.async.SimplePublisher.processEventQueue(SimplePublisher.java:224)
at software.amazon.awssdk.utils.async.SimplePublisher.complete(SimplePublisher.java:157)
at java.base/java.util.concurrent.CompletableFuture.uniRunNow(CompletableFuture.java:819)
at java.base/java.util.concurrent.CompletableFuture.uniRunStage(CompletableFuture.java:803)
at java.base/java.util.concurrent.CompletableFuture.thenRun(CompletableFuture.java:2195)
at software.amazon.awssdk.services.s3.internal.crt.S3CrtResponseHandlerAdapter.onErrorResponseComplete(S3CrtResponseHandlerAdapter.java:181)
at software.amazon.awssdk.services.s3.internal.crt.S3CrtResponseHandlerAdapter.handleError(S3CrtResponseHandlerAdapter.java:160)
at software.amazon.awssdk.services.s3.internal.crt.S3CrtResponseHandlerAdapter.onFinished(S3CrtResponseHandlerAdapter.java:129)
at software.amazon.awssdk.crt.s3.S3MetaRequestResponseHandlerNativeAdapter.onFinished(S3MetaRequestResponseHandlerNativeAdapter.java:25)
Hi @chetanyachopra,
Thank you for reporting the issue. For some reasons, I am unable to reproduce the error using the below code and dependencies.
public class Main {
static S3AsyncClient amazonS3Client = S3AsyncClient.crtBuilder()
.forcePathStyle(true)
.region(Region.US_EAST_1)
.build();
public static void main(String[] args) {
uploadMultiPart("12");
upload();
}
public static S3TransferManager createTransferManager() {
return S3TransferManager.builder()
.s3Client(amazonS3Client).build();
}
public static void uploadMultiPart(String size) {
final String fileName;
String fileAbsolutePath = "";
if(size != null) {
fileName = "randomBigFile.txt";
fileAbsolutePath = "/Users/**/Desktop/S3Dir/MBfile.txt";
} else {
fileName = "randomSmallFile.txt";
fileAbsolutePath = "/Users/**/Desktop/S3Dir/MBfile.txt";
}
try(S3TransferManager transferManager = createTransferManager()) {
UploadFileRequest uploadFileRequest = UploadFileRequest.builder()
.putObjectRequest(req -> req
.bucket("***")
.key("archived/" + fileName)
.build())
.source(Paths.get(fileAbsolutePath))
.build();
try {
transferManager.uploadFile(uploadFileRequest).completionFuture().join();
System.out.println("Upload completed!");
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
System.out.println("Error while listing files via Storage Provider {}"+ e.getMessage()+ e);
throw new RuntimeException("Error While downloading Objects from Shared Storage", e);
}
}
public static void upload() {
String fileName = "someFile.txt";
String fileAbsolutePath = "/Users/**/Desktop/S3Dir/MBfile.txt";
try {
PutObjectResponse uploadResponse = amazonS3Client
.putObject(req -> req
.bucket("***")
.key("newarchived/" + fileName),
Paths.get(fileAbsolutePath)
).join();
System.out.println("File archived from S3: {}, response = {}"+ fileName+ uploadResponse);
} catch(Exception e) {
System.out.println("Got Exception while copying Object from S3: {}"+ fileName+ e);
throw new RuntimeException(e);
}
}
}
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.25.60</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-bom</artifactId>
<version>2.19.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk.crt</groupId>
<artifactId>aws-crt</artifactId>
<version>0.29.20</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3-transfer-manager</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>apache-client</artifactId>
</dependency>
</dependencies>
The only difference I have is in the S3ClientConfiguration, where I am not overriding the endpoint as in your case.
From previous logs, I can see you are using host=dtu-coh-clst1.igi.ig.local
in your application.
Kindly let me know if you see any other differences in my repro steps that would limit me from replicating this issue.
Also, if you are able to share the debug logs that may help to look further as well.
Log.initLoggingToFile(Log.LogLevel.Trace, "<<file_path>>");
Regards, Chaitanya
Sure @bhoradc, just FYI I am using this aws-java-sdk v2 to interact with S3 like storage of cohesity but not amazon S3 itself. I see as per logs i am getting 400 response from service do you think this might be because of backend service ie cohesity ?
Also can you help me understand how crtBuilder behaves if file size is less than .minPartSize()
compared to larger than .minPartSize()
. If I have clear understanding of how crtBuilder behaves in both the cases it will help me debug with cohesity support team. :)
This looks dangerously like #5415 where again, we see 400 on a retry of a partial file upload. This is only triggered after a 500; maybe this third-party store has other issues.
Or it may just be that the storage cannot handle multipart uploads.
Probably the best thing you could do right now is log the http messages as well as looking at the server communications.
log4j.logger.io.netty.handler.logging=DEBUG
log4j.logger.software.amazon.awssdk.request=DEBUG
Curious how do you get on here. It would be interesting to see if you could download the most current hadoop release from https://hadoop.apache.org/releases.html and see how its s3a connector works for large file uploads both with and without the transfer manager used for its hadoop fs -copyFromLocal
command.
Describe the bug
I am trying to upload file to S3 using crtBuilder & file size if of approx 12MB
below is S3ClientConfiguration
and below are two methods one use transferManager to upload and another uses s3Asyncclient Directly .. both of which are failing with this error in log stack
java.util.concurrent.CompletionException: software.amazon.awssdk.services.s3.model.S3Exception: null (Service: S3, Status Code: 400, Request ID: null)
Implementation with S3TransferManager
here is one with S3AsyncClient Directly
Just FYI below are my dependencies
Expected Behavior
File should be uploaded without any exceptions
Current Behavior
sdk throwing 400 with below stack trace
Reproduction Steps
use above provided code with above provided dependencies
Possible Solution
No response
Additional Information/Context
No response
AWS Java SDK version used
2.25.60
JDK version used
java 1.8
Operating System and version
linux