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)