Federico Mariani created CAMEL-24144:
----------------------------------------

             Summary: camel-saga: InMemorySagaService never removes 
coordinators - unbounded memory growth
                 Key: CAMEL-24144
                 URL: https://issues.apache.org/jira/browse/CAMEL-24144
             Project: Camel
          Issue Type: Bug
          Components: camel-core
            Reporter: Federico Mariani


h3. Problem

{{InMemorySagaService.newSaga()}} 
(core/camel-support/src/main/java/org/apache/camel/saga/InMemorySagaService.java:54)
 puts every new coordinator into the {{coordinators}} map:

{code:java}
CamelSagaCoordinator coordinator = new InMemorySagaCoordinator(camelContext, 
this, uuid);
coordinators.put(uuid, coordinator);
{code}

Nothing ever removes entries from that map - not on {{complete()}}, not on 
{{compensate()}}, not on timeout. Each {{InMemorySagaCoordinator}} retains its 
step list and all evaluated option values.

h3. Consequence

Any long-running application using the in-memory saga service grows without 
bound: one map entry plus coordinator state per saga, forever.

A secondary effect is that {{getSaga(id)}} happily returns finished 
coordinators, so a stale {{Long-Running-Action}} header can re-join a saga that 
already compensated (it then fails at {{beginStep}} with 
{{IllegalStateException}}).

h3. Suggested fix

Remove the coordinator from the map when it reaches a terminal state 
(COMPENSATED/COMPLETED), e.g. via a callback from the coordinator to the 
service. Note the removal must be deferred until the finalization chain 
actually finishes, since {{doCompensate()}}/{{doComplete()}} run asynchronously 
on the saga executor.

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