shashank created CAMEL-26754:
--------------------------------
Summary: camel-cluster - ClusteredRoutePolicy: a route added after
the CamelContext started, with an initial delay, never starts
Key: CAMEL-26754
URL: https://issues.apache.org/jira/browse/CAMEL-26754
Project: Camel
Issue Type: Bug
Components: camel-core
Affects Versions: 4.23.0
Reporter: shashank
Assignee: shashank
Since CAMEL-25089 the {{ClusteredRoutePolicy}} defers the start of its routes
while its initial delay has not elapsed, and only the initial-delay timer sets
the delay as elapsed. The timer is armed when the policy learns that the
CamelContext has started: from the {{CamelContextStartedEvent}}, or from
{{onCamelContextFullyStarted}}. A policy attached to a CamelContext that is
already started gets neither: {{CamelContext.addStartupListener}} only calls
{{onCamelContextStarted(context, true)}}, which the policy ignores, and the
started event was sent before.
So for a route added after start (a route added with {{addRoutes}}, a route
template or kamelet, a reloaded route) with an initial delay:
* if the node is not the leader when the route is added, the route is set to
{{autoStartup=false}};
* when the node becomes the leader, the policy defers the start "until the
initial delay has elapsed", which never happens;
* the route never starts on this node. On a cluster where every node added the
route at runtime, it runs nowhere, also after a failover.
A node that is the leader when the route is added starts it through the route
controller, but once it loses the leadership and takes it again the route is
not started again either.
The {{ClusteredRouteController}} creates such a policy for each route when
{{initialDelay}} is set (documented as "the amount of time the route controller
should wait before to start the routes after the camel context is started"). It
sets the initial delay after the CamelContext, so arming the timer when the
CamelContext is set would not work.
Before CAMEL-25089 (4.23.0) a route added at runtime was started when the node
became the leader (the initial delay did not apply to it). 4.22.x is not
affected.
Expected: a route added after start is started when the node is (or becomes)
the leader, once the initial delay of its policy has elapsed. For a policy
attached after start, the delay can only count from when its first route is
added.
Suggested fix: arm the initial delay in {{onInit}} when the CamelContext is
already started (it still applies once).
Found with Specula (TLA+ model checked against traces of the real 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)