postgres.git / summary / log / commit / refs

commit    61c7bee2196d284a19692d83b33eac7588693292
Author:   Magnus Hagander <magnus@hagander.net>
Date:     Sun Dec 13 15:40:37 2015 +0000
First released in: 9.6.0, 9.3.11, 9.4.6, 9.5.0

    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.


src/backend/replication/walsender.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index df064d29a3b..a39f373fa15 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -1957,6 +1957,9 @@ InitWalSenderSlot(void) */ walsnd->pid = MyProcPid; walsnd->sentPtr = InvalidXLogRecPtr; + walsnd->write = InvalidXLogRecPtr; + walsnd->flush = InvalidXLogRecPtr; + walsnd->apply = InvalidXLogRecPtr; walsnd->state = WALSNDSTATE_STARTUP; SpinLockRelease(&walsnd->mutex); /* don't need the lock anymore */ @@ -2843,15 +2846,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); [parent: 6bdef1369f01]