shashank created CAMEL-26799:
--------------------------------
Summary: camel-cluster - ClusteredRoutePolicy: a route is never
started when the leadership is taken before the route can be started
Key: CAMEL-26799
URL: https://issues.apache.org/jira/browse/CAMEL-26799
Project: Camel
Issue Type: Bug
Components: camel-core
Reporter: shashank
Assignee: shashank
{{ClusteredRoutePolicy}} sets its leader flag when it takes the leadership and
then starts its routes; only a later leadership change starts or stops them
again. When that start does nothing, the leader never runs the route. Three
cases:
*Leadership taken before the policy started.* A cluster service started on its
own (for example created by the application and passed to
{{ClusteredRoutePolicy.forNamespace(service, namespace)}}), whose view is
already the leader when the routes are created: the policy takes the leadership
when it gets the view, while it is not started yet. The start of the routes
then returns at once ({{isRunAllowed()}} is false), and, unlike during the
start of the CamelContext, nothing defers it until the CamelContext has
started. The route stays stopped on the leader.
*Leadership taken while a route is added at runtime.* A route created while
this node is not the leader is marked {{autoStartup=false}}. If the node
becomes the leader before the route is added to the CamelContext, the policy
thread calls {{startRoute}} for a route id the CamelContext does not know yet,
which does nothing, and records the route as started. The route is then added
with {{autoStartup=false}}, and stays stopped.
*Route removed while the policy starts it.* {{startRoute}} on the policy thread
waits for the route lock that {{removeRoute}} holds, then does nothing, and the
removed route is recorded as started again. A route added later with the same
id (not managed by the policy) is stopped by the policy when the node loses the
leadership.
Expected: the leader starts the routes of the policy once they can be started,
and the policy does not keep a removed route.
Suggested fix: defer the start until the CamelContext has started when the
policy is not started yet; skip a route that is not added to the CamelContext
yet and start it on its {{RouteAddedEvent}} when the node is the leader; record
a route as started only when it is still the route of the CamelContext after
{{startRoute}}.
Found with Specula (TLA+ model checked against traces of the real code) and
confirmed with tests on the real classes.
_Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)