[ 
https://issues.apache.org/jira/browse/CAMEL-19707?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17762854#comment-17762854
 ] 

Philippe Soares commented on CAMEL-19707:
-----------------------------------------

Sorry for the delay. I hadn't seen the notification.

Indeed I think the component should be clever enough to do both:
1/ Upload zero length files through a "regular" upload, just like any file 
which has a size below multipart-limit

2/ Switch to multipart uploads if file size > multipart-limit

> camel-aws2-s3 multipart uploads crash with zero-byte files
> ----------------------------------------------------------
>
>                 Key: CAMEL-19707
>                 URL: https://issues.apache.org/jira/browse/CAMEL-19707
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-aws2
>    Affects Versions: 4.0-RC2
>            Reporter: Philippe Soares
>            Priority: Minor
>             Fix For: 4.1.0
>
>
> When a route is configured to upload files to S3 using multipart, the upload 
> fails for files with zero length with the following stack trace:
> {code:java}
> 08:58:19.315 [Camel (camel-1) thread #3 - seda://mychannel] WARN  
> o.a.c.component.seda.SedaConsumer - Error processing exchange. 
> Exchange[2980AEE3A04EBAE-000000000000001D]. Caused by: 
> [software.amazon.awssdk.services.s3.model.S3Exception - The XML you provided 
> was not well-formed or did not validate against our published schema 
> (Service: S3, Status Code: 400, Request ID: JTV2BKF1Z2JXAXMM, Extended 
> Request ID: 
> unKlvF+b5nZtUxqdH8Lg2fcTYCswasH/WHc8rRmKnY5cGVVp8J9vbPKX8v2o09aebAjLvoNLcV0=)]
> software.amazon.awssdk.services.s3.model.S3Exception: The XML you provided 
> was not well-formed or did not validate against our published schema 
> (Service: S3, Status Code: 400, Request ID: JTV2BKF1Z2JXAXMM, Extended 
> Request ID: 
> unKlvF+b5nZtUxqdH8Lg2fcTYCswasH/WHc8rRmKnY5cGVVp8J9vbPKX8v2o09aebAjLvoNLcV0=)
>     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.awscore.client.handler.AwsSyncClientHandler$Crc32ValidationResponseHandler.handle(AwsSyncClientHandler.java:95)
>     at 
> software.amazon.awssdk.core.internal.handler.BaseClientHandler.lambda$successTransformationResponseHandler$7(BaseClientHandler.java:270)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.HandleResponseStage.execute(HandleResponseStage.java:40)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.HandleResponseStage.execute(HandleResponseStage.java:30)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptTimeoutTrackingStage.execute(ApiCallAttemptTimeoutTrackingStage.java:72)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptTimeoutTrackingStage.execute(ApiCallAttemptTimeoutTrackingStage.java:42)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.TimeoutExceptionHandlingStage.execute(TimeoutExceptionHandlingStage.java:78)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.TimeoutExceptionHandlingStage.execute(TimeoutExceptionHandlingStage.java:40)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptMetricCollectionStage.execute(ApiCallAttemptMetricCollectionStage.java:52)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallAttemptMetricCollectionStage.execute(ApiCallAttemptMetricCollectionStage.java:37)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage.execute(RetryableStage.java:81)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.RetryableStage.execute(RetryableStage.java:36)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
>     at 
> software.amazon.awssdk.core.internal.http.StreamManagingStage.execute(StreamManagingStage.java:56)
>     at 
> software.amazon.awssdk.core.internal.http.StreamManagingStage.execute(StreamManagingStage.java:36)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.executeWithTimer(ApiCallTimeoutTrackingStage.java:80)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.execute(ApiCallTimeoutTrackingStage.java:60)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallTimeoutTrackingStage.execute(ApiCallTimeoutTrackingStage.java:42)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallMetricCollectionStage.execute(ApiCallMetricCollectionStage.java:48)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.ApiCallMetricCollectionStage.execute(ApiCallMetricCollectionStage.java:31)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.ExecutionFailureExceptionReportingStage.execute(ExecutionFailureExceptionReportingStage.java:37)
>     at 
> software.amazon.awssdk.core.internal.http.pipeline.stages.ExecutionFailureExceptionReportingStage.execute(ExecutionFailureExceptionReportingStage.java:26)
>     at 
> software.amazon.awssdk.core.internal.http.AmazonSyncHttpClient$RequestExecutionBuilderImpl.execute(AmazonSyncHttpClient.java:193)
>     at 
> software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.invoke(BaseSyncClientHandler.java:103)
>     at 
> software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.doExecute(BaseSyncClientHandler.java:171)
>     at 
> software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.lambda$execute$1(BaseSyncClientHandler.java:82)
>     at 
> software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.measureApiCallSuccess(BaseSyncClientHandler.java:179)
>     at 
> software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.execute(BaseSyncClientHandler.java:76)
>     at 
> software.amazon.awssdk.core.client.handler.SdkSyncClientHandler.execute(SdkSyncClientHandler.java:45)
>     at 
> software.amazon.awssdk.awscore.client.handler.AwsSyncClientHandler.execute(AwsSyncClientHandler.java:56)
>     at 
> software.amazon.awssdk.services.s3.DefaultS3Client.completeMultipartUpload(DefaultS3Client.java:639)
>     at 
> org.apache.camel.component.aws2.s3.AWS2S3Producer.processMultiPart(AWS2S3Producer.java:237)
>     at 
> org.apache.camel.component.aws2.s3.AWS2S3Producer.process(AWS2S3Producer.java:95)
>     at 
> org.apache.camel.support.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:66)
>     at 
> org.apache.camel.processor.SendProcessor.process(SendProcessor.java:172)
>     at 
> org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:475)
>     at 
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:196)
>     at 
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:164)
>     at 
> org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:59)
>     at org.apache.camel.processor.Pipeline.process(Pipeline.java:163)
>     at 
> org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:379)
>     at 
> org.apache.camel.component.seda.SedaConsumer.sendToConsumers(SedaConsumer.java:267)
>     at 
> org.apache.camel.component.seda.SedaConsumer.doRun(SedaConsumer.java:186)
>     at org.apache.camel.component.seda.SedaConsumer.run(SedaConsumer.java:129)
>     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:833) {code}
> Specifically, this loop is skipped: 
> [https://github.com/Talend/apache-camel/blob/fe9484bf5236f7af665c35cc7ed29527def8fe48/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java#L209]
> My aws2-s3 component is configured as follows in a springboot application:
> {code:java}
> camel:
>   component:
>     aws2-s3:
>       use-default-credentials-provider: true
>       multi-part-upload: true
>       part-size: 67108864
>  {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to