-
Bug
-
Resolution: Unresolved
-
Major
-
None
-
3.8.16.Final
-
None
Unexpeced connection close can cause infinite 100% CPU loop, where stack trace alternates between:
at java.lang.StackTraceElement.initStackTraceElements(java.base@17.0.14/Native Method) at java.lang.StackTraceElement.of(java.base@17.0.14/StackTraceElement.java:541) at java.lang.Throwable.getOurStackTrace(java.base@17.0.14/Throwable.java:839) - locked <0x00007f3ae74b7910> (a java.io.EOFException) at java.lang.Throwable.getStackTrace(java.base@17.0.14/Throwable.java:831) at org.xnio._private.Messages_$logger._copyStackTraceMinusOne(Messages_$logger.java:84) at org.xnio._private.Messages_$logger.connectionClosedEarly(Messages_$logger.java:672) at org.xnio.http.HttpUpgrade$HttpUpgradeState$UpgradeResultListener.handleEvent(HttpUpgrade.java:416) at org.xnio.http.HttpUpgrade$HttpUpgradeState$UpgradeResultListener.handleEvent(HttpUpgrade.java:400) at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92) at org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66) at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:89) at org.xnio.nio.WorkerThread.run(WorkerThread.java:603)
and
at sun.nio.ch.EPoll.wait(java.base@17.0.14/Native Method) at sun.nio.ch.EPollSelectorImpl.doSelect(java.base@17.0.14/EPollSelectorImpl.java:118) at sun.nio.ch.SelectorImpl.lockAndDoSelect(java.base@17.0.14/SelectorImpl.java:129) - locked <0x00007f2f1559ff78> (a sun.nio.ch.Util$2) - locked <0x00007f2f1559fef0> (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(java.base@17.0.14/SelectorImpl.java:146) at org.xnio.nio.WorkerThread.run(WorkerThread.java:544)
Analysis: the underlying network connection is closed, but the socket is never closed, the selector key remains valid. select() wakes up to read, and then fails, and then select() is done again, and so on.
Suggested fix:
IOException handling in UpgradeResultListener should use safeClose(connection) instead of safeClose(channel) .