summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHeikki Linnakangas2013-01-17 21:12:30 +0000
committerHeikki Linnakangas2013-01-17 21:45:45 +0000
commit3684a534efbd2ffd72e2c4cbd21f9752be3efaf1 (patch)
tree52da979cbedcbea664a4e7591deb1bf80b5ccc5f /src
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.
Diffstat (limited to 'src')
-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;
}