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

Yanming Zhou closed LOG4J2-3687.
--------------------------------
    Resolution: Duplicate

> Appender may caused deadlock on AsyncLoggerDisruptor
> ----------------------------------------------------
>
>                 Key: LOG4J2-3687
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-3687
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Appenders
>    Affects Versions: 2.20.0
>            Reporter: Yanming Zhou
>            Priority: Blocker
>
> Log operation is blocked when the RingBuffer is full, then waiting for 
> appender to consume LogEvent's from the RingBuffer, but the appender itself 
> may operate logging before the consumption to trigger deadlock.
>  
> Here is my actual case in production, I'm using kafka appender, the kafka 
> client logging caused deadlock, see 
> [TransactionManager.java|https://github.com/apache/kafka/blob/f9e30289d96b6c096c2bad44d714200e4c34cc04/clients/src/main/java/org/apache/kafka/clients/producer/internals/TransactionManager.java#L503]
> {code:java}
> "kafka-producer-network-thread | producer-1" #44 daemon prio=5 os_prio=0 
> tid=0x00007f468310c800 nid=0x256255 waiting for monitor entry 
> [0x00007f467ad6c000]
>    java.lang.Thread.State: BLOCKED (on object monitor)
>     at 
> org.apache.logging.log4j.core.async.AsyncLoggerDisruptor.enqueueLogMessageWhenQueueFull(AsyncLoggerDisruptor.java:246)
>     - waiting to lock <0x0000000701070490> (a java.lang.Object)
>     at 
> org.apache.logging.log4j.core.async.AsyncLogger.handleRingBufferFull(AsyncLogger.java:246)
>     at 
> org.apache.logging.log4j.core.async.AsyncLogger.publish(AsyncLogger.java:230)
>     at 
> org.apache.logging.log4j.core.async.AsyncLogger.logWithThreadLocalTranslator(AsyncLogger.java:202)
>     at 
> org.apache.logging.log4j.core.async.AsyncLogger.access$100(AsyncLogger.java:67)
>     at 
> org.apache.logging.log4j.core.async.AsyncLogger$1.log(AsyncLogger.java:157)
>     at 
> org.apache.logging.log4j.core.async.AsyncLogger.logMessage(AsyncLogger.java:130)
>     at org.apache.logging.slf4j.Log4jLogger.log(Log4jLogger.java:378)
>     at 
> org.apache.kafka.common.utils.LogContext$LocationAwareKafkaLogger.writeLog(LogContext.java:434)
>     at 
> org.apache.kafka.common.utils.LogContext$LocationAwareKafkaLogger.info(LogContext.java:387)
>     at 
> org.apache.kafka.clients.producer.internals.TransactionManager.setProducerIdAndEpoch(TransactionManager.java:505)
>     at 
> org.apache.kafka.clients.producer.internals.TransactionManager.bumpIdempotentProducerEpoch(TransactionManager.java:542)
>     at 
> org.apache.kafka.clients.producer.internals.TransactionManager.bumpIdempotentEpochAndResetIdIfNeeded(TransactionManager.java:559)
>     - locked <0x00000007016c0898> (a 
> org.apache.kafka.clients.producer.internals.TransactionManager)
>     at 
> org.apache.kafka.clients.producer.internals.Sender.runOnce(Sender.java:330)
>     at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:247)
>     at java.lang.Thread.run(Thread.java:748) {code}
> {code:java}
> "http-nio-8080-exec-273" #3682 daemon prio=5 os_prio=0 tid=0x00007f465b422800 
> nid=0x2908d3 runnable [0x00007f4648b48000]    java.lang.Thread.State: 
> TIMED_WAITING (parking)     at sun.misc.Unsafe.park(Native Method)     at 
> java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:338)     at 
> com.lmax.disruptor.MultiProducerSequencer.next(MultiProducerSequencer.java:136)
>      at 
> com.lmax.disruptor.MultiProducerSequencer.next(MultiProducerSequencer.java:105)
>      at com.lmax.disruptor.RingBuffer.publishEvent(RingBuffer.java:465)     
> at com.lmax.disruptor.dsl.Disruptor.publishEvent(Disruptor.java:331)     at 
> org.apache.logging.log4j.core.async.AsyncLoggerDisruptor.enqueueLogMessageWhenQueueFull(AsyncLoggerDisruptor.java:247)
>      - locked <0x0000000701070490> (a java.lang.Object)     at 
> org.apache.logging.log4j.core.async.AsyncLogger.handleRingBufferFull(AsyncLogger.java:246)
>      at 
> org.apache.logging.log4j.core.async.AsyncLogger.publish(AsyncLogger.java:230) 
>     at 
> org.apache.logging.log4j.core.async.AsyncLogger.logWithThreadLocalTranslator(AsyncLogger.java:225)
>      at 
> org.apache.logging.log4j.core.async.AsyncLogger.access$000(AsyncLogger.java:67)
>      at 
> org.apache.logging.log4j.core.async.AsyncLogger$1.log(AsyncLogger.java:152)   
>   at 
> org.apache.logging.log4j.core.async.AsyncLogger.log(AsyncLogger.java:136)     
> at 
> org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2168)
>      at 
> org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2122)
>      at 
> org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2105)
>      at 
> org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:1997)
>      at 
> org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1862)
>      at org.apache.logging.slf4j.Log4jLogger.info(Log4jLogger.java:185)
> {code}
> My proposal is discarding LogEvent from appenders if the RingBuffer is full.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to