Hi! I'm using httpclient to consume a rest service. Everything was (is)
working like a charm but we had an episode last week:

- After a short outage in our network (blaming this outage is an assumption
I can't confirm) we got 16 threads stuck in our app server on:

"[STUCK] ExecuteThread: '45' for queue: 'weblogic.kernel.Default
(self-tuning)'" #29841 daemon prio=1 os_prio=0 tid=0x00007f07ac1e1800
rc="DOMAIN" ac=2 nid=0x8c6d runnable [0x00007f077c1de000]
               java.lang.Thread.State: RUNNABLE
                at java.net.SocketInputStream.socketRead0(Native Method)
                at
java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
                at
java.net.SocketInputStream.read(SocketInputStream.java:170)
                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:973)
                - locked <0x0000000093d38470> (a java.lang.Object)
                at
sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
                - locked <0x0000000093d38530> (a java.lang.Object)
                at
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
                at
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
                at
org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)
                at
org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.upgrade(DefaultHttpClientConnectionOperator.java:185)
                at
org.apache.http.impl.conn.PoolingHttpClientConnectionManager.upgrade(PoolingHttpClientConnectionManager.java:369)
                at
org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:415)

- 16 was the value we used for defaultMaxPerRoute
(org.apache.http.impl.conn.PoolingHttpClientConnectionManager) so it makes
sense that we got 16
threads stuck.

- All subsequent threads trying to get a connection got an exception (after
X seconds with X equal to our value for connectionRequestTimeout) as
expected.

- I think I've narrowed the problem down to this part of the code
(MainClientExec class)

if (!managedConn.isOpen()) {
                this.log.debug("Opening connection " + route);
                try {
                                establishRoute(proxyAuthState, managedConn,
route, request, context);
                } catch (final TunnelRefusedException ex) {
                                if (this.log.isDebugEnabled()) {

this.log.debug(ex.getMessage());
                                }
                                response = ex.getResponse();
                                break;
                }
}

final int timeout = config.getSocketTimeout();
if (timeout >= 0) {
                managedConn.setSocketTimeout(timeout);
}

It seems like socket timeout is set after establishRoute so the SSL
handshake isn't affected by this setting.

I am right?

Could the connection timeout be passed down to this.connManager.upgrade
(inside establishRoute) in order to use
it as socket timeout while establishing the SSL connection?

Versions:

httpclient-4.5.jar
httpcore-4.4.1.jar
httpcore-nio-4.4.4.jar

Thank you very much!

Best regards

Reply via email to