Fix pg_receivexlog --synchronous

Make pg_receivexlog work correctly with --synchronous without slots

Backpatch to 9.5

Gabriele Bartolini, reviewed by Michael Paquier and Simon Riggs
This commit is contained in:
Simon Riggs 2016-08-29 12:16:18 +01:00
parent bd082231ed
commit 49340627f9
1 changed files with 15 additions and 13 deletions

View File

@ -503,26 +503,28 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
if (!CheckServerVersionForStreaming(conn))
return false;
/*
* Decide whether we want to report the flush position. If we report
* the flush position, the primary will know what WAL we'll
* possibly re-request, and it can then remove older WAL safely.
* We must always do that when we are using slots.
*
* Reporting the flush position makes one eligible as a synchronous
* replica. People shouldn't include generic names in
* synchronous_standby_names, but we've protected them against it so
* far, so let's continue to do so unless specifically requested.
*/
if (replication_slot != NULL)
{
/*
* Report the flush position, so the primary can know what WAL we'll
* possibly re-request, and remove older WAL safely.
*
* We only report it when a slot has explicitly been used, because
* reporting the flush position makes one eligible as a synchronous
* replica. People shouldn't include generic names in
* synchronous_standby_names, but we've protected them against it so
* far, so let's continue to do so in the situations when possible. If
* they've got a slot, though, we need to report the flush position,
* so that the master can remove WAL.
*/
reportFlushPosition = true;
sprintf(slotcmd, "SLOT \"%s\" ", replication_slot);
}
else
{
reportFlushPosition = false;
if (stream->synchronous)
reportFlushPosition = true;
else
reportFlushPosition = false;
slotcmd[0] = 0;
}