Uploaded image for project: 'XNIO'
  1. XNIO
  2. XNIO-451

Infinite loop in HttpUpgrade when connection is closed

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Major Major
    • None
    • 3.8.16.Final
    • api
    • None
    • Hide

      Unable to provide, but these cases have been detected a few times on production servers.

      Show
      Unable to provide, but these cases have been detected a few times on production servers.

      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) .

              Unassigned Unassigned
              armihu Arto Huusko (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

                Created:
                Updated: