You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (Jira)" <ji...@apache.org> on 2022/09/08 09:45:00 UTC

[jira] [Updated] (CAMEL-18472) deadlock when concurrently adding and removing routes

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

Claus Ibsen updated CAMEL-18472:
--------------------------------
    Fix Version/s: 3.19.0

> 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
>            Priority: Major
>             Fix For: 3.19.0
>
>
> As discussed on users@camel.apache.org, 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(java.base@17.0.3/FutureTask.java:264){}}}{{{}at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.3/ThreadPoolExecutor.java:1136){}}}{{{}at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.3/ThreadPoolExecutor.java:635){}}}{{{}at java.lang.Thread.run(java.base@17.0.3/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(java.base@17.0.3/FutureTask.java:264){}}}{{{}at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.3/ThreadPoolExecutor.java:1136){}}}{{{}at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.3/ThreadPoolExecutor.java:635){}}}{{{}at java.lang.Thread.run(java.base@17.0.3/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(java.base@17.0.3/FutureTask.java:264){}}}{{{}at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.3/ThreadPoolExecutor.java:1136){}}}{{{}at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.3/ThreadPoolExecutor.java:635){}}}{{{}at java.lang.Thread.run(java.base@17.0.3/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)