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

Reply via email to