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.
This commit is contained in:
Heikki Linnakangas 2013-01-17 23:12:30 +02:00
parent 279628a0a7
commit 3684a534ef
2 changed files with 17 additions and 5 deletions

View File

@ -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);
}
}

View File

@ -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;
}