-
Bug
-
Resolution: Fixed
-
Major
-
Jenkins 1.598-SNAPSHOT, Docker plugin 0.8
Red Hat 6.6, Java 1.7.0_72
If the Docker plugin adds a node at the same time as CloudRetentionStrategy.check() is done, a deadlock can occur. Here's a thread dump of the thread that's adding a Docker node:
Thread 14552: (state = BLOCKED) - hudson.model.Queue._withLock(java.lang.Runnable) @bci=0, line=1036 (Interpreted frame) - hudson.model.Queue.withLock(java.lang.Runnable) @bci=32, line=984 (Interpreted frame) - hudson.slaves.CloudRetentionStrategy.check(hudson.slaves.AbstractCloudComputer) @bci=67, line=68 (Interpreted frame) - hudson.slaves.CloudRetentionStrategy.check(hudson.model.Computer) @bci=5, line=46 (Interpreted frame) - hudson.slaves.SlaveComputer.setNode(hudson.model.Node) @bci=36, line=661 (Interpreted frame) - hudson.model.AbstractCIBase.updateComputer(hudson.model.Node, java.util.Map, java.util.Set, boolean) @bci=29, line=120 (Interpreted frame) - hudson.model.AbstractCIBase.updateComputerList(boolean) @bci=169, line=180 (Interpreted frame) - jenkins.model.Jenkins.updateComputerList() @bci=4, line=1218 (Interpreted frame) - jenkins.model.Jenkins.setNodes(java.util.List) @bci=13, line=1714 (Interpreted frame) - jenkins.model.Jenkins.addNode(hudson.model.Node) @bci=40, line=1696 (Interpreted frame) - com.nirima.jenkins.plugins.docker.DockerCloud$1.call() @bci=24, line=166 (Interpreted frame) - com.nirima.jenkins.plugins.docker.DockerCloud$1.call() @bci=1, line=160 (Interpreted frame) - jenkins.util.ContextResettingExecutorService$2.call() @bci=18, line=46 (Compiled frame) - java.util.concurrent.FutureTask.run() @bci=42, line=262 (Compiled frame) - java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=95, line=1145 (Compiled frame) - java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=615 (Interpreted frame) - java.lang.Thread.run() @bci=11, line=745 (Interpreted frame)
Based on the comments and change applied for issue JENKINS-26380, I believe the Queue should be locked prior to Jenkins.addNode() being called.