postgres.git / summary / log / commit / refs

commit    d1a2fa3d9901c1e8f6bba1cecbb4ecdd64f4849e
Author:   Amit Kapila <akapila@postgresql.org>
Date:     Tue Nov 13 05:06:59 2018 +0000
First released in: 9.6.12, 10.7

    Fix the initialization of atomic variable introduced by the
    group clearing mechanism.
    
    Commit 0e141c0fbb introduced initialization of atomic variable in
    InitProcess which means that it's not safe to look at it for backends that
    aren't currently in use.  Fix that by initializing the same 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 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index bfa84992ea3..51882642ff5 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -266,6 +266,12 @@ InitProcGlobal(void) /* Initialize lockGroupMembers list. */ dlist_init(&procs[i].lockGroupMembers); + + /* + * Initialize the atomic variable, otherwise, it won't be safe to + * access it for backends that aren't currently in use. + */ + pg_atomic_init_u32(&(procs[i].procArrayGroupNext), INVALID_PGPROCNO); } /* @@ -399,7 +405,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); [parent: 5574a0181962]