shashank created CAMEL-26756:
--------------------------------

             Summary: camel-cluster - ClusteredRouteController stops the 
cluster service before the routes have stopped, so another node can take over 
while exchanges are still in flight
                 Key: CAMEL-26756
                 URL: https://issues.apache.org/jira/browse/CAMEL-26756
             Project: Camel
          Issue Type: Bug
          Components: camel-core
            Reporter: shashank
            Assignee: shashank


When the CamelContext stops, it stops its route controller first, and then the 
routes, with the shutdown strategy waiting for the in-flight exchanges (45 
seconds by default). {{ClusteredRouteController.doStop}} stops the cluster 
service. Stopping the service stops its views, which gives up the leadership 
(for example the file lock is released, the Kubernetes lease is no longer 
renewed).

So when the leader is stopped gracefully (a rolling restart, a redeploy) while 
it still has in-flight exchanges, another node can become the leader (on its 
next lock attempt, or once the lease expires) and start the clustered routes 
while this node still processes them, and its consumers may still take new 
messages until they are stopped. For a JMS or file consumer this means two 
nodes consume at the same time, which the clustered route controller is used to 
avoid.

A cluster service that is a service of the CamelContext (the usual setup, and 
the only one the controller looks up) is also stopped by the CamelContext 
itself, after the routes. A cluster service set on the controller with 
{{setClusterService}} is started by the controller, so it must still be stopped 
by it.

With the file lock cluster service, a stopped view also signals the leadership 
as lost (CAMEL-25089); the clustered route policy ignores it while the 
CamelContext stops, but the lock is free for the other nodes.

Expected: the cluster service keeps the leadership until the routes have 
stopped, and is stopped then.

Suggested fix: when the CamelContext is stopping, the controller does not stop 
the cluster service in {{doStop}}, and stops it once the routes have stopped 
({{CamelContextRoutesStoppedEvent}}). A controller stopped on its own still 
stops the service right away.

Found in a code review of the cluster code and confirmed with a test on the 
real classes.

_Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to