]> granicus.if.org Git - postgresql/commitdiff
Fix pg_receivexlog --synchronous
authorSimon Riggs <simon@2ndQuadrant.com>
Mon, 29 Aug 2016 11:16:18 +0000 (12:16 +0100)
committerSimon Riggs <simon@2ndQuadrant.com>
Mon, 29 Aug 2016 11:16:18 +0000 (12:16 +0100)
Make pg_receivexlog work correctly with --synchronous without slots

Backpatch to 9.5

Gabriele Bartolini, reviewed by Michael Paquier and Simon Riggs

src/bin/pg_basebackup/receivelog.c

index 595213f0420f524d8600b376b53faa8a085246c5..062730b6b43b5a85580a5087d36fb4966e66fa19 100644 (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;
        }