[
https://issues.apache.org/jira/browse/CAMEL-26710?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Work on CAMEL-26710 started by shashank.
----------------------------------------
> camel-core - Split EIP with a resume strategy hangs when the watermark cannot
> be evaluated or stored
> ----------------------------------------------------------------------------------------------------
>
> Key: CAMEL-26710
> URL: https://issues.apache.org/jira/browse/CAMEL-26710
> Project: Camel
> Issue Type: Bug
> Components: camel-core
> Reporter: shashank
> Assignee: shashank
> Priority: Major
>
> When a split with {{resumeStrategy}} completes, {{Splitter}} stores the
> watermark in the callback of the split, and only then calls the original
> callback, with no try/finally. If the resume strategy fails in
> {{updateLastOffset}}, {{persistWatermark}} rethrows, the original callback is
> never called, and the reactive executor only logs "Error executing reactive
> work ... This exception is ignored". The caller blocks forever in
> {{DefaultAsyncProcessorAwaitManager.await}}, the exchange stays in flight,
> and only stopping the CamelContext releases it (graceful shutdown times out).
> Every later split on the route hangs the same way. With {{synchronous()}} the
> exception reaches the caller instead.
> This happens for example with {{SingleNodeKafkaResumeStrategy}} after a route
> stop/start, as it keeps the producer it closed on stop (reported separately),
> so {{updateLastOffset}} throws "Cannot perform operation after producer has
> been closed". The {{ResumeStrategy}} SPI declares {{updateLastOffset}} with
> {{throws Exception}}, so any strategy can do this.
> A {{watermarkExpression}} that throws on an item (for example a property that
> the item does not have) hangs the split the same way, as it is evaluated in
> the callback of each item.
> {code:java}
> from("direct:start")
> .split(body()).resumeStrategy(strategyWhoseUpdateLastOffsetThrows, "job")
> .to("mock:split");
> // template.asyncSend("direct:start", List.of("a", "b", "c")).get(5, SECONDS)
> times out:
> // all items reach mock:split, but the exchange never completes
> {code}
> CAMEL-26301 fixed the same pattern (an exception escaping an async callback,
> caller hangs) in {{TokenizerProcessor}}.
> Expected: the split completes with the exception set, so the error handler
> and the caller see a normal failure, and the watermark is not updated, as
> when the split is aborted. As the failed exchange can then be redelivered,
> the watermark should also only be cached in memory after it is stored;
> otherwise the redelivery skips every item and stores nothing.
> _Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)