Thread: Driver hangs in connect->MakeSSL.convert->SSLSocketImpl.startHandshake
Hi
I'm seeing this thread hanging in the "getConnection" method, with no timeout in sight.
However, the PGXADataSource is configured with a "connectTimeout" of 10 seconds.
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:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:464)
at sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:165)
at sun.security.ssl.SSLTransport.decode(SSLTransport.java:109)
at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1392)
at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1300)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:435)
at org.postgresql.ssl.MakeSSL.convert(MakeSSL.java:41)
at org.postgresql.core.v3.ConnectionFactoryImpl.enableSSL(ConnectionFactoryImpl.java:571)
at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:168)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:235)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:223)
at org.postgresql.Driver.makeConnection(Driver.java:402)
at org.postgresql.Driver.connect(Driver.java:261)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:103)
at org.postgresql.xa.PGXADataSource.getXAConnection(PGXADataSource.java:49)
at org.postgresql.xa.PGXADataSource.getXAConnection(PGXADataSource.java:35)
Any reason this timeout is not being applied here?
The version in use here is 42.3.6
- Martin
Hi
I'm seeing this thread hanging in the "getConnection" method, with no timeout in sight.
However, the PGXADataSource is configured with a "connectTimeout" of 10 seconds.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:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:464)
at sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:165)
at sun.security.ssl.SSLTransport.decode(SSLTransport.java:109)
at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1392)
at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1300)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:435)
at org.postgresql.ssl.MakeSSL.convert(MakeSSL.java:41)
at org.postgresql.core.v3.ConnectionFactoryImpl.enableSSL(ConnectionFactoryImpl.java:571)
at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:168)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:235)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:223)
at org.postgresql.Driver.makeConnection(Driver.java:402)
at org.postgresql.Driver.connect(Driver.java:261)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:103)
at org.postgresql.xa.PGXADataSource.getXAConnection(PGXADataSource.java:49)
at org.postgresql.xa.PGXADataSource.getXAConnection(PGXADataSource.java:35)Any reason this timeout is not being applied here?
The version in use here is 42.3.6
- Martin
Hi Martin,Thanks for the report. I'll have a look.Dave CramerOn Tue, 28 Nov 2023 at 08:27, Martin Lichtin <lichtin@yahoo.com> wrote:Hi
I'm seeing this thread hanging in the "getConnection" method, with no timeout in sight.
However, the PGXADataSource is configured with a "connectTimeout" of 10 seconds.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:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:464)
at sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:165)
at sun.security.ssl.SSLTransport.decode(SSLTransport.java:109)
at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1392)
at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1300)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:435)
at org.postgresql.ssl.MakeSSL.convert(MakeSSL.java:41)
at org.postgresql.core.v3.ConnectionFactoryImpl.enableSSL(ConnectionFactoryImpl.java:571)
at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:168)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:235)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:223)
at org.postgresql.Driver.makeConnection(Driver.java:402)
at org.postgresql.Driver.connect(Driver.java:261)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:103)
at org.postgresql.xa.PGXADataSource.getXAConnection(PGXADataSource.java:49)
at org.postgresql.xa.PGXADataSource.getXAConnection(PGXADataSource.java:35)Any reason this timeout is not being applied here?
The version in use here is 42.3.6
Re: Driver hangs in connect->MakeSSL.convert->SSLSocketImpl.startHandshake
On Tue, 28 Nov 2023 at 09:07, Dave Cramer <davecramer@postgres.rocks> wrote:Hi Martin,Thanks for the report. I'll have a look.Dave CramerOn Tue, 28 Nov 2023 at 08:27, Martin Lichtin <lichtin@yahoo.com> wrote:Hi
I'm seeing this thread hanging in the "getConnection" method, with no timeout in sight.
However, the PGXADataSource is configured with a "connectTimeout" of 10 seconds.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:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:464)
at sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:165)
at sun.security.ssl.SSLTransport.decode(SSLTransport.java:109)
at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1392)
at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1300)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:435)
at org.postgresql.ssl.MakeSSL.convert(MakeSSL.java:41)
...
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:103)
at org.postgresql.xa.PGXADataSource.getXAConnection(PGXADataSource.java:49)
at org.postgresql.xa.PGXADataSource.getXAConnection(PGXADataSource.java:35)Any reason this timeout is not being applied here?
The version in use here is 42.3.6
This Make sure to pass any network timeouts to the new SSL connection. by davecramer · Pull Request #3040 · pgjdbc/pgjdbc (github.com) should fix the problem, can you check ?
Thanks! I'll try. Was hoping for a SNAPSHOT version with this change in, but looks like these are no longer produced(?), although mentioned here https://jdbc.postgresql.org/download/ Anyways, it will be quite hard to reproduce this socket-read hang situation, so not sure I'll be able to test the change :)
Some more observations (obv from a newcomer to this space..):
As mentioned I'm setting "connectTimeout". Is this value somehow trickling down, and ending up at what's called "networkTimeout" in the code?
I'm asking as networkTimeout is not a connection parameter.. https://jdbc.postgresql.org/documentation/use/
Also confusing to me is the existing parameter "sslResponseTimeout", this defaults to 5 seconds, and is already documented as 'the maximum time to wait for a response after requesting an SSL encrypted connection from the server'. Shouldn't this value be used in above case.
Lastly, seeing "socketTimeout", however I would not want to set this one, as it could interfere with long-running queries, and to me, should not be used during connection setup.
- Martin
On 28/11/2023 21:28, Dave Cramer wrote:On Tue, 28 Nov 2023 at 09:07, Dave Cramer <davecramer@postgres.rocks> wrote:Hi Martin,Thanks for the report. I'll have a look.Dave CramerOn Tue, 28 Nov 2023 at 08:27, Martin Lichtin <lichtin@yahoo.com> wrote:Hi
I'm seeing this thread hanging in the "getConnection" method, with no timeout in sight.
However, the PGXADataSource is configured with a "connectTimeout" of 10 seconds.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:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:464)
at sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:165)
at sun.security.ssl.SSLTransport.decode(SSLTransport.java:109)
at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1392)
at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1300)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:435)
at org.postgresql.ssl.MakeSSL.convert(MakeSSL.java:41)
...
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:103)
at org.postgresql.xa.PGXADataSource.getXAConnection(PGXADataSource.java:49)
at org.postgresql.xa.PGXADataSource.getXAConnection(PGXADataSource.java:35)Any reason this timeout is not being applied here?
The version in use here is 42.3.6
This Make sure to pass any network timeouts to the new SSL connection. by davecramer · Pull Request #3040 · pgjdbc/pgjdbc (github.com) should fix the problem, can you check ?Thanks! I'll try. Was hoping for a SNAPSHOT version with this change in, but looks like these are no longer produced(?), although mentioned here https://jdbc.postgresql.org/download/ Anyways, it will be quite hard to reproduce this socket-read hang situation, so not sure I'll be able to test the change :)
Some more observations (obv from a newcomer to this space..):
As mentioned I'm setting "connectTimeout". Is this value somehow trickling down, and ending up at what's called "networkTimeout" in the code?
I'm asking as networkTimeout is not a connection parameter.. https://jdbc.postgresql.org/documentation/use/Also confusing to me is the existing parameter "sslResponseTimeout", this defaults to 5 seconds, and is already documented as 'the maximum time to wait for a response after requesting an SSL encrypted connection from the server'. Shouldn't this value be used in above case.
Lastly, seeing "socketTimeout", however I would not want to set this one, as it could interfere with long-running queries, and to me, should not be used during connection setup.
- Martin