You are viewing a plain text version of this content. The canonical link for it is here.
Posted to httpclient-users@hc.apache.org by Jaikit Savla <ja...@yahoo.com> on 2013/10/21 05:11:30 UTC

Re: Httpclient 4.2.2 leak sockets ?

Found the problem. Code was leaking connections when server returned 400 with some content in it. It was not consuming the content from stream.

Thanks for your help.

jaikit



On Tuesday, July 9, 2013 6:29 PM, Jaikit Savla <ja...@yahoo.com> wrote:
 
I tried to reproduce CLOSE_WAIT scenario on client side - but was not able to reproduce using HttpClient. However I was able to reproduce using basic sockets.


Basic socket:
SERVER:
        Socket socket = new ServerSocket(12000).accept();
        OutputStream out = socket.getOutputStream();
        out.write("HTTP/1.1 200 OK\n\nWorkerRunnable\n".getBytes());
        out.flush();
        out.close(); 



CLIENT:
        Socket socket = new Socket(InetAddress.getByName("localhost"), 12000);
        InputStream in = socket.getInputStream();
        int c;
        while ((c = in.read()) != -1)
        {
            System.out.write(c);
        }
        System.out.flush();

        // should now be in CLOSE_WAIT
        Thread.sleep(Integer.MAX_VALUE);  // After this sleep - client goes into CLOSE_WAIT state



But when I replace the client with HTTP Post request
HTTPCLIENT:

        HttpClientFactory factory = new HttpClientFactory();

        HttpClient httpclient = factory.getHttpClient(config);
        final String url = "http://localhost:12000";
        HttpPost postMethod = new HttpPost(url);
        
        postMethod.addHeader("Content-Type", "application/json");
        postMethod.setEntity(new ByteArrayEntity("{\"name\" : \"jaikit\"".getBytes()));
        HttpResponse response = httpclient.execute(postMethod);
        InputStream lsgInputStream = response.getEntity().getContent();
        int c;
        while ((c = lsgInputStream.read()) != -1)
        {
            System.out.write(c);
        }

Here - as soon as I close the socket on server - the entire connection gets closed and netstat does not show any trace of it. 


Any suggestions ?






On Tuesday, July 9, 2013 11:13 AM, Jaikit Savla <ja...@yahoo.com> wrote:

Hello Users,

I am using PoolingClientConnectionManager for my HttpClient instance and have set 512 connections per route. On one of my production box, all 512 connections are in CLOSE_WAIT state. I also have IdleConnectionMonitorThread running which claims Idle connections (30s) and expired connections. I verified that the thread is running on my jstack. However it is not reclaiming the 512 connections for last 5 days. 


Has anyone encountered similar issue ? have any clue on how to debug ?

I have simulating the CLOSE_WAIT scenario in my unit test and verifying if IdleConnectionMonitorThread is reclaiming the idle connections. 

Ref: http://stackoverflow.com/questions/4724193/how-can-i-ensure-that-my-httpclient-4-1-does-not-leak-sockets

Any pointers on how to debug this is appreciated.

Thanks,
Jaikit