camel-quarkus icon indicating copy to clipboard operation
camel-quarkus copied to clipboard

aws S3 streaming upload random naming strategy always overwrite the initial file (without suffix)

Open jingwang opened this issue 3 years ago • 2 comments

When choosing namingStrategy(AWSS3NamingStrategyEnum.random) and restartingPolicy(AWSS3RestartingPolicyEnum.lastPart), the very first file without any UUID suffix is always overwritten when the application restarts. One would expect in this case it would start with a file with a new UUID suffix.

version:

        <camel-quarkus.version>2.11.0</camel-quarkus.version>
        <quarkus-plugin.version>2.11.1.Final</quarkus-plugin.version>
        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
        <quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id>
        <quarkus.platform.version>2.11.1.Final</quarkus.platform.version>

jingwang avatar Aug 13 '22 02:08 jingwang

@jingwang Thanks for reporting! - can you provide a reproducer or unit test for this issue? I will take a look.

zhfeng avatar Aug 15 '22 01:08 zhfeng

Thanks @zhfeng . Here is the test with docker-compose using localstack:

docker-compose.yaml

version: '3.8'
services:
  localstack:
    image: localstack/localstack:latest
    environment:
      - AWS_DEFAULT_REGION=us-west-2
      - EDGE_PORT=4566
      - SERVICES=s3
    ports:
      - '4566-4583:4566-4583'

Aws2S3Route.java

import org.apache.camel.builder.endpoint.EndpointRouteBuilder;
import org.apache.camel.builder.endpoint.dsl.AWS2S3EndpointBuilderFactory;
import org.apache.camel.component.aws2.s3.stream.AWSS3NamingStrategyEnum;
import org.apache.camel.component.aws2.s3.stream.AWSS3RestartingPolicyEnum;
import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class Aws2S3Route extends EndpointRouteBuilder {
    @Override
    public void configure() throws Exception {

            AWS2S3EndpointBuilderFactory.AWS2S3EndpointProducerBuilder builder = aws2S3("bucket1")
                    .region("us-west-2")
                    .autoCreateBucket(true)
                    .useDefaultCredentialsProvider(true)
                    .streamingUploadMode(true)
                    .overrideEndpoint(true)
                    .uriEndpointOverride("http://localhost:4566")
                    .batchMessageNumber(2)
                    .streamingUploadTimeout(5000)
                    .namingStrategy(AWSS3NamingStrategyEnum.random)
                    .restartingPolicy(AWSS3RestartingPolicyEnum.lastPart)
                    .keyName("file.txt");

            from(cron("test").schedule("0/5 * * * * ?"))
                    .setBody(constant("test message"))
                    .to(builder);
    }
}

pom.xml

...
        <camel-quarkus.version>2.11.0</camel-quarkus.version>
        <quarkus-plugin.version>2.11.1.Final</quarkus-plugin.version>
        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
        <quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id>
        <quarkus.platform.version>2.11.1.Final</quarkus.platform.version>
...
        <dependency>
            <groupId>org.apache.camel.quarkus</groupId>
            <artifactId>camel-quarkus-aws2-s3</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.camel.quarkus</groupId>
            <artifactId>camel-quarkus-cron</artifactId>
        </dependency>

Steps to reproduce:

  • Start docker-compose
> docker-compose up
  • On a separate tab, start application
> export AWS_ACCESS_KEY_ID=accesskey
> export AWS_SECRET_ACCESS_KEY=secretkey
> mvn clean quarkus:dev
  • On a separate tab, monitor the s3 bucket and check the timestamp of file.txt
aws --endpoint-url=http://localhost:4566 s3 ls s3://bucket1 --recursive

Expected: When the application is restarted, the timestamp of file.txt should not change (i.e., it is not overwritten) Actual: Every time when the application is restarted, the timestamp of file.txt changes.

jingwang avatar Aug 15 '22 02:08 jingwang