Hi,

We've been seeing the occasional deadlock in WebappClassLoader and
upgraded to Tomcat 6.0.26 because of
https://issues.apache.org/bugzilla/show_bug.cgi?id=48694.

The fix in 48694 does not seem to have gotten rid of the deadlock
altogether.

Here are 2 threads that are deadlocked. 

 

Name: DefaultQuartzScheduler_Worker-10

State: BLOCKED on java.lang.str...@4352d9c0 owned by:
DefaultQuartzScheduler_Worker-1

Total blocked: 17  Total waited: 152

 

Stack trace: 

org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader
.java:1395)

org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader
.java:1361)

java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

   - locked org.apache.catalina.loader.webappclassloa...@7f1e1bbf

java.lang.ClassLoader.defineClass1(Native Method)

java.lang.ClassLoader.defineClass(ClassLoader.java:621)

java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)

org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappCla
ssLoader.java:2527)

   - locked java.lang.str...@39f9e067

org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader
.java:1010)

org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader
.java:1483)

   - locked java.lang.str...@39f9e067

org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader
.java:1361)

javax.mail.Session.getService(Session.java:765)

javax.mail.Session.getStore(Session.java:579)

javax.mail.Session.getStore(Session.java:541)

javax.mail.Session.getStore(Session.java:520)

com.capeclear.capeconnect.transports.email.server.AbstractMailProtocolRe
ader.getStore(AbstractMailProtocolReader.java:138)

com.capeclear.capeconnect.transports.email.server.AbstractMailProtocolRe
ader.openFolder(AbstractMailProtocolReader.java:444)

com.capeclear.capeconnect.transports.email.server.AbstractMailProtocolRe
ader.getFolder(AbstractMailProtocolReader.java:181)

com.capeclear.capeconnect.transports.email.server.AbstractMailProtocolRe
ader.connect(AbstractMailProtocolReader.java:211)

com.capeclear.capeconnect.transports.email.server.AbstractMailProtocolRe
ader.connect(AbstractMailProtocolReader.java:194)

com.capeclear.capeconnect.transports.email.server.MailReader.accessUnrea
dMail(MailReader.java:48)

com.capeclear.capeconnect.transport.email.EmailInScheduledServerTranspor
t.execute(EmailInScheduledServerTransport.java:156)

   - locked
com.capeclear.capeconnect.transport.email.EmailInScheduledServerTranspor
t...@43fba7ed

com.capeclear.scheduler.impl.QuartzJob.execute(QuartzJob.java:44)

org.quartz.core.JobRunShell.run(JobRunShell.java:202)

org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java
:529)

 

Name: DefaultQuartzScheduler_Worker-1
State: BLOCKED on org.apache.catalina.loader.webappclassloa...@7f1e1bbf
owned by: DefaultQuartzScheduler_Worker-10
Total blocked: 26  Total waited: 153
 
Stack trace: 
java.lang.ClassLoader.checkCerts(ClassLoader.java:752)
java.lang.ClassLoader.preDefineClass(ClassLoader.java:488)
java.lang.ClassLoader.defineClass(ClassLoader.java:615)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappCla
ssLoader.java:2527)
   - locked java.lang.str...@4352d9c0
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader
.java:1010)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader
.java:1483)
   - locked java.lang.str...@4352d9c0
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader
.java:1361)
javax.mail.Session.getService(Session.java:765)
javax.mail.Session.getStore(Session.java:579)
javax.mail.Session.getStore(Session.java:541)
javax.mail.Session.getStore(Session.java:520)
com.capeclear.capeconnect.transports.email.server.AbstractMailProtocolRe
ader.getStore(AbstractMailProtocolReader.java:138)
com.capeclear.capeconnect.transports.email.server.AbstractMailProtocolRe
ader.openFolder(AbstractMailProtocolReader.java:444)
com.capeclear.capeconnect.transports.email.server.AbstractMailProtocolRe
ader.getFolder(AbstractMailProtocolReader.java:181)
com.capeclear.capeconnect.transports.email.server.AbstractMailProtocolRe
ader.connect(AbstractMailProtocolReader.java:211)
com.capeclear.capeconnect.transports.email.server.AbstractMailProtocolRe
ader.connect(AbstractMailProtocolReader.java:194)
com.capeclear.capeconnect.transports.email.server.MailReader.accessUnrea
dMail(MailReader.java:48)
com.capeclear.capeconnect.transport.email.EmailInScheduledServerTranspor
t.execute(EmailInScheduledServerTransport.java:156)
   - locked
com.capeclear.capeconnect.transport.email.EmailInScheduledServerTranspor
t...@3ecddb79
com.capeclear.scheduler.impl.QuartzJob.execute(QuartzJob.java:44)
org.quartz.core.JobRunShell.run(JobRunShell.java:202)
org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java
:529)

 

The issue seems to be rare enough but the name.intern() synchronization
in WebappClassLoader seems not to work in this instance. The first trace
in interesting in that it locks java.lang.str...@39f9e067 but then after
going through java.lang.ClassLoader.defineClass we come back into
WebappClassLoader where name.intern() returns java.lang.str...@4352d9c0.
All I can think of is that java.lang.ClassLoader.defineClass has
modified the name string in some way.

 

The issue is going to be difficult to reproduce but I'll see if I can
find out why the name string changes in the 1st trace. I am using
javamail 1.4.3 and quartz 1.6.0.

 

Would it make sense to use a threadlocal and put a flag on the thread
the first time we lock the name.intern() and then not attempt a lock the
2nd time around? This is the part of the stack trace I am referring to:

 

org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader
.java:1361)

java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

   - locked org.apache.catalina.loader.webappclassloa...@7f1e1bbf

java.lang.ClassLoader.defineClass1(Native Method)

java.lang.ClassLoader.defineClass(ClassLoader.java:621)

java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)

org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappCla
ssLoader.java:2527)

   - locked java.lang.str...@39f9e067

org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader
.java:1010)

org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader
.java:1483)

   - locked java.lang.str...@39f9e067

org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader
.java:1361)

javax.mail.Session.getService(Session.java:765)

 

Any insight would be appreciated.

 

Regards,

PJ Fanning

Reply via email to