[ https://issues.apache.org/jira/browse/LOGGING-119?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13553652#comment-13553652 ]
Thomas Neidhart commented on LOGGING-119: ----------------------------------------- Looking at the patch, the original deadlock problem should be fixed by it, but there are other flaws in WeakHashtable that should be addressed: * put and remove have the following code snippet: {noformat} // for performance reasons, only purge every // MAX_CHANGES_BEFORE_PURGE times if (changeCount++ > MAX_CHANGES_BEFORE_PURGE) { purge(); changeCount = 0; } // do a partial purge more often else if (changeCount % PARTIAL_PURGE_COUNT == 0) { purgeOne(); } {noformat} which is not-synchronized, thus the changeCount check may be successful for two concurrent threads at the same time, calling purge / purgeOne multiple times. * the underlying Hashtable is synchronized, while none of the overriden methods are > deadlock on re-registration of logger > ------------------------------------- > > Key: LOGGING-119 > URL: https://issues.apache.org/jira/browse/LOGGING-119 > Project: Commons Logging > Issue Type: Bug > Affects Versions: 1.1.1 > Environment: Java 1.5, Windows > Reporter: Nitzan Niv > Attachments: BugDeadlock.java, Patch-WeakHashtable-1.1.1.txt > > > Reached a deadlock inside common-logging while concurrently re-deploying 2 > WARs. > In each WAR there is an attempt to get a logger: > private final Log logger = LogFactory.getLog(ContextLoader.class); > Thread dump: > [deadlocked thread] Thread-96: > ----------------------------- > Thread 'Thread-96' is waiting to acquire lock > 'java.lang.ref.ReferenceQueue@5266e0' that is held by thread 'Thread-102' > Stack trace: > ------------ > > org.apache.commons.logging.impl.WeakHashtable.purge(WeakHashtable.java:323) > > org.apache.commons.logging.impl.WeakHashtable.rehash(WeakHashtable.java:312) > java.util.Hashtable.put(Hashtable.java:414) > > org.apache.commons.logging.impl.WeakHashtable.put(WeakHashtable.java:242) > > org.apache.commons.logging.LogFactory.cacheFactory(LogFactory.java:1004) > org.apache.commons.logging.LogFactory.getFactory(LogFactory.java:657) > org.apache.commons.logging.LogFactory.getLog(LogFactory.java:685) > > org.springframework.web.context.ContextLoader.<init>(ContextLoader.java:145) > > [deadlocked thread] Thread-102: > ------------------------------ > Thread 'Thread-102' is waiting to acquire lock > 'org.apache.commons.logging.impl. > WeakHashtable@1e02138' that is held by thread 'Thread-96' > Stack trace: > ------------ > java.util.Hashtable.remove(Hashtable.java:437) > > org.apache.commons.logging.impl.WeakHashtable.purgeOne(WeakHashtable.java:338) > > org.apache.commons.logging.impl.WeakHashtable.put(WeakHashtable.java:238) > > org.apache.commons.logging.LogFactory.cacheFactory(LogFactory.java:1004) > org.apache.commons.logging.LogFactory.getFactory(LogFactory.java:657) > org.apache.commons.logging.LogFactory.getLog(LogFactory.java:685) > > org.springframework.web.context.ContextLoader.<init>(ContextLoader.java:145) -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira