[
https://issues.apache.org/jira/browse/HTTPCORE-596?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16924791#comment-16924791
]
ASF subversion and git services commented on HTTPCORE-596:
----------------------------------------------------------
Commit af8feefb43806f7d77e0a4b01ab288b1dec21cf4 in httpcomponents-core's branch
refs/heads/4.4.x from Oleg Kalnichevski
[ https://gitbox.apache.org/repos/asf?p=httpcomponents-core.git;h=af8feef ]
HTTPCORE-596: connection pools to reduce socket timeout to 1 second when
closing managed connections
> Closing idle connections may end up in a blocked connection pool
> ----------------------------------------------------------------
>
> Key: HTTPCORE-596
> URL: https://issues.apache.org/jira/browse/HTTPCORE-596
> Project: HttpComponents HttpCore
> Issue Type: Improvement
> Components: HttpCore
> Affects Versions: 4.4.11
> Reporter: Thomas Sartissohn
> Priority: Major
>
> We have some http endpoint not returning the CLOSE_NOTIFY in time. Sometime
> it takes about up to 15 minutes till the connection is closed.
> During that time we find the PoolingHttpClientConnectionManager in closing
> the idle connections. Here the stack:
> {{"IdleConnectionMonitor:MyHTTPClient" Id=765 in RUNNABLE}}
> \{{ at java.net.SocketInputStream.socketRead0(Native Method)}}
> \{{ at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)}}
> \{{ at java.net.SocketInputStream.read(SocketInputStream.java:171)}}
> \{{ at java.net.SocketInputStream.read(SocketInputStream.java:141)}}
> \{{ at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)}}
> \{{ at sun.security.ssl.InputRecord.read(InputRecord.java:503)}}
> \{{ at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975)}}
> \{{ - locked java.lang.Object@7b9c4e14}}
> \{{ at sun.security.ssl.SSLSocketImpl.waitForClose(SSLSocketImpl.java:1761)}}
> \{{ at sun.security.ssl.SSLSocketImpl.closeSocket(SSLSocketImpl.java:1571)}}
> \{{ at
> sun.security.ssl.SSLSocketImpl.closeInternal(SSLSocketImpl.java:1705)}}
> \{{ at sun.security.ssl.SSLSocketImpl.close(SSLSocketImpl.java:1594)}}
> \{{ at
> a.b.security.zone.api.factories.ZoneSSLSocket.close(ZoneSSLSocket.java:572)}}
> \{{ - locked a.b.security.zone.api.factories.ZoneSSLSocket@307c017c}}
> \{{ at
> a.b.http.client.sdk.HTTPDumpingSSLSocket.close(HTTPDumpingSSLSocket.java:77)}}
> \{{ - locked a.b.http.client.sdk.HTTPDumpingSSLSocket@658dab05}}
> \{{ at
> a.b.http.base.connection.MyDefaultClientConnection.close(MyDefaultClientConnection.java:711)}}
> \{{ at
> org.apache.http.impl.conn.CPoolEntry.closeConnection(CPoolEntry.java:70)}}
> \{{ at org.apache.http.impl.conn.CPoolEntry.close(CPoolEntry.java:96)}}
> \{{ at
> org.apache.http.pool.AbstractConnPool$3.process(AbstractConnPool.java:622)}}
> \{{ at
> org.apache.http.pool.AbstractConnPool.enumAvailable(AbstractConnPool.java:561)}}
> \{{ at org.apache.http.impl.conn.CPool.enumAvailable(CPool.java:76)}}
> \{{ at
> org.apache.http.pool.AbstractConnPool.closeIdle(AbstractConnPool.java:617)}}
> \{{ at
> org.apache.http.impl.conn.PoolingHttpClientConnectionManager.closeIdleConnections(PoolingHttpClientConnectionManager.java:424)
> }}
>
> While the thread is waiting here for the close the whole connection pool is
> blocked due to some lock in the enumAvailble method. Any try to lease a new
> connection needs to wait till the lock is released here.
> The problem is that the whole pool is blocked and not only connections to
> that specific route the close is pending. Finally my whole application is
> waiting for this single partner to reply on the close.
> Is there any chance to optimze the pool to be less strict when iterating the
> connection pool?
> Here an example for a a call waiting for a connection due to the lock in the
> enumAvailable method:
> {{"pool-144-thread-13" Id=30179 in WAITING on
> lock=java.util.concurrent.locks.ReentrantLock$NonfairSync@7dbb4bbf owned by
> IdleConnectionMonitor:MyHTTPClient Id=27798}}
> \{{ at sun.misc.Unsafe.park(Native Method)}}
> \{{ at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)}}
> \{{ at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)}}
> \{{ at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)}}
> \{{ at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)}}
> \{{ at
> java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)}}
> \{{ at
> java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)}}
> \{{ at
> org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:305)}}
> \{{ at
> org.apache.http.pool.AbstractConnPool.access$200(AbstractConnPool.java:69)}}
> \{{ at
> org.apache.http.pool.AbstractConnPool$2.get(AbstractConnPool.java:245)}}
> \{{ - locked org.apache.http.pool.AbstractConnPool$2@1e25f993}}
> \{{ at
> org.apache.http.pool.AbstractConnPool$2.get(AbstractConnPool.java:193)}}
> \{{ at
> org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:304)}}
> \{{ at
> org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:280)}}
> \{{ at
> org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)}}
> \{{ at
> org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)}}
> \{{ at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)}}
> \{{ at
> org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)}}
> \{{ at
> org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)}}
> \{{ at
> org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72)}}
>
--
This message was sent by Atlassian Jira
(v8.3.2#803003)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]