[ 
https://issues.apache.org/jira/browse/HTTPCORE-567?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16757726#comment-16757726
 ] 

Zoe Wang commented on HTTPCORE-567:
-----------------------------------

Thanks for the fix. It is actually not very easy to reproduce because you have 
to make sure the request is aborted right after the connection is leased.

I checked out that branch and verified the connection can be reused after the 
change.
{code:java}
[leased: 0; pending: 0; available: 1; max: 20]{code}

> Connection leak when aborting httpRequest after connection leasing
> ------------------------------------------------------------------
>
>                 Key: HTTPCORE-567
>                 URL: https://issues.apache.org/jira/browse/HTTPCORE-567
>             Project: HttpComponents HttpCore
>          Issue Type: Bug
>    Affects Versions: 4.4.11
>            Reporter: Zoe Wang
>            Priority: Major
>
> This is a follow up on https://issues.apache.org/jira/browse/HTTPCLIENT-1958. 
> The leaking thread interrupt flag is fixed but we noticed that there's an 
> edge case when a request gets aborted right after a new connection is leased, 
> that connection will never get re-used and closed. 
>  
> From the [source 
> code|https://github.com/apache/httpcomponents-client/blob/4.5.x/httpclient/src/main/java/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.java#L305],
>  looks like the edge case that needs to be handled is "if (entry != null && 
> future.isCancelled())"
> Code to reproduce:
> {code:java}
> ScheduledExecutorService scheduledExecutorService =           
> Executors.newScheduledThreadPool(1);
> PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new 
> PoolingHttpClientConnectionManager();
> CloseableHttpClient httpclient = 
> HttpClients.custom().setConnectionManager(poolingHttpClientConnectionManager).build();
> try {
> HttpGet httpGet = new HttpGet("http://somehost";);
> scheduledExecutorService.schedule(httpGet::abort, 40, TimeUnit.MILLISECONDS);
> CloseableHttpResponse response = httpclient.execute(httpGet);
> HttpEntity entity = response.getEntity();
> EntityUtils.consume(entity);
> } catch (Exception e) {
>     e.printStackTrace();
> } finally {
> scheduledExecutorService.shutdown();
> }
> System.out.println(poolingHttpClientConnectionManager.getTotalStats());
> {code}
> The printed out log was: [leased: 1; pending: 0; available: 0; max: 20]
> Note that you might need to change the abort time to reproduce the issue.
>  
>  
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to