[ 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