From dc33ee0124cab07ac77b1565093911f1b859275e Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 15 Aug 2011 20:33:25 -0700 Subject: [PATCH] Avoiding deadlock between ClassLoader lock and extension loading lock: Java stack information for the threads listed above: =================================================== "Finalizing set up": at hudson.ExtensionList.ensureLoaded(ExtensionList.java:228) - waiting to lock <0x00000007d6e841a0> (a hudson.ExtensionList$Lock) at hudson.ExtensionList.getComponents(ExtensionList.java:147) at hudson.DescriptorExtensionList.load(DescriptorExtensionList.java:181) at hudson.ExtensionList.ensureLoaded(ExtensionList.java:229) - locked <0x00000007d703e9b8> (a hudson.DescriptorExtensionList) at hudson.ExtensionList.size(ExtensionList.java:155) at java.util.AbstractCollection.isEmpty(AbstractCollection.java:69) at hudson.model.labels.LabelAtom.updateTransientActions(LabelAtom.java:106) at hudson.model.labels.LabelAtom.load(LabelAtom.java:188) at jenkins.model.Jenkins.getLabelAtom(Jenkins.java:1501) at jenkins.model.Jenkins.getSelfLabel(Jenkins.java:2295) at hudson.model.Node.getAssignedLabels(Node.java:240) at jenkins.model.Jenkins$15.run(Jenkins.java:2354) at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:146) at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:259) at jenkins.model.Jenkins$5.runTask(Jenkins.java:795) at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:187) at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:94) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) "UpdateCenter.init": at java.lang.ClassLoader.loadClass(ClassLoader.java:291) - waiting to lock <0x000000078313d878> (a java.net.URLClassLoader) at java.lang.ClassLoader.loadClass(ClassLoader.java:295) - locked <0x000000078318ace8> (a hudson.PluginManager$UberClassLoader) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at net.java.sezpoz.IndexItem.element(IndexItem.java:134) at hudson.ExtensionFinder$Sezpoz.scout(ExtensionFinder.java:204) at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:275) at hudson.ExtensionList.load(ExtensionList.java:258) at hudson.ExtensionList.ensureLoaded(ExtensionList.java:229) - locked <0x00000007d6e841a0> (a hudson.ExtensionList$Lock) at hudson.ExtensionList.iterator(ExtensionList.java:136) at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:274) at hudson.ExtensionList.load(ExtensionList.java:258) at hudson.ExtensionList.ensureLoaded(ExtensionList.java:229) - locked <0x00000007d6e841a0> (a hudson.ExtensionList$Lock) at hudson.ExtensionList.iterator(ExtensionList.java:136) at hudson.model.listeners.SaveableListener.fireOnChange(SaveableListener.java:77) at hudson.model.UpdateCenter.save(UpdateCenter.java:416) - locked <0x00000007d68f5ad0> (a hudson.model.UpdateCenter) at hudson.util.PersistedList.onModified(PersistedList.java:152) at hudson.util.PersistedList.add(PersistedList.java:69) at hudson.model.UpdateCenter.load(UpdateCenter.java:446) - locked <0x00000007d68f5ad0> (a hudson.model.UpdateCenter) at hudson.model.UpdateCenter.init(UpdateCenter.java:1255) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at hudson.init.InitializerFinder.invoke(InitializerFinder.java:110) at hudson.init.InitializerFinder$TaskImpl.run(InitializerFinder.java:174) at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:259) at jenkins.model.Jenkins$5.runTask(Jenkins.java:795) at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:187) at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:94) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) "Executor #1 for master : executing test0 #1": at hudson.ExtensionList.ensureLoaded(ExtensionList.java:228) - waiting to lock <0x00000007d6e841a0> (a hudson.ExtensionList$Lock) at hudson.ExtensionList.getComponents(ExtensionList.java:147) at hudson.DescriptorExtensionList.load(DescriptorExtensionList.java:181) at hudson.ExtensionList.ensureLoaded(ExtensionList.java:229) - locked <0x00000007d73c3fb0> (a hudson.DescriptorExtensionList) at hudson.ExtensionList.iterator(ExtensionList.java:136) at hudson.model.User.load(User.java:146) - locked <0x00000007d73c35a0> (a hudson.model.User) at hudson.model.User.(User.java:117) at hudson.model.User.get(User.java:298) - locked <0x00000007832cb6b0> (a java.util.TreeMap) at hudson.model.User.get(User.java:311) at hudson.model.User.current(User.java:323) at hudson.model.Executor.interrupt(Executor.java:125) at hudson.model.Executor.interrupt(Executor.java:114) at sun.misc.Resource.getBytes(Resource.java:133) at java.net.URLClassLoader.defineClass(URLClassLoader.java:257) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) - locked <0x000000078313d878> (a java.net.URLClassLoader) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at hudson.tasks.BuildTrigger.execute(BuildTrigger.java:198) at hudson.model.AbstractBuild$AbstractRunner.cleanUp(AbstractBuild.java:622) at hudson.model.Build$RunnerImpl.cleanUp(Build.java:173) at hudson.model.Run.run(Run.java:1420) at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46) at hudson.model.ResourceController.execute(ResourceController.java:88) at hudson.model.Executor.run(Executor.java:229) --- core/src/main/java/hudson/model/Executor.java | 11 ++++++----- .../main/java/jenkins/model/CauseOfInterruption.java | 4 ++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/hudson/model/Executor.java b/core/src/main/java/hudson/model/Executor.java index f440f8073b..d72ba89b17 100644 --- a/core/src/main/java/hudson/model/Executor.java +++ b/core/src/main/java/hudson/model/Executor.java @@ -122,12 +122,13 @@ public class Executor extends Thread implements ModelObject { */ public void interrupt(Result result) { Authentication a = Jenkins.getAuthentication(); - User u = User.current(); - - if (a!=ACL.SYSTEM && u!=null) - interrupt(result, new UserInterruption(u)); // worth recording who did it - else + if(a instanceof AnonymousAuthenticationToken || a==ACL.SYSTEM) interrupt(result, new CauseOfInterruption[0]); + else { + // worth recording who did it + // avoid using User.get() to avoid deadlock. + interrupt(result, new UserInterruption(a.getName())); + } } /** diff --git a/core/src/main/java/jenkins/model/CauseOfInterruption.java b/core/src/main/java/jenkins/model/CauseOfInterruption.java index 0175508d30..854265e87a 100644 --- a/core/src/main/java/jenkins/model/CauseOfInterruption.java +++ b/core/src/main/java/jenkins/model/CauseOfInterruption.java @@ -74,6 +74,10 @@ public abstract class CauseOfInterruption { this.user = user.getId(); } + public UserInterruption(String userId) { + this.user = userId; + } + public User getUser() { return User.get(user); } -- GitLab