Commit 263c1957 authored by Magnus Hagander's avatar Magnus Hagander

Properly initialize write, flush and replay locations in walsender slots

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.
parent 6d96cd07
...@@ -1962,6 +1962,9 @@ InitWalSenderSlot(void) ...@@ -1962,6 +1962,9 @@ InitWalSenderSlot(void)
*/ */
walsnd->pid = MyProcPid; walsnd->pid = MyProcPid;
walsnd->sentPtr = InvalidXLogRecPtr; walsnd->sentPtr = InvalidXLogRecPtr;
walsnd->write = InvalidXLogRecPtr;
walsnd->flush = InvalidXLogRecPtr;
walsnd->apply = InvalidXLogRecPtr;
walsnd->state = WALSNDSTATE_STARTUP; walsnd->state = WALSNDSTATE_STARTUP;
walsnd->latch = &MyProc->procLatch; walsnd->latch = &MyProc->procLatch;
SpinLockRelease(&walsnd->mutex); SpinLockRelease(&walsnd->mutex);
...@@ -2821,15 +2824,15 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS) ...@@ -2821,15 +2824,15 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS)
values[1] = CStringGetTextDatum(WalSndGetStateString(state)); values[1] = CStringGetTextDatum(WalSndGetStateString(state));
values[2] = LSNGetDatum(sentPtr); values[2] = LSNGetDatum(sentPtr);
if (write == 0) if (XLogRecPtrIsInvalid(write))
nulls[3] = true; nulls[3] = true;
values[3] = LSNGetDatum(write); values[3] = LSNGetDatum(write);
if (flush == 0) if (XLogRecPtrIsInvalid(flush))
nulls[4] = true; nulls[4] = true;
values[4] = LSNGetDatum(flush); values[4] = LSNGetDatum(flush);
if (apply == 0) if (XLogRecPtrIsInvalid(apply))
nulls[5] = true; nulls[5] = true;
values[5] = LSNGetDatum(apply); values[5] = LSNGetDatum(apply);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment