[
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