EAP 7 Undertow AjpReadListener throws StackOverflowError
Environment
- JBoss Enterprise Application Platform (EAP)
- 7.3.5+
Issue
- We see a StackOverflowError from repeating AjpReadListener calls like below:
ERROR [org.xnio.listener] (default I/O-17) XNIO001007: A channel event listener threw an exception: java.lang.StackOverflowError
at org.jboss.logmanager.formatters.Formatters$7.renderRaw(Formatters.java:450)
at org.jboss.logmanager.formatters.Formatters$JustifyingFormatStep.render(Formatters.java:215)
at org.jboss.logmanager.formatters.MultistepFormatter.format(MultistepFormatter.java:89)
at org.jboss.logmanager.ExtFormatter.format(ExtFormatter.java:32)
at org.jboss.logmanager.handlers.WriterHandler.doPublish(WriterHandler.java:46)
at org.jboss.logmanager.ExtHandler.publish(ExtHandler.java:77)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:333)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:341)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:341)
at org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:341)
at org.jboss.logmanager.Logger.logRaw(Logger.java:852)
at org.jboss.logmanager.Logger.log(Logger.java:804)
at org.jboss.logging.JBossLogManagerLogger.doLogf(JBossLogManagerLogger.java:53)
at org.jboss.logging.Logger.logf(Logger.java:2445)
at io.undertow.UndertowLogger_$logger.exceptionProcessingRequest(UndertowLogger_$logger.java:57)
at io.undertow.server.protocol.ajp.AjpReadListener.handleEvent(AjpReadListener.java:252)
at io.undertow.core@2.2.9.SP1-redhat-00001//io.undertow.server.protocol.ajp.AjpReadListener.sendMessages(AjpReadListener.java:316)
at io.undertow.core@2.2.9.SP1-redhat-00001//io.undertow.server.protocol.ajp.AjpReadListener.handleInternalServerError(AjpReadListener.java:261)
at io.undertow.core@2.2.9.SP1-redhat-00001//io.undertow.server.protocol.ajp.AjpReadListener.handleEvent(AjpReadListener.java:249)
...
at io.undertow.core@2.2.9.SP1-redhat-00001//io.undertow.server.protocol.ajp.AjpReadListener.sendMessages(AjpReadListener.java:316)
at io.undertow.core@2.2.9.SP1-redhat-00001//io.undertow.server.protocol.ajp.AjpReadListener.handleInternalServerError(AjpReadListener.java:261)
at io.undertow.core@2.2.9.SP1-redhat-00001//io.undertow.server.protocol.ajp.AjpReadListener.handleEvent(AjpReadListener.java:249)
at io.undertow.core@2.2.9.SP1-redhat-00001//io.undertow.server.protocol.ajp.AjpReadListener.handleEvent(AjpReadListener.java:56)
at org.jboss.xnio@3.8.4.Final-redhat-00001//org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
at org.jboss.xnio@3.8.4.Final-redhat-00001//org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66)
at io.undertow.core@2.2.9.SP1-redhat-00001//io.undertow.conduits.ReadTimeoutStreamSourceConduit$2.readReady(ReadTimeoutStreamSourceConduit.java:99)
at org.jboss.xnio.nio@3.8.4.Final-redhat-00001//org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:89)
at org.jboss.xnio.nio@3.8.4.Final-redhat-00001//org.xnio.nio.NioHandle$1.run(NioHandle.java:50)
at org.jboss.xnio.nio@3.8.4.Final-redhat-00001//org.xnio.nio.WorkerThread.safeRun(WorkerThread.java:612)
at org.jboss.xnio.nio@3.8.4.Final-redhat-00001//org.xnio.nio.WorkerThread.run(WorkerThread.java:479)
Resolution
- Await a fix in a later EAP patch (7.4.4+)
- Remove any
read-timeoutfrom AJP listeners as a workaround or ignore the exception in the meantime as it otherwise has no functional impact on the already timed out connection.
Root Cause
- This content is not included.UNDERTOW-2002
- This content is not included.JBEAP-22861
- Handling of a ReadTimeoutException is recursively failing with repeating ReadTimeoutExceptions. This may be seen in the event of a timeout reached and induced by any configured
read-timeouton an ajp-listener:
<ajp-listener name="ajp" socket-binding="ajp" read-timeout="#" write-timeout="#" />
Diagnostic Steps
- Capture DEBUG logs for
io.undertowfrom the issue and check that ReadTimeoutExceptions are occurring like below:
DEBUG [io.undertow.request.io] (default I/O-14) UT005013: An IOException occurred: org.xnio.channels.ReadTimeoutException: UT000199: Read timed out after 1638571000771 milliseconds.
at io.undertow.conduits.ReadTimeoutStreamSourceConduit.checkExpired(ReadTimeoutStreamSourceConduit.java:238)
at io.undertow.conduits.ReadTimeoutStreamSourceConduit.read(ReadTimeoutStreamSourceConduit.java:169)
at org.xnio.conduits.ConduitStreamSourceChannel.read(ConduitStreamSourceChannel.java:127)
at io.undertow.server.protocol.ajp.AjpReadListener.handleEvent(AjpReadListener.java:125)
at io.undertow.server.protocol.ajp.AjpReadListener.sendMessages(AjpReadListener.java:316)
at io.undertow.server.protocol.ajp.AjpReadListener.handleInternalServerError(AjpReadListener.java:261)
SBR
Components
Category
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.