Uploaded image for project: 'HttpComponents HttpCore'
  1. HttpComponents HttpCore
  2. HTTPCORE-420

Connections left open after HTTP synchronous server shutdown

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 4.4.3
    • 4.4.5, 5.0-alpha2
    • HttpCore
    • None

    Description

      I have observed the following problem on Linux with Apache HttpComponents 4.4.1 synchronous server: After calling server.shutdown(42, TimeUnit.MICROSECONDS), if there are Keep-alive connections opened (there is no request processing), these sockets are not closed. Only ServerSocket is closed:

      netstat -aon | grep 58276

      TCP 127.0.0.1:50658 127.0.0.1:58276 ESTABLISHED 18012

      TCP 127.0.0.1:58276 127.0.0.1:50658 ESTABLISHED 18012

      In attempt to start again HTTP server on the same port a BindingException is thrown:

      Caused by: java.net.BindException: Address already in use
      at java.net.PlainSocketImpl.socketBind(Native Method)
      at java.net.PlainSocketImpl.socketBind(PlainSocketImpl.java:521)
      at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:414)
      at java.net.ServerSocket.bind(ServerSocket.java:326)
      at java.net.ServerSocket.<init>(ServerSocket.java:192)
      at javax.net.DefaultServerSocketFactory.createServerSocket(ServerSocketFactory.java:170)
      at org.apache.http.impl.bootstrap.HttpServer.start(HttpServer.java:116)

      On Windows the behavior is the same , however there is no BindingException and the server starts process requests without any problems.

      One can reproduce the problem using example code from https://github.com/anton-k11/apache-tests/tree/master

      1. Start the server and the client.
      2. Client will send several requests to the server.
        • Client will open 2 connections to the server.
      3. After 1 min. the server will be shutdown.
        • Check the open connections on port 9090, the 2 connections between client and server are still open.
      4. After 1 min. a new Server is started on the same port 9090.
        • On Linux this brakes with:

          java.net.BindException: Address already in use
          at java.net.PlainSocketImpl.socketBind(Native Method)
          at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
          at java.net.ServerSocket.bind(ServerSocket.java:375)
          at java.net.ServerSocket.<init>(ServerSocket.java:237)
          at javax.net.DefaultServerSocketFactory.createServerSocket(ServerSocketFactory.java:231)
          at org.apache.http.impl.bootstrap.HttpServer.start(HttpServer.java:116)
          at org.apache.http.examples.server.TestHttpServer.main(TestHttpServer.java:49)

        • On Windows this work just fine and the server is started successfully.

      Attachments

        Activity

          People

            olegk Oleg Kalnichevski
            anton_k11 Anton Krosnev
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: