EAP 7 Undertow AjpReadListener throws StackOverflowError

Solution Unverified - Updated

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-timeout from 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

                <ajp-listener name="ajp" socket-binding="ajp" read-timeout="#" write-timeout="#" />

Diagnostic Steps

  • Capture DEBUG logs for io.undertow from 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)
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.