Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8179273

sun.net.httpserver.LeftOverInputStream should stop attempting to drain the stream when the server is stopped

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P4 P4
    • 10
    • 9, 10
    • core-libs
    • b07

      One of our internal tests is failing in timeout. The Thread Dump shows the following two threads:

      "MainThread" #12 prio=5 os_prio=64 tid=0x00000000009b0800 nid=0x20 in Object.wait() [0xffff80ff9e2fc000]
         java.lang.Thread.State: WAITING (on object monitor)
      at java.lang.Object.wait(java.base@9-ea/Native Method)
      - waiting on <0x00000000ff8f3708> (a java.lang.Thread)
      at java.lang.Thread.join(java.base@9-ea/Thread.java:1353)
      - waiting to re-lock in wait() <0x00000000ff8f3708> (a java.lang.Thread)
      at java.lang.Thread.join(java.base@9-ea/Thread.java:1427)
      at sun.net.httpserver.ServerImpl.stop(jdk.httpserver@9-ea/ServerImpl.java:211)
      at sun.net.httpserver.HttpsServerImpl.stop(jdk.httpserver@9-ea/HttpsServerImpl.java:78)
      at TestServer.stop(TestServer.java:237)

      "HTTP-Dispatcher" #39 prio=5 os_prio=64 tid=0x00000000017d8800 nid=0x3a runnable [0xffff80ff9dd7d000]
         java.lang.Thread.State: RUNNABLE
      at sun.net.httpserver.LeftOverInputStream.drain(jdk.httpserver@9-ea/LeftOverInputStream.java:119)
      at sun.net.httpserver.LeftOverInputStream.close(jdk.httpserver@9-ea/LeftOverInputStream.java:69)
      at sun.net.httpserver.ExchangeImpl.close(jdk.httpserver@9-ea/ExchangeImpl.java:146)
      at sun.net.httpserver.HttpsExchangeImpl.close(jdk.httpserver@9-ea/HttpsExchangeImpl.java:66)
      at TestServer$HttpHandler.handle(TestServer.java:574)
      at com.sun.net.httpserver.Filter$Chain.doFilter(jdk.httpserver@9-ea/Filter.java:77)
      at sun.net.httpserver.AuthFilter.doFilter(jdk.httpserver@9-ea/AuthFilter.java:82)
      at com.sun.net.httpserver.Filter$Chain.doFilter(jdk.httpserver@9-ea/Filter.java:80)
      at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(jdk.httpserver@9-ea/ServerImpl.java:685)
      at com.sun.net.httpserver.Filter$Chain.doFilter(jdk.httpserver@9-ea/Filter.java:77)
      at sun.net.httpserver.ServerImpl$Exchange.run(jdk.httpserver@9-ea/ServerImpl.java:655)
      at sun.net.httpserver.ServerImpl$DefaultExecutor.execute(jdk.httpserver@9-ea/ServerImpl.java:159)
      at sun.net.httpserver.ServerImpl$Dispatcher.handle(jdk.httpserver@9-ea/ServerImpl.java:440)
      at sun.net.httpserver.ServerImpl$Dispatcher.run(jdk.httpserver@9-ea/ServerImpl.java:405)
      at java.lang.Thread.run(java.base@9-ea/Thread.java:844)

      It appears that the MainThread is attempting to stop the server (end of the main) which causes the ServerImpl to attempt to join() the HTTP-Dispatcher thread. However, that thread appears to be spinning in LeftOverInputStream.drain().

      There is probably some subtle race condition here as the test is only failing intermittently (and infrequently).

            dfuchs Daniel Fuchs
            dfuchs Daniel Fuchs
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: