[ 
https://issues.apache.org/jira/browse/LOGGING-119?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Thomas Neidhart resolved LOGGING-119.
-------------------------------------

       Resolution: Fixed
    Fix Version/s: 1.1.2

Applied a modified patch in r1435077.

The following changes have been made:

 * synchronize the put and remove methods to prevent issues with changeCount 
and the actual bug wrt purge / purgeOne. The call to super.put() will be 
synchronized anyway, so there should be no performance hit. This already solves 
the bug.
 * apply the idea from the patch to the purge method, as it is also used in 
non-synchronized methods like values(), elements(). These methods are not 
actually used in commons-logging, but this has been added to prevent any future 
problems in case this changes. The method purgeOne has been kept as is, as it 
is only used in the now synchronized put and remove methods.
                
> 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
>             Fix For: 1.1.2
>
>         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

Reply via email to