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: [email protected]
ReportedBy: [email protected]
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: [email protected]
For additional commands, e-mail: [email protected]