aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMagnus Hagander <magnus@hagander.net>2015-12-13 16:40:37 +0100
committerMagnus Hagander <magnus@hagander.net>2015-12-13 16:43:35 +0100
commita9c56ff0e1f19fd6c2e48cfe44407c8cb8c4fbd5 (patch)
tree3879d26d3b1b0b60d225b32e01ef923637a353b1 /src
parent332be65b5e6a99420dd9b2762fe3e5602538053d (diff)
downloadpostgresql-a9c56ff0e1f19fd6c2e48cfe44407c8cb8c4fbd5.tar.gz
postgresql-a9c56ff0e1f19fd6c2e48cfe44407c8cb8c4fbd5.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/replication/walsender.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 0fc57105476..ed7ece6c7e8 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -1960,6 +1960,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);
@@ -2825,15 +2828,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);