https://issues.apache.org/bugzilla/show_bug.cgi?id=48694
Summary: WebappClassLoader deadlock if web application uses it's own classloader Product: Tomcat 6 Version: 6.0.24 Platform: PC OS/Version: Windows Vista Status: NEW Severity: normal Priority: P2 Component: Catalina AssignedTo: dev@tomcat.apache.org ReportedBy: eugene.petre...@jetbrains.com OS: Windows 7 x64, JRE: 1.5.0_19-b02 (x86) Please see the stacktrace: TOMCAT 6.0.24 DEADLOCK Thread1: 20:32:24 Loading VCS changes for perforce: localhost:1666: UNIT-235 {id=5}; Changes loader 5 {id...@6432, prio=5, in group 'main', status: 'waiting for monitor entry' java.lang.Thread.State: BLOCKED blocks 20:32:24 Loading VCS changes for tfs: https://team-unit.labs.intellij.net:8080 $/Asd {id=3}; Changes loader 4 {id...@6406 blocks 20:32:24 Loading VCS changes for svn: http://89.163.21.152:1777/espresso/svn/dsis/trunk {id=2}; Changes loader 1 {id...@6412 waiting for 20:32:24 Loading VCS changes for tfs: https://team-unit.labs.intellij.net:8080 $/Asd {id=3}; Changes loader 4 {id...@6406 at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2276) at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:976) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1451) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1329) at jetbrains.buildServer.plugins.classLoaders.TeamCityClassLoader.callParentLoadClass(TeamCityClassLoader.java:45) at jetbrains.buildServer.plugins.classLoaders.TeamCityClassLoader.doLoadClass(TeamCityClassLoader.java:60) at jetbrains.buildServer.plugins.classLoaders.TeamCityClassLoader.loadClass(TeamCityClassLoader.java:35) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at jetbrains.buildServer.buildTriggers.vcs.perforce.P4CommandLineConnection.runP4Command(P4CommandLineConnection.java:47) at jetbrains.buildServer.buildTriggers.vcs.perforce.PerforceConnection.runCommand(PerforceConnection.java:161) at jetbrains.buildServer.buildTriggers.vcs.perforce.PerforceConnection.runCommand(PerforceConnection.java:211) at jetbrains.buildServer.buildTriggers.vcs.perforce.PerforceConnection.getCurrentVersion(PerforceConnection.java:264) at jetbrains.buildServer.buildTriggers.vcs.perforce.PerforceSupport.getCurrentVersion(PerforceSupport.java:377) at jetbrains.buildServer.buildTriggers.vcs.VcsChangesLoader.getCurrentVersion(VcsChangesLoader.java:444) at jetbrains.buildServer.vcs.impl.VcsManagerImpl.getVersionsForAllRoots(VcsManagerImpl.java:1145) at jetbrains.buildServer.vcs.impl.VcsManagerImpl.loadChanges(VcsManagerImpl.java:1099) at jetbrains.buildServer.serverSide.impl.auth.SecuredVcsManager.loadChanges(SecuredVcsManager.java:50) at jetbrains.buildServer.serverSide.impl.VcsModificationChecker$1.run(VcsModificationChecker.java:168) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:417) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269) at java.util.concurrent.FutureTask.run(FutureTask.java:123) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676) at java.lang.Thread.run(Thread.java:595) Thread2: 20:32:24 Loading VCS changes for tfs: https://team-unit.labs.intellij.net:8080 $/Asd {id=3}; Changes loader 4 {id...@6406, prio=5, in group 'main', status: 'waiting for monitor entry' java.lang.Thread.State: BLOCKED blocks 20:32:24 Loading VCS changes for perforce: localhost:1666: UNIT-235 {id=5}; Changes loader 5 {id...@6432 blocks Vcs moni...@6389 blocks Alarm (NotificationThread-HangedBuilds)@6498 blocks TeamCity initializat...@1382 waiting for 20:32:24 Loading VCS changes for perforce: localhost:1666: UNIT-235 {id=5}; Changes loader 5 {id...@6432 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1363) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1329) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at jetbrains.buildServer.SimpleCommandLineProcessRunner.runCommandSecure(SimpleCommandLineProcessRunner.java:119) at jetbrains.buildServer.buildTriggers.vcs.tfs.TfsNativeExeRunner.start(TfsNativeExeRunner.java:48) at jetbrains.buildServer.buildTriggers.vcs.tfs.TfsServerNativeExeRunner.start(TfsServerNativeExeRunner.java:96) at jetbrains.buildServer.buildTriggers.vcs.tfs.TfsSupport$1.apply(TfsSupport.java:134) at jetbrains.buildServer.buildTriggers.vcs.tfs.TfsSupport$1.apply(TfsSupport.java:131) at jetbrains.buildServer.buildTriggers.vcs.tfs.TfsLock.doCommand(TfsLock.java:48) at jetbrains.buildServer.buildTriggers.vcs.tfs.TfsSupport.getCurrentVersion(TfsSupport.java:130) at jetbrains.buildServer.buildTriggers.vcs.VcsChangesLoader.getCurrentVersion(VcsChangesLoader.java:444) at jetbrains.buildServer.vcs.impl.VcsManagerImpl.getVersionsForAllRoots(VcsManagerImpl.java:1145) at jetbrains.buildServer.vcs.impl.VcsManagerImpl.loadChanges(VcsManagerImpl.java:1099) at jetbrains.buildServer.serverSide.impl.auth.SecuredVcsManager.loadChanges(SecuredVcsManager.java:50) at jetbrains.buildServer.serverSide.impl.VcsModificationChecker$1.run(VcsModificationChecker.java:168) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:417) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269) at java.util.concurrent.FutureTask.run(FutureTask.java:123) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676) at java.lang.Thread.run(Thread.java:595) As you may notice, Method java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) is synchronized on this, Method org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1451) synchonizes on class name but org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2276) synchronizes in this again! TeamCityClassLoader class delegates to WebappClassLoader as parent classloader in the same way as ClassLoader class does. As workaround I added synchronization on parent classloader in my code. The fix is to make WebappClassLoader#loadClass synchronized -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the assignee for the bug. --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org