diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c index 7374489b40..84ab25b0e2 100644 --- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c +++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c @@ -215,17 +215,27 @@ libpqrcv_endstreaming(void) while ((res = PQgetResult(streamConn)) != NULL) { - if (PQresultStatus(res) != PGRES_COMMAND_OK) - ereport(ERROR, - (errmsg("error reading result of streaming command: %s", - PQerrorMessage(streamConn)))); /* + * After Copy, if the streaming ended because we reached end of the + * timeline, server sends one result set with the next timeline's ID. + * We don't need it, so just slurp and ignore it. + * * If we had not yet received CopyDone from the backend, PGRES_COPY_IN * is also possible. However, at the moment this function is only * called after receiving CopyDone from the backend - the walreceiver * never terminates replication on its own initiative. */ + switch (PQresultStatus(res)) + { + case PGRES_COMMAND_OK: + case PGRES_TUPLES_OK: + break; + default: + ereport(ERROR, + (errmsg("error reading result of streaming command: %s", + PQerrorMessage(streamConn)))); + } PQclear(res); } } diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c index 16cf9444a5..444be9463b 100644 --- a/src/backend/replication/walreceiver.c +++ b/src/backend/replication/walreceiver.c @@ -431,7 +431,9 @@ WalReceiverMain(void) { ereport(LOG, (errmsg("replication terminated by primary server"), - errdetail("End of WAL reached on timeline %u", startpointTLI))); + errdetail("End of WAL reached on timeline %u at %X/%X", + startpointTLI, + (uint32) (LogstreamResult.Write >> 32), (uint32) LogstreamResult.Write))); endofwal = true; break; }