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

Remko Popma updated LOG4J2-471:
-------------------------------

    Fix Version/s: 2.0

> toString methods that perform logging can deadlock AsyncLogger
> --------------------------------------------------------------
>
>                 Key: LOG4J2-471
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-471
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.0-beta9
>         Environment: Debian Squeeze
> Java 7u25
>            Reporter: Anthony Baldocchi
>            Assignee: Remko Popma
>             Fix For: 2.0
>
>         Attachments: LOG4J2-471.patch
>
>
> The AsyncLogger thread is the only consumer of a Disruptor RingBuffer which 
> contains log events ostensibly produced by a number of other threads.  
> However, when AsyncLogger generates a log message, it has to call toString() 
> on objects which can potentially also perform logging internally.  This 
> results in a situation when the RingBuffer is nearly full whereby AsyncLogger 
> has pulled an event from the RingBuffer, calls toString() on the associated 
> objects, which call AsyncLogger.log which attempts to publish an event into a 
> full buffer, which will park repeatedly without hope of ever leaving the 
> loop.  Relevant stack trace is:
> "AsyncLogger-1" daemon prio=10 tid=0x00007f7a705a8000 nid=0x3d73 runnable 
> [0x00007f7a740d1000]
>    java.lang.Thread.State: TIMED_WAITING (parking)
>         at sun.misc.Unsafe.park(Native Method)
>         at 
> java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:349)
>         at 
> com.lmax.disruptor.MultiProducerSequencer.next(MultiProducerSequencer.java:133)
>         at 
> com.lmax.disruptor.MultiProducerSequencer.next(MultiProducerSequencer.java:102)
>         at com.lmax.disruptor.RingBuffer.publishEvent(RingBuffer.java:391)
>         at com.lmax.disruptor.dsl.Disruptor.publishEvent(Disruptor.java:219)
>         at 
> org.apache.logging.log4j.core.async.AsyncLogger.log(AsyncLogger.java:214)
>         at 
> org.apache.logging.log4j.spi.AbstractLoggerWrapper.log(AbstractLoggerWrapper.java:55)
>         at org.slf4j.impl.SLF4JLogger.debug(SLF4JLogger.java:138)
>         at org.somepackage.SomeException.toString (SomeException.java:32)
>         at java.lang.String.valueOf(String.java:2854)
>         at java.io.PrintWriter.println(PrintWriter.java:754)
>         at java.lang.Throwable$WrappedPrintWriter.println(Throwable.java:763)
>         at java.lang.Throwable.printStackTrace(Throwable.java:654)
>         - locked <0x00000000cb2f6380> (a java.io.PrintWriter)
>         at java.lang.Throwable.printStackTrace(Throwable.java:720)
>         at 
> org.apache.logging.log4j.core.pattern.ThrowablePatternConverter.formatOption(ThrowablePatternConverter.java:138)
>         at 
> org.apache.logging.log4j.core.pattern.ThrowablePatternConverter.format(ThrowablePatternConverter.java:80)
>         at 
> org.apache.logging.log4j.core.pattern.ExtendedThrowablePatternConverter.format(ExtendedThrowablePatternConverter.java:69)
>         at 
> org.apache.logging.log4j.core.pattern.PatternFormatter.format(PatternFormatter.java:36)
>         at 
> org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:167)
>         at 
> org.apache.logging.log4j.core.layout.PatternLayout.toSerializable(PatternLayout.java:52)
>         at 
> org.apache.logging.log4j.core.layout.AbstractStringLayout.toByteArray(AbstractStringLayout.java:45)
>         at 
> org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:111)
>         at 
> org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.append(RollingRandomAccessFileAppender.java:96)
>         at 
> org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:99)
>         at 
> org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:425)
>         at 
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:406)
>         at 
> org.apache.logging.log4j.core.Logger$PrivateConfig.logEvent(Logger.java:273)
>         at 
> org.apache.logging.log4j.core.async.AsyncLogger.actualAsyncLog(AsyncLogger.java:230)
>         at 
> org.apache.logging.log4j.core.async.RingBufferLogEvent.execute(RingBufferLogEvent.java:98)
>         at 
> org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:43)
>         at 
> org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:28)
>         at 
> com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:133)
>         at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>         at java.lang.Thread.run(Thread.java:724)



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org
For additional commands, e-mail: log4j-dev-h...@logging.apache.org

Reply via email to