summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas2013-01-17 21:12:30 +0000
committerHeikki Linnakangas2013-01-17 21:45:45 +0000
commit3684a534efbd2ffd72e2c4cbd21f9752be3efaf1 (patch)
tree52da979cbedcbea664a4e7591deb1bf80b5ccc5f
parent279628a0a7cf582f7dfb68e25b7b76183dd8ff2f (diff)
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.
-rw-r--r--src/backend/replication/libpqwalreceiver/libpqwalreceiver.c20
-rw-r--r--src/backend/replication/walreceiver.c4
2 files changed, 18 insertions, 6 deletions
diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
index 7374489b403..84ab25b0e2a 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 16cf9444a57..444be9463bc 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;
}