Re: postgresql Logical Replication Stream fails with “Database connection failed when reading from copy”
Jammie <[email protected]>
| Newsgroups | gmane.comp.db.postgresql.jdbc |
|---|---|
| Message-ID | <CAFt1pcqfA6NFjgSUamqksc=H-sg2oUDJp4ox=x=Po_NwKJFTvg@mail.gmail.com> |
Thanks for the invite Dave. I have joined the room. Regards Shailesh On Wed, Sep 5, 2018 at 4:20 PM Dave Cramer <[email protected]> wrote: > Shailesh, > > Can you join https://gitter.im/debezium/dev to discuss this ? > > Dave Cramer > > [email protected] > www.postgresintl.com > > > On Wed, 5 Sep 2018 at 01:35, Jammie <[email protected]> wrote: > >> Dave, >> I am using Windows 10 and I do not have tcp_keep* settings set in my >> regedit >> location : >> HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters >> >> So all these settings should be windows default values. >> >> Regards >> Shailesh >> On Wed, 5 Sep 2018, 00:14 Dave Cramer, <[email protected]> wrote: >> >>> What O/S are you using ? Can you see what the kernel tcp_keep* settings >>> are ? >>> >>> On Tue, 4 Sep 2018 at 13:15, Jammie <[email protected]> wrote: >>> >>>> PGProperty.TCP_KEEP_ALIVE.set(connectionProperties, "true"); >>>> >>>> this is how I am setting. >>>> >>>> On Tue, Sep 4, 2018 at 10:44 PM Dave Cramer <[email protected]> >>>> wrote: >>>> >>>>> Are you specifying *tcpKeepAlive=true *in the connection string ? >>>>> >>>>> On Tue, 4 Sep 2018 at 12:27, Jammie <[email protected]> >>>>> wrote: >>>>> >>>>>> The issue is still coming for me. >>>>>> >>>>>> One more thing to note here is my postgres database and Java program >>>>>> that stream data is on the same box. >>>>>> >>>>>> Regards >>>>>> Shailesh >>>>>> >>>>>> On Tue, Sep 4, 2018 at 9:26 PM Jammie <[email protected]> >>>>>> wrote: >>>>>> >>>>>>> Ok, I'll check it out. >>>>>>> >>>>>>> On Tue, 4 Sep 2018, 20:59 Dave Cramer, <[email protected]> >>>>>>> wrote: >>>>>>> >>>>>>>> Have a look at https://issues.jboss.org/browse/DBZ-218 >>>>>>>> >>>>>>>> I think just setting "tcpKeepAlive=true" should work. Can you try >>>>>>>> that and get back to me? >>>>>>>> >>>>>>>> On Tue, 4 Sep 2018 at 10:53, Jammie <[email protected]> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> One query is , >>>>>>>>> In my program I do not set >>>>>>>>> >>>>>>>>> stream.setAppliedPosition() or stream.setFlushLSN(). >>>>>>>>> >>>>>>>>> So does that mean we will not be able to send the updates to >>>>>>>>> server. and It is necessary to send this message periodically ? >>>>>>>>> >>>>>>>>> Regards >>>>>>>>> Shailesh >>>>>>>>> >>>>>>>>> On Tue, Sep 4, 2018 at 8:05 PM Jammie <[email protected]> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> Ok. Thank you very much. !! Appreciate your time here . >>>>>>>>>> >>>>>>>>>> On Tue, Sep 4, 2018 at 8:03 PM Dave Cramer < >>>>>>>>>> [email protected]> wrote: >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Tue, 4 Sep 2018 at 10:32, Jammie <[email protected]> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> Most of the time I have set >>>>>>>>>>>> >>>>>>>>>>>> .withStatusInterval(20, TimeUnit.SECONDS) >>>>>>>>>>>> >>>>>>>>>>>> Just that to see If 0 can solve this issue I tried it once. >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> No, that is worse. >>>>>>>>>>> >>>>>>>>>>> I'll build a jar for you to try. >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On Tue, Sep 4, 2018 at 7:59 PM Jammie < >>>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Sorry I have not done building of driver myself. Please help >>>>>>>>>>>>> If you can do that for me or If you can share steps I can do that. >>>>>>>>>>>>> >>>>>>>>>>>>> Also would like to understand If we got the root cause fixed : >>>>>>>>>>>>> >>>>>>>>>>>>> Here is my further observation for this issue : >>>>>>>>>>>>> 1) The issue comes at different point in time while stream is >>>>>>>>>>>>> doing its job e.g. writing copy/reading copy/ending copy. I think >>>>>>>>>>>>> underlying issue is Socket issue only. >>>>>>>>>>>>> 2) Once this issue comes the stream object cant even be >>>>>>>>>>>>> closed. even stream.close() throws the same error e.g. 'error reading >>>>>>>>>>>>> copy`. Even SQL Connection object is unusable e.g. querying to database >>>>>>>>>>>>> using that object hangs. However I see both stream.isClose() and >>>>>>>>>>>>> connection.isClose() is false. >>>>>>>>>>>>> >>>>>>>>>>>>> Regards >>>>>>>>>>>>> Shailesh >>>>>>>>>>>>> >>>>>>>>>>>>> On Tue, Sep 4, 2018 at 7:52 PM Dave Cramer < >>>>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Hey, >>>>>>>>>>>>>> >>>>>>>>>>>>>> So here's what I think is happening. The keep alive timeout >>>>>>>>>>>>>> exactly the same as the option in the slot. >>>>>>>>>>>>>> >>>>>>>>>>>>>> So in >>>>>>>>>>>>>> >>>>>>>>>>>>>> private boolean isTimeUpdate() { >>>>>>>>>>>>>> /* a value of 0 disables automatic updates */ >>>>>>>>>>>>>> if ( updateInterval == 0 ) { >>>>>>>>>>>>>> return false; >>>>>>>>>>>>>> } >>>>>>>>>>>>>> long diff = System.currentTimeMillis() - lastStatusUpdate; >>>>>>>>>>>>>> return diff >= updateInterval; >>>>>>>>>>>>>> } >>>>>>>>>>>>>> >>>>>>>>>>>>>> change this to be >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> return diff >= updateInterval-100; >>>>>>>>>>>>>> >>>>>>>>>>>>>> or something similar to get it to update before it times out >>>>>>>>>>>>>> on the server >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> Can you build the driver ? If not I'll send you a driver with >>>>>>>>>>>>>> some mods to change >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Tue, 4 Sep 2018 at 08:40, Dave Cramer < >>>>>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Mon, 3 Sep 2018 at 21:03, Jammie < >>>>>>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Hi Dave, >>>>>>>>>>>>>>>> thanks for the response !! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 1) I have tried latest driver 42.2.5 as well the same >>>>>>>>>>>>>>>> exception can be reproduced easily. >>>>>>>>>>>>>>>> 2) I have tried postgres V10 version along with 9.6.4 same >>>>>>>>>>>>>>>> issue could be reproduced. >>>>>>>>>>>>>>>> The server side log says : >>>>>>>>>>>>>>>> *2018-09-02 23:40:52 EDT LOG: could not receive data from >>>>>>>>>>>>>>>> client: An existing connection was forcibly closed by the remote host.* >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> In one of the instance I had enabled JDBC trace and this is >>>>>>>>>>>>>>>> what the last few lines are : >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> *Sep 03, 2018 3:37:52 AM org.postgresql.core.v3.* >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> *QueryExecutorImpl receiveRFQFINEST: <=BE >>>>>>>>>>>>>>>> ReadyForQuery(I)Sep 03, 2018 3:37:52 AM org.postgresql.jdbc.* >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> *PgResultSet getIntFINEST: getInt columnIndex: 1Sep 03, >>>>>>>>>>>>>>>> 2018 3:37:52 AM org.postgresql.jdbc.* >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> *PgConnection setAutoCommitFINE: setAutoCommit = falseSep >>>>>>>>>>>>>>>> 03, 2018 3:37:53 AM org.postgresql.core.**QueryExecutorBase >>>>>>>>>>>>>>>> close* >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I also see Socket reset error some times : >>>>>>>>>>>>>>>> --------------------- >>>>>>>>>>>>>>>> *Sep 03, 2018 3:29:42 AM org.postgresql.core.v3.* >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> *QueryExecutorImpl processCopyResultsFINEST: <=BE >>>>>>>>>>>>>>>> CopyDataSep 03, 2018 3:29:42 AM org.postgresql.core.v3.* >>>>>>>>>>>>>>>> *replication.* >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> *V3PGReplicationStream processKeepAliveMessageFINEST: >>>>>>>>>>>>>>>> <=BE Keepalive(lastServerWal: 0/2DD0218, clock: 9/3/18 3:29 AM needReply: >>>>>>>>>>>>>>>> false)Sep 03, 2018 3:30:40 AM org.postgresql.core.* >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> *QueryExecutorBase closeFINEST: FE=> TerminateSep 03, 2018 >>>>>>>>>>>>>>>> 3:30:40 AM org.postgresql.core.* >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> *QueryExecutorBase closeFINEST: Discarding IOException on >>>>>>>>>>>>>>>> close:java.net.SocketException: Connection reset by peer: socket write >>>>>>>>>>>>>>>> error at java.net.SocketOutputStream.* >>>>>>>>>>>>>>>> *socketWrite0(Native Method) at >>>>>>>>>>>>>>>> java.net.SocketOutputStream.**socketWrite(* >>>>>>>>>>>>>>>> *SocketOutputStream.java:122) at >>>>>>>>>>>>>>>> java.net.SocketOutputStream.* >>>>>>>>>>>>>>>> *write(SocketOutputStream.java:* >>>>>>>>>>>>>>>> *166) at java.io.BufferedOutputStream.**flushBuffer(* >>>>>>>>>>>>>>>> *BufferedOutputStream.java:93) at >>>>>>>>>>>>>>>> java.io.BufferedOutputStream.**flush(BufferedOutputStream.* >>>>>>>>>>>>>>>> *java:151) at org.postgresql.core.PGStream.* >>>>>>>>>>>>>>>> *flush(PGStream.java:514) at org.postgresql.core.* >>>>>>>>>>>>>>>> *QueryExecutorBase.close(* >>>>>>>>>>>>>>>> *QueryExecutorBase.java:136) at org.postgresql.jdbc.* >>>>>>>>>>>>>>>> *PgConnection.close(* >>>>>>>>>>>>>>>> *PgConnection.java:659) at com.datamirror.ts.scrapers.* >>>>>>>>>>>>>>>> *postgresqlscraper.**PostgreSQLLogicalLogReaderImpl* >>>>>>>>>>>>>>>> *.readLog(**PostgreSQLLogicalLogReaderImpl* >>>>>>>>>>>>>>>> *.java:208) at com.datamirror.ts.scrapers.* >>>>>>>>>>>>>>>> *postgresqlscraper.**PostgreSQLLogReader.readLog(* >>>>>>>>>>>>>>>> *PostgreSQLLogReader.java:174) at >>>>>>>>>>>>>>>> com.datamirror.ts.scrapers.**cdc.LogReader.execute(* >>>>>>>>>>>>>>>> *LogReader.java:341) at com.datamirror.ts.scrapers.* >>>>>>>>>>>>>>>> *cdc.LogReader$**LogReaderPipelineJob.execute(* >>>>>>>>>>>>>>>> *LogReader.java:114) at com.datamirror.ts.engine.* >>>>>>>>>>>>>>>> *component.PipelineThread.**runThread(PipelineThread.java:* >>>>>>>>>>>>>>>> *217) at com.datamirror.ts.util.* >>>>>>>>>>>>>>>> *TsThread.run(TsThread.java:* >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> *130)Sep 03, 2018 3:30:40 AM org.postgresql.Driver >>>>>>>>>>>>>>>> connectFINEST: FE=> Terminate* >>>>>>>>>>>>>>>> ------------------------- >>>>>>>>>>>>>>>> 3) Other than this I have tried to set PGProperty >>>>>>>>>>>>>>>> TCP_KEEP_ALIVE to true and SOCKET_TIMEOUT as 0. >>>>>>>>>>>>>>>> Also SetStatusInterval of the stream also to 0 but these >>>>>>>>>>>>>>>> did not help the purpose. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> The issue is very consistent and can be reproduced easily. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Regards >>>>>>>>>>>>>>>> Shailesh >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Pretty sure I know how to fix this, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Give me a few hours.. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Tue, Sep 4, 2018 at 12:51 AM Dave Cramer < >>>>>>>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Hi, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Off the top of my head I don't have any advice. Can you >>>>>>>>>>>>>>>>> try the latest driver though and see if it still exists. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Are there any messages on the server saying that it closed >>>>>>>>>>>>>>>>> the connection ? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Dave Cramer >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> [email protected] >>>>>>>>>>>>>>>>> www.postgresintl.com >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On Mon, 3 Sep 2018 at 06:34, Jammie < >>>>>>>>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Hi I am reading from logical replication stream >>>>>>>>>>>>>>>>>> continuously in infinite while loop. and I have another program that is >>>>>>>>>>>>>>>>>> continuously populating a table in the same database. I notice that after >>>>>>>>>>>>>>>>>> some time (around 5-10 minutes). I always get the exception >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> org.postgresql.util.PSQLException: Database connection failed when reading from copy >>>>>>>>>>>>>>>>>> at org.postgresql.core.v3.QueryExecutorImpl.readFromCopy(QueryExecutorImpl.java:1035) >>>>>>>>>>>>>>>>>> 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.read(V3PGReplicationStream.java:70) >>>>>>>>>>>>>>>>>> at com.datamirror.ts.scrapers.postgresqlscraper.PGStreamReceiver.main(PGStreamReceiver.java:60) >>>>>>>>>>>>>>>>>> Caused by: java.net.SocketException: Connection reset >>>>>>>>>>>>>>>>>> at java.net.SocketInputStream.read(SocketInputStream.java:220) >>>>>>>>>>>>>>>>>> at java.net.SocketInputStream.read(SocketInputStream >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>