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

Work on CAMEL-26885 started by shashank.
----------------------------------------
> camel-core - Supervising route controller: the routes and nonSupervisedRoutes 
> sets are not thread-safe
> ------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-26885
>                 URL: https://issues.apache.org/jira/browse/CAMEL-26885
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Minor
>
> Follow-up of the supervising route controller deadlock fix (CAMEL-26448).
> {{DefaultSupervisingRouteController}} keeps the routes it controls in a 
> {{TreeSet}} ({{routes}}) and the routes it does not supervise in a 
> {{HashSet}} ({{nonSupervisedRoutes}}). Both are changed and read from several 
> threads without one lock:
> * {{ManagedRoutePolicy.onInit}} adds to both without a lock (a route added at 
> runtime, Kamelets, route templates); {{onRemove}} removes under the policy's 
> own {{BaseService}} lock, not the controller lock;
> * {{startRoute}} / {{stopRoute}} / {{suspendRoute}} / {{resumeRoute}} and 
> {{getControlledRoutes()}} stream {{routes}} without a lock (JMX, the control 
> bus, the developer console, a route reload);
> * {{getNonControlledRouteIds()}} hands out a live (unmodifiable) view of the 
> {{HashSet}}, so a caller that iterates it while a route is added gets a 
> {{ConcurrentModificationException}}.
> A route added or removed while another thread looks up a route can fail with 
> a {{ConcurrentModificationException}} (or {{IllegalStateException: Accept 
> exceeded fixed size}} from {{toList()}}), or miss a route that is there, so 
> it is started without the supervision.
> Also, an exhausted restart task can still put a route that is being removed 
> into {{exhausted}}: CAMEL-26448 narrowed this (the callback checks under the 
> controller lock that the task is still the restart task of the route), but 
> {{onRemove}} releases the route under the policy lock, so it can run between 
> that check and the put; the removed route then stays exhausted (and 
> unhealthy). This part is left for a follow-up.
> *Proposal*: concurrent collections ({{ConcurrentSkipListSet}} with the same 
> ordering, {{ConcurrentHashMap.newKeySet()}}) rather than more locking (taking 
> the controller lock in {{onInit}} runs under the route lock of the 
> CamelContext, see CAMEL-26448).
> _Filed with Claude Code on behalf of allthingssecurity._



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

Reply via email to