Re: Logical replication fails due to SocketException

Dave Cramer <[email protected]> Tue, 21 May 2019 14:22:00 -0400
Newsgroups gmane.comp.db.postgresql.jdbc
Message-ID <CADK3HHKjRzzdVWB-exgh1TxgKqUMOqXEdpoaM5nQRD8P0CLoeg@mail.gmail.com>
On Tue, 21 May 2019 at 09:58, Alex Maltinsky <[email protected]> wrote:

> Hi All
>
> I ran into the a problem with Postgres 11 and JDBC driver 42.2.5 which
> resembles a problem that was posted here before (
> https://www.postgresql-archive.org/postgresql-Logical-Replication-Stream-fails-with-Database-connection-failed-when-reading-from-copy-td6036639.html),
> but unfortunately the solution was never posted here.
>
> I have a simple endless loop that follows the official replication example
> (https://jdbc.postgresql.org/documentation/head/replication.html), and I
> keep getting socket exceptions like these after fetching approximately 66K
> rows with remarkable consistency:
>
>     Exception in thread "main" org.postgresql.util.PSQLException: Database
> connection failed when reading from copy
>     at
> org.postgresql.core.v3.QueryExecutorImpl.readFromCopy(QueryExecutorImpl.java:1037)
>     at
> org.postgresql.core.v3.CopyDualImpl.readFromCopy(CopyDualImpl.java:41)
>     at
> org.postgresql.core.v3.replication.V3PGReplicationStream.receiveNextData(V3PGReplicationStream.java:155)
>     at
> org.postgresql.core.v3.replication.V3PGReplicationStream.readInternal(V3PGReplicationStream.java:124)
>     at
> org.postgresql.core.v3.replication.V3PGReplicationStream.readPending(V3PGReplicationStream.java:78)
>     at com.example.main(ReplicationTest.java:48)
>     Caused by: java.net.SocketException: socket closed
>     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
> org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:140)
>     at
> org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:109)
>     at
> org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:191)
>     at org.postgresql.core.PGStream.receive(PGStream.java:462)
>     at org.postgresql.core.PGStream.receive(PGStream.java:446)
>     at
> org.postgresql.core.v3.QueryExecutorImpl.processCopyResults(QueryExecutorImpl.java:1170)
>     at
> org.postgresql.core.v3.QueryExecutorImpl.readFromCopy(QueryExecutorImpl.java:1035)
>     ... 5 more
>
> The database log shows "LOG:  could not send data to client: Connection
> reset by peer"
>
> Wireshark shows that it was the client who suddenly sent a TCP RST to the
> server and closed the connection.
>
> Parameters: `wal_sender_timeout` is set to 60 seconds, and I'm using a
> status interval of 10 seconds and  TCP_KEEP_ALIVE is enabled.
>
> The body of the Java loop looks like this:
>
>         while (true) {
>             ByteBuffer msg = stream.readPending();
>             if (msg == null) {
>                 TimeUnit.MILLISECONDS.sleep(10L);
>                 continue;
>             }
>
>             LogSequenceNumber lastReceiveLSN = stream.getLastReceiveLSN();
>             System.out.println((i++) + " " + lastReceiveLSN);
>
>             stream.setAppliedLSN(lastReceiveLSN);
>             stream.setFlushedLSN(lastReceiveLSN);
>         }
>
>
> Curiously enough, if I change the loop to the code below, the problem
> disappears:
>
>         while (true) {
>             ByteBuffer msg = stream.readPending();
>             if (msg == null) {
>                 TimeUnit.MILLISECONDS.sleep(10L);
>                 continue;
>             }
>
>             int offset = msg.arrayOffset();
>             byte[] source = msg.array();
>             int length = source.length - offset;
>
>             LogSequenceNumber lastReceiveLSN = stream.getLastReceiveLSN();
>             System.out.println((i++) + " " + lastReceiveLSN + " " + new
> String(source, offset, length));
>
>             stream.setAppliedLSN(lastReceiveLSN);
>             stream.setFlushedLSN(lastReceiveLSN);
>         }
>
>
> Any help would be appreciated
>
> - Alex
>
>
What OS are you using ?


Dave Cramer

[email protected]
www.postgresintl.com