Continuum
  1. Continuum
  2. CONTINUUM-2693

File handle leak with TCP connections in CLOSE_WAIT when using distributed builds

    Details

    • Type: Bug Bug
    • Status: Closed Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.4.1
    • Fix Version/s: 1.4.1
    • Component/s: None
    • Labels:
      None
    • Complexity:
      Intermediate
    • Number of attachments :
      0

      Description

      If you generate a lot of requests using the XMLRPC layer, such as when distributed builds are active, it is possible for connections to stay in the CLOSE_WAIT state until they are garbage collected. On a busy server with the default file limits, this can result in a IOException: Too many open files error.

      The workaround is to increase the limit of the files for the user running Continuum. However, the XMLRPC layer should manage the connections better to avoid them getting into this state.

        Activity

        Hide
        Brett Porter added a comment -

        I traced this into the way the XMLRPC is set up.

        Atlassian XMLRPC Binder sets up Apache XMLRPC Client using the Commons HTTP Client 3.1 transport. HTTP Client is using the default SimpleHttpConnectionManager. These are all hard coded.

        Because the binder is not reused, a new XMLRPC client is set up for each call. The XMLRPC client calls releaseConnection on the HTTP Client, which leaves the physical connection open for reuse - but with nothing set up to reuse it or terminate it, it is left open until GC happens on the socket. This is often quick, but some connections make it into the more permanent area of heap.

        See: http://fuyun.org/2009/09/connection-close-in-httpclient/

        Medium term, the XMLRPC should be replaced with JAX-RS.

        Potential short term solutions:

        1. adjust the binder to use the JDK URL Connection instead of the HTTP Client
        2. try and adjust the HTTP Client to use a multi-threaded connection manager, and then reuse the binder/xmlrpc-client/http-client
        3. configure HTTP Client's background job to cleanup idle connections

        This needs further investigation.

        Show
        Brett Porter added a comment - I traced this into the way the XMLRPC is set up. Atlassian XMLRPC Binder sets up Apache XMLRPC Client using the Commons HTTP Client 3.1 transport. HTTP Client is using the default SimpleHttpConnectionManager . These are all hard coded. Because the binder is not reused, a new XMLRPC client is set up for each call. The XMLRPC client calls releaseConnection on the HTTP Client, which leaves the physical connection open for reuse - but with nothing set up to reuse it or terminate it, it is left open until GC happens on the socket. This is often quick, but some connections make it into the more permanent area of heap. See: http://fuyun.org/2009/09/connection-close-in-httpclient/ Medium term, the XMLRPC should be replaced with JAX-RS. Potential short term solutions: adjust the binder to use the JDK URL Connection instead of the HTTP Client try and adjust the HTTP Client to use a multi-threaded connection manager, and then reuse the binder/xmlrpc-client/http-client configure HTTP Client's background job to cleanup idle connections This needs further investigation.
        Hide
        Brett Porter added a comment -

        went with option #2. The JDK URL connection could well have had other impacts.

        While just setting the connection manager to close after each request, went with the multi-threaded manager which should manage the connections efficiently, even if a couple remain open.

        Note that there are other occasions where sockets are left open (e.g. AbstractContinuumProjectBuilder, which has its own httpclient v4). Unifying the HTTP clients used would be beneficial in future, but is best evaluated if the XMLRPC layer gets replaced with something else.

        Show
        Brett Porter added a comment - went with option #2. The JDK URL connection could well have had other impacts. While just setting the connection manager to close after each request, went with the multi-threaded manager which should manage the connections efficiently, even if a couple remain open. Note that there are other occasions where sockets are left open (e.g. AbstractContinuumProjectBuilder, which has its own httpclient v4). Unifying the HTTP clients used would be beneficial in future, but is best evaluated if the XMLRPC layer gets replaced with something else.

          People

          • Assignee:
            Brett Porter
            Reporter:
            Brett Porter
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: