[
https://issues.apache.org/jira/browse/HTTPCORE-634?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17147412#comment-17147412
]
Daniel Jelinski commented on HTTPCORE-634:
------------------------------------------
I reviewed the synchronization around leased and available lists, looks legit.
However, there appears to be a race around routeToPool map that goes as follows:
* thread 1 runs getPoolEntryBlocking, gets an entry
* thread 2 runs getPoolEntryBlocking, gets and holds a reference to the pool,
then waits for a free entry
* thread 1 releases the connection; response data was not read, so connection
is not reusable and is freed
* thread 1 runs closeExpiredConnections, which removes pool held by thread 2
from routeToPool
* thread 2 creates a connection, adds it to the pool that is now not linked to
connection manager
* thread 2 releases the connection to a new pool created by getPool(route),
which throws exception.
> IllegalStateException: Entry [] has not been leased from this pool
> ------------------------------------------------------------------
>
> Key: HTTPCORE-634
> URL: https://issues.apache.org/jira/browse/HTTPCORE-634
> Project: HttpComponents HttpCore
> Issue Type: Bug
> Components: HttpCore
> Affects Versions: 4.4.11
> Reporter: Daniel Jelinski
> Priority: Major
>
> We are sporadically observing the exception mentioned in summary; while
> searching the Internet, I found [this SO page
> |https://stackoverflow.com/questions/46188047/httpclient-4-5-x-multithread-request-error-has-not-been-leased-from-this-pool]
> providing a semi-reliable reproducer. Minified form follows:
> {code:java}
> public static void main(String[] args) {
> final PoolingHttpClientConnectionManager cm = new
> PoolingHttpClientConnectionManager();
> cm.setDefaultMaxPerRoute(1);
> class HttpClientThead implements Runnable {
> final String reqString;
> final CloseableHttpClient httpclient1 = HttpClients.custom()
> .setConnectionManager(cm)
> .build();
> HttpClientThead(String reqString) {
> this.reqString = reqString;
> }
> public void run() {
> for (int i = 1; i <= 10; i++) {
> HttpClientContext context = HttpClientContext.create();
> try {
> HttpGet httpget = new HttpGet(reqString);
> CloseableHttpResponse response = httpclient1.execute(httpget,
> context);
> response.close();
> } catch (Throwable e) {
> e.printStackTrace();
> System.exit(1);
> } finally {
> cm.closeExpiredConnections();
> }
> }
> }
> }
> HttpClientThead t1 = new HttpClientThead("https://issues.apache.org/");
> Thread thread1 = new Thread(t1);
> thread1.start();
> t1.run();
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]