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

Tomas Vavricka updated QPID-8439:
---------------------------------
    Description: 
We are occasionally seeing stack overflow during logging in QPid. This 
completely kills the broker because some data structure are not initialized 
correctly any more afterwards. The problems lies in the combination of SLf4j 
use in QPid and the logging in the BDB implementation. BDB is configured using 
the Slf4jLoggingHandler in 
{{org.apache.qpid.server.store.berkeleydb.StandardEnvironmentFacade.StandardEnvironmentFacade(StandardEnvironmentConfiguration)}}
 which eventually ends up at the JDK logger (at least in our setup). However, 
BDB has a {{com.sleepycat.je.utilint.ConfiguredRedirectHandler}} which is 
appended to the the JDK logger and logs records from it to the configured 
Slf4jLoggingHandler. Which in turn forwards them to the JDK logger and there it 
starts again. The error is so obvious which makes me wonder why nobody else has 
reported it before. Is there some kind of configuration that we have set wrong?

*Analysis*

BDB JE uses JUL logging and adds its own logging handlers to its internal 
loggers. When it logs something, the 
com.sleepycat.je.utilint.ConfiguredRedirectHandler calls 
org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler forming a 
chain of recursive calls:
{noformat}
at java.util.logging.Logger.log(Logger.java:738)
    at org.slf4j.impl.JDK14LoggerAdapter.log(JDK14LoggerAdapter.java:582)
    at org.slf4j.impl.JDK14LoggerAdapter.warn(JDK14LoggerAdapter.java:378)
    at 
org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler$3.log(Slf4jLoggingHandler.java:148)
    at 
org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler.publish(Slf4jLoggingHandler.java:229)
    at 
com.sleepycat.je.utilint.ConfiguredRedirectHandler.publish(ConfiguredRedirectHandler.java:40)
    at java.util.logging.Logger.log(Logger.java:738)
    at org.slf4j.impl.JDK14LoggerAdapter.log(JDK14LoggerAdapter.java:582)
    at org.slf4j.impl.JDK14LoggerAdapter.warn(JDK14LoggerAdapter.java:378)
    at 
org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler$3.log(Slf4jLoggingHandler.java:148)
    at 
org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler.publish(Slf4jLoggingHandler.java:229)
    at 
com.sleepycat.je.utilint.ConfiguredRedirectHandler.publish(ConfiguredRedirectHandler.java:40)
    at java.util.logging.Logger.log(Logger.java:738)
    at org.slf4j.impl.JDK14LoggerAdapter.log(JDK14LoggerAdapter.java:582)
    at org.slf4j.impl.JDK14LoggerAdapter.warn(JDK14LoggerAdapter.java:378)
    at 
org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler$3.log(Slf4jLoggingHandler.java:148)
    at 
org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler.publish(Slf4jLoggingHandler.java:229)
    at 
com.sleepycat.je.utilint.ConfiguredRedirectHandler.publish(ConfiguredRedirectHandler.java:40)
    at java.util.logging.Logger.log(Logger.java:738)
    at org.slf4j.impl.JDK14LoggerAdapter.log(JDK14LoggerAdapter.java:582)
    at org.slf4j.impl.JDK14LoggerAdapter.warn(JDK14LoggerAdapter.java:378)
    at 
org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler$3.log(Slf4jLoggingHandler.java:148)
    at 
org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler.publish(Slf4jLoggingHandler.java:229)
    at 
com.sleepycat.je.utilint.ConfiguredRedirectHandler.publish(ConfiguredRedirectHandler.java:40)
    at java.util.logging.Logger.log(Logger.java:738)
    at org.slf4j.impl.JDK14LoggerAdapter.log(JDK14LoggerAdapter.java:582)
{noformat}

*Implementation*

To fix the issue a ThreadLocal switch is added to the Slf4jLoggingHandler, 
checking whether this call is recursive or not. To improve performance an 
additional static check is added, verifying if slf4j-jdk14 library s loaded or 
not.

  was:We are occasionally seeing stack overflow during logging in QPid. This 
completely kills the broker because some data structure are not initialized 
correctly any more afterwards. The problems lies in the combination of SLf4j 
use in QPid and the logging in the BDB implementation. BDB is configured using 
the Slf4jLoggingHandler in 
{{org.apache.qpid.server.store.berkeleydb.StandardEnvironmentFacade.StandardEnvironmentFacade(StandardEnvironmentConfiguration)}}
 which eventually ends up at the JDK logger (at least in our setup). However, 
BDB has a {{com.sleepycat.je.utilint.ConfiguredRedirectHandler}} which is 
appended to the the JDK logger and logs records from it to the configured 
Slf4jLoggingHandler. Which in turn forwards them to the JDK logger and there it 
starts again. The error is so obvious which makes me wonder why nobody else has 
reported it before. Is there some kind of configuration that we have set wrong?


> [Broker-J] Stack overflow during logging
> ----------------------------------------
>
>                 Key: QPID-8439
>                 URL: https://issues.apache.org/jira/browse/QPID-8439
>             Project: Qpid
>          Issue Type: Bug
>          Components: Broker-J
>    Affects Versions: qpid-java-broker-7.0.6
>            Reporter: Thorsten Meinl
>            Priority: Major
>             Fix For: qpid-java-broker-9.2.1
>
>         Attachments: catalina.out
>
>
> We are occasionally seeing stack overflow during logging in QPid. This 
> completely kills the broker because some data structure are not initialized 
> correctly any more afterwards. The problems lies in the combination of SLf4j 
> use in QPid and the logging in the BDB implementation. BDB is configured 
> using the Slf4jLoggingHandler in 
> {{org.apache.qpid.server.store.berkeleydb.StandardEnvironmentFacade.StandardEnvironmentFacade(StandardEnvironmentConfiguration)}}
>  which eventually ends up at the JDK logger (at least in our setup). However, 
> BDB has a {{com.sleepycat.je.utilint.ConfiguredRedirectHandler}} which is 
> appended to the the JDK logger and logs records from it to the configured 
> Slf4jLoggingHandler. Which in turn forwards them to the JDK logger and there 
> it starts again. The error is so obvious which makes me wonder why nobody 
> else has reported it before. Is there some kind of configuration that we have 
> set wrong?
> *Analysis*
> BDB JE uses JUL logging and adds its own logging handlers to its internal 
> loggers. When it logs something, the 
> com.sleepycat.je.utilint.ConfiguredRedirectHandler calls 
> org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler forming a 
> chain of recursive calls:
> {noformat}
> at java.util.logging.Logger.log(Logger.java:738)
>     at org.slf4j.impl.JDK14LoggerAdapter.log(JDK14LoggerAdapter.java:582)
>     at org.slf4j.impl.JDK14LoggerAdapter.warn(JDK14LoggerAdapter.java:378)
>     at 
> org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler$3.log(Slf4jLoggingHandler.java:148)
>     at 
> org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler.publish(Slf4jLoggingHandler.java:229)
>     at 
> com.sleepycat.je.utilint.ConfiguredRedirectHandler.publish(ConfiguredRedirectHandler.java:40)
>     at java.util.logging.Logger.log(Logger.java:738)
>     at org.slf4j.impl.JDK14LoggerAdapter.log(JDK14LoggerAdapter.java:582)
>     at org.slf4j.impl.JDK14LoggerAdapter.warn(JDK14LoggerAdapter.java:378)
>     at 
> org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler$3.log(Slf4jLoggingHandler.java:148)
>     at 
> org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler.publish(Slf4jLoggingHandler.java:229)
>     at 
> com.sleepycat.je.utilint.ConfiguredRedirectHandler.publish(ConfiguredRedirectHandler.java:40)
>     at java.util.logging.Logger.log(Logger.java:738)
>     at org.slf4j.impl.JDK14LoggerAdapter.log(JDK14LoggerAdapter.java:582)
>     at org.slf4j.impl.JDK14LoggerAdapter.warn(JDK14LoggerAdapter.java:378)
>     at 
> org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler$3.log(Slf4jLoggingHandler.java:148)
>     at 
> org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler.publish(Slf4jLoggingHandler.java:229)
>     at 
> com.sleepycat.je.utilint.ConfiguredRedirectHandler.publish(ConfiguredRedirectHandler.java:40)
>     at java.util.logging.Logger.log(Logger.java:738)
>     at org.slf4j.impl.JDK14LoggerAdapter.log(JDK14LoggerAdapter.java:582)
>     at org.slf4j.impl.JDK14LoggerAdapter.warn(JDK14LoggerAdapter.java:378)
>     at 
> org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler$3.log(Slf4jLoggingHandler.java:148)
>     at 
> org.apache.qpid.server.store.berkeleydb.logging.Slf4jLoggingHandler.publish(Slf4jLoggingHandler.java:229)
>     at 
> com.sleepycat.je.utilint.ConfiguredRedirectHandler.publish(ConfiguredRedirectHandler.java:40)
>     at java.util.logging.Logger.log(Logger.java:738)
>     at org.slf4j.impl.JDK14LoggerAdapter.log(JDK14LoggerAdapter.java:582)
> {noformat}
> *Implementation*
> To fix the issue a ThreadLocal switch is added to the Slf4jLoggingHandler, 
> checking whether this call is recursive or not. To improve performance an 
> additional static check is added, verifying if slf4j-jdk14 library s loaded 
> or not.



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

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

Reply via email to