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

Ralph Goers resolved LOG4J2-278.
--------------------------------

       Resolution: Fixed
    Fix Version/s: 2.0-beta8
    
> Embedded Flume agent fails to rollback
> --------------------------------------
>
>                 Key: LOG4J2-278
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-278
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Flume Appender
>    Affects Versions: 2.0-beta7
>            Reporter: Edward Sargisson
>             Fix For: 2.0-beta8
>
>         Attachments: flume-embedded-web-flume-2067.tar.gz
>
>
> If the embedded Flume agent decides to rollback (for example, because the 
> succeeding node is full) then that rollback fails. It appears that this is 
> because of Flume code attempting to recursively send log events. i.e. where 
> other Log4j2 appenders use StatusLogger the embedded Flume agent does not.
> Steps:
> 1. Setup a Flume agent as the succeeding agent and convince it to fill its 
> queue. (In my case, I can make it run out of memory then the queue fills 
> which makes it refuse to accept more messages.)
> 2. Extract the attached code (a very simple Jetty server) and modify the 
> log4j2.xml to have embedded=true for the FlumeAppender
> 3. Run the attached code
> Expected result:
> The embedded agent should queue messages.
> Actual result:
> 2013-06-10 14:39:11,173 ERROR An exception occurred processing Appender 
> FlumeAppender java.lang.IllegalStateException: rollback() called when 
> transaction is COMPLETED! identityHashCode=1164913745
>       at 
> com.google.common.base.Preconditions.checkState(Preconditions.java:172)
>       at 
> org.apache.flume.channel.BasicTransactionSemantics.rollback(BasicTransactionSemantics.java:171)
>       at 
> org.apache.flume.channel.ChannelProcessor.processEvent(ChannelProcessor.java:269)
>       at 
> org.apache.logging.log4j.flume.appender.Log4jEventSource.send(Log4jEventSource.java:59)
>       at 
> org.apache.logging.log4j.flume.appender.FlumeEmbeddedManager.send(FlumeEmbeddedManager.java:123)
>       at 
> org.apache.logging.log4j.flume.appender.FlumeAppender.append(FlumeAppender.java:86)
>       at 
> org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:102)
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:424)
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:405)
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:366)
>       at org.apache.logging.log4j.core.Logger.log(Logger.java:110)
>       at 
> org.apache.logging.log4j.spi.AbstractLoggerWrapper.log(AbstractLoggerWrapper.java:55)
>       at org.slf4j.impl.SLF4JLogger.debug(SLF4JLogger.java:139)
>       at org.apache.flume.channel.file.Log.rollback(Log.java:566)
>       at 
> org.apache.flume.channel.file.FileChannel$FileBackedTransaction.doRollback(FileChannel.java:590)
>       at 
> org.apache.flume.channel.BasicTransactionSemantics.rollback(BasicTransactionSemantics.java:179)
>       at org.apache.flume.sink.AvroSink.process(AvroSink.java:316)
>       at 
> org.apache.flume.sink.FailoverSinkProcessor.process(FailoverSinkProcessor.java:182)
>       at org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:147)
>       at java.lang.Thread.run(Thread.java:722)
> (note the identityHashCode is from my own modifications for debugging but 
> does not affect this repro).
> The initial problem is in org.apache.flume.channel.file.Log line 566 where, 
> during a rollback, it logs that it's rolling back. Flume transactions are 
> held in a thread local. That transaction is open, then the rollback is 
> attempted, which hits Log line 566, so a log write is attempted, which gets 
> the same transaction, which is already open, which causes the exception.
> If I explicitly set the logging on org.apache.flume.channel.file.Log to warn 
> then I get:
> 013-06-10 15:25:25,673 WARN  
> [SinkRunner-PollingRunner-FailoverSinkProcessor-1241018503] 
> appender.Log4jEventSource (Log4jEventSource.java:61) - Unabled to process 
> event {}[Event headers = {timeStamp=1370903125671, 
> guId=a5c6c2bf-d21c-11e2-a12c-24be05270b5c}, body.length = 216 ]
> org.apache.flume.ChannelException: Unable to put event on required channel: 
> FileChannel primary { dataDirs: 
> [/var/local/flume/castellan-reader-berkeley-db/data] }txn: 1638840125
>       at 
> org.apache.flume.channel.ChannelProcessor.processEvent(ChannelProcessor.java:275)
>  ~[flume-ng-core-1.3.1-SIN124-SNAPSHOT.jar:1.3.1-SIN124-SNAPSHOT]
>       at 
> org.apache.logging.log4j.flume.appender.Log4jEventSource.send(Log4jEventSource.java:59)
>  [log4j-flume-ng-2.0-beta7.jar:2.0-beta7]
>       at 
> org.apache.logging.log4j.flume.appender.FlumeEmbeddedManager.send(FlumeEmbeddedManager.java:123)
>  [log4j-flume-ng-2.0-beta7.jar:2.0-beta7]
>       at 
> org.apache.logging.log4j.flume.appender.FlumeAppender.append(FlumeAppender.java:86)
>  [log4j-flume-ng-2.0-beta7.jar:2.0-beta7]
>       at 
> org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:102)
>  [log4j-core-2.0-beta7.jar:2.0-beta7]
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:424)
>  [log4j-core-2.0-beta7.jar:2.0-beta7]
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:405) 
> [log4j-core-2.0-beta7.jar:2.0-beta7]
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:366) 
> [log4j-core-2.0-beta7.jar:2.0-beta7]
>       at org.apache.logging.log4j.core.Logger.log(Logger.java:110) 
> [log4j-core-2.0-beta7.jar:2.0-beta7]
>       at 
> org.apache.logging.log4j.spi.AbstractLoggerWrapper.log(AbstractLoggerWrapper.java:55)
>  [log4j-api-2.0-beta7.jar:2.0-beta7]
>       at org.slf4j.impl.SLF4JLogger.debug(SLF4JLogger.java:154) 
> [log4j-slf4j-impl-2.0-beta7.jar:2.0-beta7]
>       at org.apache.flume.sink.AvroSink.destroyConnection(AvroSink.java:199) 
> [flume-ng-core-1.3.1-SIN124-SNAPSHOT.jar:1.3.1-SIN124-SNAPSHOT]
>       at org.apache.flume.sink.AvroSink.verifyConnection(AvroSink.java:224) 
> [flume-ng-core-1.3.1-SIN124-SNAPSHOT.jar:1.3.1-SIN124-SNAPSHOT]
>       at org.apache.flume.sink.AvroSink.process(AvroSink.java:282) 
> [flume-ng-core-1.3.1-SIN124-SNAPSHOT.jar:1.3.1-SIN124-SNAPSHOT]
>       at 
> org.apache.flume.sink.FailoverSinkProcessor.process(FailoverSinkProcessor.java:162)
>  [flume-ng-core-1.3.1-SIN124-SNAPSHOT.jar:1.3.1-SIN124-SNAPSHOT]
>       at org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:147) 
> [flume-ng-core-1.3.1-SIN124-SNAPSHOT.jar:1.3.1-SIN124-SNAPSHOT]
>       at java.lang.Thread.run(Thread.java:722) [?:1.7.0_21]
> Caused by: java.lang.IllegalStateException: begin() called when transaction 
> is OPEN!
>       at 
> com.google.common.base.Preconditions.checkState(Preconditions.java:145) 
> ~[guava-10.0.1.jar:?]
>       at 
> org.apache.flume.channel.BasicTransactionSemantics.begin(BasicTransactionSemantics.java:133)
>  ~[flume-ng-core-1.3.1-SIN124-SNAPSHOT.jar:1.3.1-SIN124-SNAPSHOT]
>       at 
> org.apache.flume.channel.ChannelProcessor.processEvent(ChannelProcessor.java:263)
>  ~[flume-ng-core-1.3.1-SIN124-SNAPSHOT.jar:1.3.1-SIN124-SNAPSHOT]
>       ... 16 more
> 2013-06-10 15:25:25,675 ERROR An exception occurred processing Appender 
> FlumeAppender org.apache.flume.ChannelException: Unable to put event on 
> required channel: FileChannel primary { dataDirs: 
> [/var/local/flume/castellan-reader-berkeley-db/data] }txn: 1638840125
>       at 
> org.apache.flume.channel.ChannelProcessor.processEvent(ChannelProcessor.java:275)
>       at 
> org.apache.logging.log4j.flume.appender.Log4jEventSource.send(Log4jEventSource.java:59)
>       at 
> org.apache.logging.log4j.flume.appender.FlumeEmbeddedManager.send(FlumeEmbeddedManager.java:123)
>       at 
> org.apache.logging.log4j.flume.appender.FlumeAppender.append(FlumeAppender.java:86)
>       at 
> org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:102)
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:424)
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:405)
>       at 
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:366)
>       at org.apache.logging.log4j.core.Logger.log(Logger.java:110)
>       at 
> org.apache.logging.log4j.spi.AbstractLoggerWrapper.log(AbstractLoggerWrapper.java:55)
>       at org.slf4j.impl.SLF4JLogger.debug(SLF4JLogger.java:154)
>       at org.apache.flume.sink.AvroSink.destroyConnection(AvroSink.java:199)
>       at org.apache.flume.sink.AvroSink.verifyConnection(AvroSink.java:224)
>       at org.apache.flume.sink.AvroSink.process(AvroSink.java:282)
>       at 
> org.apache.flume.sink.FailoverSinkProcessor.process(FailoverSinkProcessor.java:162)
>       at org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:147)
>       at java.lang.Thread.run(Thread.java:722)
> Caused by: java.lang.IllegalStateException: begin() called when transaction 
> is OPEN!
>       at 
> com.google.common.base.Preconditions.checkState(Preconditions.java:145)
>       at 
> org.apache.flume.channel.BasicTransactionSemantics.begin(BasicTransactionSemantics.java:133)
>       at 
> org.apache.flume.channel.ChannelProcessor.processEvent(ChannelProcessor.java:263)
>       ... 16 more
> That failure appears to be AvroSink line 199.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to