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