]> granicus.if.org Git - postgresql/commitdiff
Properly initialize write, flush and replay locations in walsender slots
authorMagnus Hagander <magnus@hagander.net>
Sun, 13 Dec 2015 15:40:37 +0000 (16:40 +0100)
committerMagnus Hagander <magnus@hagander.net>
Sun, 13 Dec 2015 15:46:56 +0000 (16:46 +0100)
These would leak random xlog positions if a walsender used for backup would
a walsender slot previously used by a replication walsender.

In passing also fix a couple of cases where the xlog pointer is directly
compared to zero instead of using XLogRecPtrIsInvalid, noted by
Michael Paquier.

src/backend/replication/walsender.c

index 4a4643ef2f2383c7ca002076ee52cfbacf0e9ff3..c13567298c2f9de7c295e2a5a29e852ce41fb541 100644 (file)
@@ -1962,6 +1962,9 @@ InitWalSenderSlot(void)
                         */
                        walsnd->pid = MyProcPid;
                        walsnd->sentPtr = InvalidXLogRecPtr;
+                       walsnd->write = InvalidXLogRecPtr;
+                       walsnd->flush = InvalidXLogRecPtr;
+                       walsnd->apply = InvalidXLogRecPtr;
                        walsnd->state = WALSNDSTATE_STARTUP;
                        walsnd->latch = &MyProc->procLatch;
                        SpinLockRelease(&walsnd->mutex);
@@ -2821,15 +2824,15 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS)
                        values[1] = CStringGetTextDatum(WalSndGetStateString(state));
                        values[2] = LSNGetDatum(sentPtr);
 
-                       if (write == 0)
+                       if (XLogRecPtrIsInvalid(write))
                                nulls[3] = true;
                        values[3] = LSNGetDatum(write);
 
-                       if (flush == 0)
+                       if (XLogRecPtrIsInvalid(flush))
                                nulls[4] = true;
                        values[4] = LSNGetDatum(flush);
 
-                       if (apply == 0)
+                       if (XLogRecPtrIsInvalid(apply))
                                nulls[5] = true;
                        values[5] = LSNGetDatum(apply);