[ 
https://issues.apache.org/jira/browse/CAMEL-25785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Claus Ibsen updated CAMEL-25785:
--------------------------------
    Fix Version/s: 4.24.0

> camel-aws2-s3 - streaming upload with timestampGroupingEnabled replaces the 
> object of a time window when the window is uploaded again 
> (batchMessageNumber, batchSize, streamingUploadTimeout), so the earlier 
> messages of the window are lost
> ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25785
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25785
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-aws2
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Major
>             Fix For: 4.24.0
>
>
> {{AWS2S3StreamUploadProducer.processWithTimestampGrouping}} (main 
> 7aae27315946, lines 336-450) names the object of a time window with 
> {{generateTimestampBasedFileName(fileName, extension, timestampWindow)}}, 
> which depends only on the window: 
> {{grouped-messages_20240101_0800_0800-0805.txt}}. The upload of a window is 
> completed, and the window removed from {{timestampBasedUploads}}, when it 
> reaches {{batchMessageNumber}} messages (default 10) or {{batchSize}} bytes 
> (lines 418-436), and by the {{streamingUploadTimeout}} task (lines 133-170). 
> The next message of the same window then starts a new multipart upload with 
> the *same key*, and when that upload completes S3 replaces the first object 
> with it:
> {code:java}
> if (!timestampBasedUploads.containsKey(timestampWindow)) {
>     UploadState newState = new UploadState();
>     ...
>     newState.dynamicKeyName = generateTimestampBasedFileName(fileName, 
> extension, timestampWindow);
> {code}
> So every message of the earlier uploads of the window is lost (unless the 
> bucket is versioned), and every exchange completed normally with the ETag of 
> an object that is replaced later. The example of the component documentation 
> (aws2-s3-streaming.adoc, "Timestamp Grouping": a timer every 10 seconds, 
> {{timestampWindowSizeMillis=300000}}, default {{batchMessageNumber}}) sends 
> 30 messages per window: the window is uploaded after the 10th, 20th and 30th 
> message, and the bucket keeps only the last 10. The documentation says the 
> feature writes the messages of a window "to the same S3 file"; it says 
> nothing of objects being replaced. The progressive, random and timestamp 
> naming strategies of the non-grouped mode do give each upload its own key.
> *Fix*: the producer counts the completed uploads of each window (under its 
> lock; an access-ordered map bounded to the last 10000 windows), and a later 
> upload of a window gets that count after the time range: 
> {{grouped-messages_20240101_0800_0800-0805-1.txt}}, {{-2}}, ... The first 
> upload of a window keeps its name. Documentation of the naming in 
> aws2-s3-streaming.adoc, and a note in the 4.24 upgrade guide (the key of the 
> second and later objects of a window is new).
> *Tests*: new {{AWS2S3StreamUploadTimestampWindowOverwriteTest}} (mocked 
> {{S3Client}} that keeps completed objects by key, like a bucket). 
> {{everyMessageOfAWindowIsStoredWhenTheWindowIsUploadedMoreThanOnce}} (the 
> documentation example, 30 messages in one window) fails on main: {{each 
> upload of the window must be its own object, but the bucket has 
> [grouped-messages_20240101_0800_0800-0805.txt] ==> expected: <3> but was: 
> <1>}}. 
> {{everyMessageOfAWindowIsStoredWhenTheTimeoutUploadsTheWindowBeforeItEnds}} 
> (the timeout task runs in the middle of a window) fails on main: {{expected: 
> <2> but was: <1>}}. {{theFirstUploadOfAWindowKeepsItsName}} passes on main 
> and with the fix. {{AWS2S3StreamUploadProducerTimestampTest}} is adapted to 
> the new signature of the name method and checks the suffix. camel-aws2-s3 
> unit tests: 107 run, 0 failures.
> *How it was found*: variant analysis of CAMEL-25781 (pattern: a batch window 
> completed by a size or count limit or a timer while the window is still open; 
> what happens to the next item of that window), then the JUnit test.
> *Affected*: main, camel-4.23.x, camel-4.22.x and camel-4.18.x (the same 
> naming in {{processWithTimestampGrouping}}; read, not run). Not run against 
> S3.
> _Filed with Claude Code on behalf of allthingssecurity._



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

Reply via email to