James Netherton created CAMEL-25620:
---------------------------------------

             Summary: camel-console: ConcurrentModificationException in 
DefaultDevConsoleRegistry.doStart when camel-cli-connector is enabled
                 Key: CAMEL-25620
                 URL: https://issues.apache.org/jira/browse/CAMEL-25620
             Project: Camel
          Issue Type: Bug
            Reporter: James Netherton


h3. Problem

{{DefaultDevConsoleRegistry}} stores its consoles in a {{TreeSet}} with no 
synchronisation. {{doStart()}} iterates the set to start each console, while 
{{register()}} adds to it. {{resolveById()}} calls {{register()}} when it 
resolves a console that is not yet in the set.

When {{camel-cli-connector}} is enabled, the connector schedules its task with 
an initial delay of 0:
{code:java}
scheduledFuture = executor.scheduleWithFixedDelay(this::task, 0, delay, 
TimeUnit.MILLISECONDS);
{code}
That task calls {{DevConsoleRegistry.resolveById(...)}} for several consoles. 
If it runs while the CamelContext is still starting the registry, the iteration 
in {{doStart()}} fails and the CamelContext does not start:
{noformat}
ERROR [org.apache.camel.impl.engine.AbstractCamelContext] Error starting 
CamelContext (camel-2) due to exception thrown: null: 
java.util.ConcurrentModificationException
    at 
java.base/java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1522)
    at java.base/java.util.TreeMap$KeyIterator.next(TreeMap.java:1576)
    at 
org.apache.camel.impl.console.DefaultDevConsoleRegistry.doStart(DefaultDevConsoleRegistry.java:104)
    at org.apache.camel.support.service.BaseService.start(BaseService.java:132)
    at 
org.apache.camel.support.service.ServiceHelper.startService(ServiceHelper.java:129)
    at 
org.apache.camel.impl.engine.DeferServiceStartupListener.doStart(DeferServiceStartupListener.java:63)
    at 
org.apache.camel.impl.engine.DeferServiceStartupListener.onCamelContextStarting(DeferServiceStartupListener.java:49)
    at 
org.apache.camel.impl.engine.AbstractCamelContext.doStartCamel(AbstractCamelContext.java:3152)
    at 
org.apache.camel.impl.engine.AbstractCamelContext.doStartContext(AbstractCamelContext.java:2841)
    at 
org.apache.camel.impl.engine.AbstractCamelContext.doStart(AbstractCamelContext.java:2796)
    at org.apache.camel.support.service.BaseService.start(BaseService.java:132)
    at 
org.apache.camel.impl.engine.AbstractCamelContext.start(AbstractCamelContext.java:2375)
    at 
org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:214)
{noformat}
The failure is intermittent because it depends on thread timing.
h3. Proposed fix

Make the registry safe for concurrent registration. For example:
 * use a concurrent sorted set ({{{}ConcurrentSkipListSet{}}}) for 
{{{}consoles{}}}, or
 * synchronise {{{}register(){}}}, {{{}doStart(){}}}, {{doStop()}} and the 
other methods that iterate {{{}consoles{}}}.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to