Subject: Driver hangs in connect->MakeSSL.convert->SSLSocketImpl.startHandshake

From: Martin Lichtin <[email-masked]>
Date: Tue, 28 Nov 2023 14:27:27 +0100

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

---

From: Dave Cramer <[email-masked]>
Date: Tue, 28 Nov 2023 09:07:10 -0500

Hi Martin,

Thanks for the report. I'll have a look.
Dave Cramer

---

From: Dave Cramer <[email-masked]>
Date: Tue, 28 Nov 2023 15:28:27 -0500

>> 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)
<https://github.com/pgjdbc/pgjdbc/pull/3040> should fix the problem, can
you check ?

Dave

---

From: Martin Lichtin <[email-masked]>
Date: Wed, 29 Nov 2023 17:06:16 +0100

On 28/11/2023 21:28, Dave Cramer wrote:
>         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.net.SocketInputStream.socketRead(SocketInputStream.java:116)
>         sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1392)
>             at
>         ...
>         java.sql.DriverManager.getConnection(DriverManager.java:247)
>             at
> This Make sure to pass any network timeouts to the new SSL connection. 
> by davecramer · Pull Request #3040 · pgjdbc/pgjdbc (github.com) 
> <https://github.com/pgjdbc/pgjdbc/pull/3040> 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

---

From: Dave Cramer <[email-masked]>
Date: Wed, 29 Nov 2023 11:12:21 -0500

On Wed, 29 Nov 2023 at 11:06, Martin Lichtin <[email-masked]> wrote:

> On Tue, 28 Nov 2023 at 09:07, Dave Cramer <[email-masked]>
> <[email-masked]> wrote:
>
>> Hi Martin,
>>
> reproduce this socket-read hang situation, so not sure I'll be able to test
> the change :)
>

In order to create a snapshot version I would need to merge the change in.

> As mentioned I'm setting "connectTimeout". Is this value somehow trickling
> down, and ending up at what's called "networkTimeout" in the code?
> 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.
>
Fair question

> 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.
>

Should probably reset it after connecting.

Thanks,
Dave