Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
4.4.11
-
None
-
None
Description
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, looks like the edge case that needs to be handled is "if (entry != null && future.isCancelled())"
Code to reproduce:
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());
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.