Gerda Ilger created CAMEL-18472:
-----------------------------------

             Summary: deadlock when concurrently adding and removing routes
                 Key: CAMEL-18472
                 URL: https://issues.apache.org/jira/browse/CAMEL-18472
             Project: Camel
          Issue Type: Improvement
          Components: came-core
    Affects Versions: 3.7.7, 3.19.0
            Reporter: Gerda Ilger


As discussed on [email protected], i am opening a Jira issue +

We ran into the following issue when dynamically adding and removing ftp 
routes, whose consumers sometimes take a longer time to start up:

Deadlock when concurrently adding and removing routes
 * {{Default/Abstract)CamelContext.addRoutes}} -> 
{{DefaultCamelContext.addRouteDefinitions}} locks {{DefaultModel}} first, and 
is then blocked trying to lock {{DefaultCamelContext}}

 * {{(Default/Abstract)CamelContext.removeRoute}} locks {{DefaultCamelContext}} 
first, and is then blocked trying to lock {{DefaultModel}}

{*}Threaddump{*}:

{{Found one Java-level deadlock:}}
{{=============================}}
{{"pool-2-thread-1":}}
{{waiting to lock monitor 0x00007fd22000b0c0 (object 0x000000068c800170, a 
org.apache.camel.impl.DefaultModel),}}
{{{}which is held by "pool-2-thread-3"{}}}{{{}"pool-2-thread-3":{}}}
{{waiting to lock monitor 0x00007fd21404a130 (object 0x000000068c002a20, a 
org.apache.camel.impl.DefaultCamelContext),}}
{{{}which is held by "pool-2-thread-2"{}}}{{{}"pool-2-thread-2":{}}}
{{waiting to lock monitor 0x00007fd22000b0c0 (object 0x000000068c800170, a 
org.apache.camel.impl.DefaultModel),}}
{{{}which is held by "pool-2-thread-3"{}}}{{{}Java stack information for the 
threads listed above:{}}}
{{===================================================}}
{{"pool-2-thread-1":}}
{{at 
org.apache.camel.impl.DefaultModel.addRouteDefinitions(DefaultModel.java:163)}}
 - {{{}waiting to lock <0x000000068c800170> (a 
org.apache.camel.impl.DefaultModel){}}}{{{}at 
org.apache.camel.impl.DefaultCamelContext.addRouteDefinitions(DefaultCamelContext.java:351){}}}{{{}at
 
org.apache.camel.builder.RouteBuilder.populateRoutes(RouteBuilder.java:723){}}}{{{}at
 
org.apache.camel.builder.RouteBuilder.addRoutesToCamelContext(RouteBuilder.java:569){}}}{{{}at
 
org.apache.camel.impl.engine.AbstractCamelContext.addRoutes(AbstractCamelContext.java:1186){}}}{{{}at
 
org.apache.camel.impl.DynamicallyConcurrentlyAddRoutesTest.lambda$1(DynamicallyConcurrentlyAddRoutesTest.java:64){}}}{{{}at
 
org.apache.camel.impl.DynamicallyConcurrentlyAddRoutesTest$$Lambda$487/0x00000008002c52d0.call(Unknown
 Source){}}}{{{}at 
java.util.concurrent.FutureTask.run([email protected]/FutureTask.java:264){}}}{{{}at
 
java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1136){}}}{{{}at
 
java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:635){}}}{{{}at
 
java.lang.Thread.run([email protected]/Thread.java:833){}}}{{{}"pool-2-thread-3":{}}}{{{}at
 
org.apache.camel.impl.engine.AbstractCamelContext.removeRoute(AbstractCamelContext.java:1400){}}}
 - {{{}waiting to lock <0x000000068c002a20> (a 
org.apache.camel.impl.DefaultCamelContext){}}}{{{}at 
org.apache.camel.impl.DefaultModel.removeRouteDefinition(DefaultModel.java:212){}}}
 - {{{}locked <0x000000068c800170> (a 
org.apache.camel.impl.DefaultModel){}}}{{{}at 
org.apache.camel.impl.DefaultModel.removeRouteDefinitions(DefaultModel.java:201){}}}
 - {{{}locked <0x000000068c800170> (a 
org.apache.camel.impl.DefaultModel){}}}{{{}at 
org.apache.camel.impl.DefaultModel.addRouteDefinitions(DefaultModel.java:179){}}}
 - {{{}locked <0x000000068c800170> (a 
org.apache.camel.impl.DefaultModel){}}}{{{}at 
org.apache.camel.impl.DefaultCamelContext.addRouteDefinitions(DefaultCamelContext.java:351){}}}{{{}at
 
org.apache.camel.builder.RouteBuilder.populateRoutes(RouteBuilder.java:723){}}}{{{}at
 
org.apache.camel.builder.RouteBuilder.addRoutesToCamelContext(RouteBuilder.java:569){}}}{{{}at
 
org.apache.camel.impl.engine.AbstractCamelContext.addRoutes(AbstractCamelContext.java:1186){}}}{{{}at
 
org.apache.camel.impl.DynamicallyConcurrentlyAddRoutesTest.lambda$1(DynamicallyConcurrentlyAddRoutesTest.java:64){}}}{{{}at
 
org.apache.camel.impl.DynamicallyConcurrentlyAddRoutesTest$$Lambda$487/0x00000008002c52d0.call(Unknown
 Source){}}}{{{}at 
java.util.concurrent.FutureTask.run([email protected]/FutureTask.java:264){}}}{{{}at
 
java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1136){}}}{{{}at
 
java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:635){}}}{{{}at
 
java.lang.Thread.run([email protected]/Thread.java:833){}}}{{{}"pool-2-thread-2":{}}}{{{}at
 
org.apache.camel.impl.DefaultModel.getRouteDefinition(DefaultModel.java:237){}}}
 - {{{}waiting to lock <0x000000068c800170> (a 
org.apache.camel.impl.DefaultModel){}}}{{{}at 
org.apache.camel.impl.DefaultCamelContext.getRouteDefinition(DefaultCamelContext.java:343){}}}{{{}at
 
org.apache.camel.impl.DefaultCamelContext.removeRoute(DefaultCamelContext.java:959){}}}
 - {{{}locked <0x000000068c002a20> (a 
org.apache.camel.impl.DefaultCamelContext){}}}{{{}at 
org.apache.camel.impl.engine.AbstractCamelContext.removeRoute(AbstractCamelContext.java:1400){}}}
 - {{{}locked <0x000000068c002a20> (a 
org.apache.camel.impl.DefaultCamelContext){}}}{{{}at 
org.apache.camel.impl.DynamicallyConcurrentlyAddRoutesTest.lambda$1(DynamicallyConcurrentlyAddRoutesTest.java:77){}}}{{{}at
 
org.apache.camel.impl.DynamicallyConcurrentlyAddRoutesTest$$Lambda$487/0x00000008002c52d0.call(Unknown
 Source){}}}{{{}at 
java.util.concurrent.FutureTask.run([email protected]/FutureTask.java:264){}}}{{{}at
 
java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1136){}}}{{{}at
 
java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:635){}}}{{{}at
 java.lang.Thread.run([email protected]/Thread.java:833){}}}

{{Found 1 deadlock.}}

My JUnit test executed successfully when I changed {{DefaultCamelContext}} to 
obtain the lock on {{model}} before locking {{camelContext}} in 
{{{}removeRoute{}}}.



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

Reply via email to