postgres.git / summary / log / commit / refs

commit    d4d9f21b64d4290cc6695bcd93a8e4c5fc16badf
Author:   Amit Kapila <akapila@postgresql.org>
Date:     Tue Nov 13 05:39:44 2018 +0000
First released in: 12.0, 11.2

    Fix the initialization of atomic variables introduced by the
    group clearing mechanism.
    
    Commits 0e141c0fbb and baaf272ac9 introduced initialization of atomic
    variables in InitProcess which means that it's not safe to look at those
    for backends that aren't currently in use.  Fix that by initializing them
    during postmaster startup.
    
    Reported-by: Andres Freund
    Author: Amit Kapila
    Backpatch-through: 9.6
    Discussion: https://postgr.es/m/20181027104138.qmbbelopvy7cw2qv@alap3.anarazel.de


src/backend/storage/lmgr/proc.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index 6f9aaa52faf..6ad504453b1 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -267,6 +267,13 @@ InitProcGlobal(void) /* Initialize lockGroupMembers list. */ dlist_init(&procs[i].lockGroupMembers); + + /* + * Initialize the atomic variables, otherwise, it won't be safe to + * access them for backends that aren't currently in use. + */ + pg_atomic_init_u32(&(procs[i].procArrayGroupNext), INVALID_PGPROCNO); + pg_atomic_init_u32(&(procs[i].clogGroupNext), INVALID_PGPROCNO); } /* @@ -401,7 +408,7 @@ InitProcess(void) /* Initialize fields for group XID clearing. */ MyProc->procArrayGroupMember = false; MyProc->procArrayGroupMemberXid = InvalidTransactionId; - pg_atomic_init_u32(&MyProc->procArrayGroupNext, INVALID_PGPROCNO); + Assert(pg_atomic_read_u32(&MyProc->procArrayGroupNext) == INVALID_PGPROCNO); /* Check that group locking fields are in a proper initial state. */ Assert(MyProc->lockGroupLeader == NULL); @@ -416,7 +423,7 @@ InitProcess(void) MyProc->clogGroupMemberXidStatus = TRANSACTION_STATUS_IN_PROGRESS; MyProc->clogGroupMemberPage = -1; MyProc->clogGroupMemberLsn = InvalidXLogRecPtr; - pg_atomic_init_u32(&MyProc->clogGroupNext, INVALID_PGPROCNO); + Assert(pg_atomic_read_u32(&MyProc->clogGroupNext) == INVALID_PGPROCNO); /* * Acquire ownership of the PGPROC's latch, so that we can use WaitLatch [parent: 6b6c64a96dea]