From 3684a534efbd2ffd72e2c4cbd21f9752be3efaf1 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Thu, 17 Jan 2013 23:12:30 +0200 Subject: [PATCH] I added a result set to START_STREAMING command, but neglected walreceiver. The patch to allow pg_receivexlog to switch timeline added a result set after copy has ended in START_STREAMING command, to return the next timeline's ID to the client. But walreceived didn't get the memo, and threw an error on the unexpected result set. Fix. --- .../libpqwalreceiver/libpqwalreceiver.c | 18 ++++++++++++++---- src/backend/replication/walreceiver.c | 4 +++- 2 files changed, 17 insertions(+), 5 deletions(-) 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; }