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

Claus Ibsen closed CAMEL-24145.
-------------------------------
    Resolution: Fixed

> camel-saga: InMemorySagaCoordinator compensate()/complete() return 
> already-completed futures - finalization failures never propagate
> ------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-24145
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24145
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>            Reporter: Federico Mariani
>            Assignee: Claus Ibsen
>            Priority: Major
>             Fix For: 4.22.0
>
>
> h3. Problem
> {{InMemorySagaCoordinator.compensate()}} and {{complete()}} 
> (core/camel-support/src/main/java/org/apache/camel/saga/InMemorySagaCoordinator.java:122-155)
>  kick off {{doCompensate()}}/{{doComplete()}} - an async chain running on the 
> saga executor - and then unconditionally:
> {code:java}
> return CompletableFuture.completedFuture(null);
> {code}
> h3. Consequence
> * The error handling written around these calls is dead code with the 
> in-memory service: {{SagaProcessor.handleSagaCompletion}} does 
> {{coordinator.complete(exchange).whenComplete((done, ex) -> 
> ifNotException(ex, ...))}} (SagaProcessor.java:89-101), and {{SagaProducer}} 
> ({{saga:complete}}/{{saga:compensate}}) does the same - but {{ex}} can never 
> be non-null and the future is already done. The exchange finishes before any 
> completion/compensation endpoint has been invoked even once, and a completion 
> endpoint that fails all retries never fails or flags anything beyond a WARN 
> log.
> * Semantics diverge from camel-lra, where {{complete()}}/{{compensate()}} 
> return the coordinator HTTP call future and a rejected close/cancel fails the 
> exchange.
> * Callers of a saga route get their reply before the completion callbacks ran 
> - an observable ordering difference vs LRA and a source of test flakiness.
> h3. Suggested fix
> Deliberate asynchrony is defensible for the compensation *retries* (5 x 5s by 
> default must not block the failing exchange), but the returned future should 
> at least reflect the outcome of the first finalization attempt (or the state 
> transition validation), and the async contract of {{CamelSagaCoordinator}} 
> should be documented so both implementations agree.
> Found during a broader Saga EIP / camel-lra code review (July 2026).
> _Claude Code on behalf of Croway_



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

Reply via email to