[logback-dev] About LBCORE-224...

Joern Huxhorn jhuxhorn at googlemail.com
Mon Oct 3 19:09:04 CEST 2011

On 30.09.2011, at 19:09, Holger Hoffstaette wrote:

> On Fri, 30 Sep 2011 18:36:54 +0200, Ceki Gülcü wrote:
>> I don't see how anything a caller of logback, in this case zookeeper,
>> could do to cause the readLock to be unlocked before it is locked.
>> Actually, how could you trigger the observed behavior even if you wanted
>> to trigger it on purpose? Do you have any ideas?
> The most common cause seems to be a swallowed inner exception. Several
> other findings seem to support this:
> http://java.net/jira/browse/GLASSFISH-1881

They had a bug in their codebase that they subsequently fixed.

> http://lists.terracotta.org/pipermail/ehcache-list/2011-July/thread.html

They extended ReentrantReadWriteLock in a rather complex way and I'm pretty sure that they simply made a mistake somewhere.
See https://fisheye2.atlassian.com/browse/ehcache/tags/ehcache-core-2.4.2/src/main/java/net/sf/ehcache/store/compound/Segment.java?hb=true
I don't want to examine 909 lines of code to find the real reason of their issue.

> http://cs.oswego.edu/pipermail/concurrency-interest/2006-June/002738.html
> See last one for a good example.

I can see the reason for that exception perfectly well. They just misused the locks.

> Curiously it seems that this problem reared its head some time ago:
> http://qos.ch/pipermail/logback-dev/2009-February/003620.html
> though I think that was more about safe lock usage, which seems to be
> addressed now.
> Maybe somehow there _is_ a silent exception happening between
> Logger.appendLoopOnAppenders() and AAI, since it also appears on the
> JIRA's stack trace? I'm not familiar enough with logback's internals to
> make more educated guesses right now.
> The only thing I can immediately think of would be some weird recursive
> logging from a threaded appender, with bits of StackOverflow (maybe
> causing more logging..) thrown in.
> -h

I checked all the links above and they are all doing way more complex stuff.

The method in question is very, very simple:

  public int appendLoopOnAppenders(E e) {
    int size = 0;
    try {
      for (Appender<E> appender : appenderList) {
    } finally {
    return size;

There is simply *no* way this exception should be able to happen.
r is a private final variable so, assuming no one is accessing that variable maliciously via reflection, locking is guaranteed to be symmetric. Usage of variable r in the rest of the class is also correct.

I'm just baffled by this issue. And I hate being baffled by something that is very obviously correct.
Yes, it's easy to make a mistake but there is just no apparent problem in the previous implementation of AppenderAttachableImpl. I triple-checked it.

This leaves only two options:
I either fundamentally misunderstand something about java concurrency (which I would be very eager to rectify!) or there is a serious bug in either the implementation of (at least unfair) ReentrantReadWriteLock and/or some Java VMs (which makes me highly nervous).


More information about the logback-dev mailing list