You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Nitzan Niv (JIRA)" <ji...@apache.org> on 2008/01/30 13:39:35 UTC

[jira] Created: (LOGGING-119) deadlock on re-registration of logger

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


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.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (LOGGING-119) deadlock on re-registration of logger

Posted by "Philippe Mouawad (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/LOGGING-119?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Philippe Mouawad updated LOGGING-119:
-------------------------------------

    Attachment: Patch-WeakHashtable-1.1.1.txt

Here is a patch to the deadlock bug.
Philippe.
www.ubik-ingenierie.com

> 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.
-
You can reply to this email to add a comment to the issue online.


[jira] Commented: (LOGGING-119) deadlock on re-registration of logger

Posted by "Ralph Goers (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/LOGGING-119?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12795206#action_12795206 ] 

Ralph Goers commented on LOGGING-119:
-------------------------------------

I also ran the test case on OSX 10.6 with Java 1.6 and can't don't get a deadlock. I also upped the number of threads and the loop count to try to make it happen but was still unable to reproduce it.  Of course, that doesn't mean the bug isn't valid.

> 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.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (LOGGING-119) deadlock on re-registration of logger

Posted by "Philippe Mouawad (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/LOGGING-119?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Philippe Mouawad updated LOGGING-119:
-------------------------------------

    Attachment: BugDeadlock.java

Here is a Test case to reproduce it.
I launch it on a JDK1.6 and it deadlocks each 6 to 10 run.

> 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
>
>
> 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.
-
You can reply to this email to add a comment to the issue online.


[jira] Commented: (LOGGING-119) deadlock on re-registration of logger

Posted by "Dennis Lundberg (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/LOGGING-119?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12795181#action_12795181 ] 

Dennis Lundberg commented on LOGGING-119:
-----------------------------------------

I've tested the Test Case, but it runs without deadlock for me on Java 1.4, 1.5 and 1.6 on Windows.

> 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.
-
You can reply to this email to add a comment to the issue online.


[jira] Commented: (LOGGING-119) deadlock on re-registration of logger

Posted by "Philippe Mouawad (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/LOGGING-119?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12630999#action_12630999 ] 

Philippe Mouawad commented on LOGGING-119:
------------------------------------------

The bug is due to 2 different ways of taking locks :

Purge or purgeOne:
1) locks queue
2) lock this through super.remove

Put the calls super.put()
1) lock this through super.put()
2) call to rehash in super.put()
3) rehash calls purge (which locks queue) => YOU GOT THE DEAD LOCK

The solution is to call super#remove in purge and purgeOne outside of the synchronized (queue) lock.



> 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.
-
You can reply to this email to add a comment to the issue online.