(Another) Deadlock in LogManager

David M. Lloyd david.lloyd at redhat.com
Thu Oct 31 18:08:22 UTC 2013


Anyone else beginning to get the sense that maybe some brainstorming for 
a more sweeping/complete change to log manager initialization is 
necessary?  I suspect that these deadlocks and init order bugs are just 
going to keep on coming, and every fix seems to add more complexity than 
the last.

On 10/31/2013 12:43 PM, Jeremy Manson wrote:
> Hi folks,
>
> This is against a slightly older version of LogManager, but the problem
> still seems to be there at JDK8 head.  It seems as if the previous fixes
> didn't go far enough?  See stack traces below.  Anyway, I don't see any
> open bugs about it, so I'm reporting it.
>
> Two obvious fixes suggest themselves to me:
>
>   - Lock the LogManager when addLogger(Logger) calls cx.addLocalLogger().
>   This avoids the lock ordering problem, but adds potential contention
> overhead.
>
>   - Don't call drainLoggerRefQueueBounded() if you are reentrantly calling
> addLogger().  You could do something as stupid as having a volatile boolean
> field "calledDrainRecently" that you set on entrance to addLogger and unset
> on exit (assuming you set it).
>
> The first is less sloppy, the second is less overhead.  There are probably
> third and fourth and fifth options, too.
>
> Jeremy
>
> Thread 1:
>      at
> java.util.logging.LogManager.drainLoggerRefQueueBounded(LogManager.java:816)
>         - waiting to lock <0x1b260998> (a java.util.logging.LogManager)
>         at java.util.logging.LogManager.addLogger(LogManager.java:852)
>         at java.util.logging.LogManager.demandLogger(LogManager.java:398)
>         at
> java.util.logging.LogManager$LoggerContext.demandLogger(LogManager.java:478)
>         at
> java.util.logging.LogManager$LoggerContext.processParentHandlers(LogManager.java:604)
>         at
> java.util.logging.LogManager$LoggerContext.addLocalLogger(LogManager.java:540)
>         - locked <0x1b266518> (a java.util.logging.LogManager$LoggerContext)
>         at java.util.logging.LogManager.addLogger(LogManager.java:854)
>         at java.util.logging.LogManager.demandLogger(LogManager.java:398)
>         at java.util.logging.Logger.demandLogger(Logger.java:352)
>         at java.util.logging.Logger.getLogger(Logger.java:399)
>
> Thread 2:
> at
> java.util.logging.LogManager$LoggerContext.findLogger(LogManager.java:482)
>         - waiting to lock <0x1b266518> (a
> java.util.logging.LogManager$LoggerContext)
>         at
> java.util.logging.LogManager.setLevelsOnExistingLoggers(LogManager.java:1362)
>         - locked <0x1b260998> (a java.util.logging.LogManager)
>         at
> java.util.logging.LogManager.readConfiguration(LogManager.java:1121)
>


-- 
- DML



More information about the core-libs-dev mailing list