Federico Mariani created CAMEL-24139:
----------------------------------------

             Summary: camel-core - Splitter watermark advances past unprocessed 
items when a streaming split aborts without an exception (data loss on resume)
                 Key: CAMEL-24139
                 URL: https://issues.apache.org/jira/browse/CAMEL-24139
             Project: Camel
          Issue Type: Bug
          Components: camel-core, eip
    Affects Versions: 4.22.0
            Reporter: Federico Mariani


With the new index-based watermark support (CAMEL-23264, unreleased 
4.22.0-SNAPSHOT), when a *streaming* split stops early, 
{{MulticastProcessor.doDone()}} re-iterates the streaming {{SplitterIterable}} 
to release the pooled exchanges ({{MulticastProcessor.java:911-920}}). That 
drain drives the counting iterator to exhaustion, so {{hasNext()}} stores the 
*full raw item count* in {{CamelSplitWatermarkCount}} 
({{Splitter.java:368-375}}) — including items that were never routed.

{{Splitter.updateWatermark()}} only refuses to persist when 
{{exchange.getException() != null}}, so any abort path that leaves the original 
exchange without an exception persists a watermark covering the whole stream:

* {{stopOnException}} + the exception *handled* by the error handler 
({{handled(true)}}) — the stop path sets {{result.set(exchange)}} with no 
exception ({{MulticastProcessor.java:625}});
* {{parallelProcessing}} + {{timeout}} — the timeout path completes the 
multicast without any exception, while unfinished/unsubmitted items are drained.

On the next run every unprocessed item is skipped: *silent data loss* in 
exactly the incremental-processing scenario the watermark feature targets.

*Reproducer (attached, fails on main):* 
{{SplitterWatermarkAdvancesOnAbortIssueTest}} — 5 items, {{streaming()}} + 
{{stopOnException()}} + {{onException(...).handled(true)}}, abort at index 1; 
the stored watermark is {{"4"}} although only item 0 was processed:

{noformat}
org.opentest4j.AssertionFailedError: Watermark advanced past items that were 
never processed (processed=[a]) ==> expected: not equal but was: <4>
{noformat}

(The test reuses the {{SplitterTestResumeStrategy}} helper already in the tree 
from CAMEL-23264.)

Suggested fix direction: capture the raw item count when processing stops (e.g. 
only count items handed out while the multicast task is not done), or mark the 
iterable as aborted before the release drain in {{doDone}} and skip the 
watermark-count capture during the drain.

Since CAMEL-23264 is unreleased, this can still be fixed before 4.22.0 ships.

_Filed by Claude Code on behalf of Federico Mariani (fmariani)_



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

Reply via email to