summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmit Kapila2018-11-13 05:13:35 +0000
committerAmit Kapila2018-11-13 05:13:35 +0000
commit1a8bde490c982cbdd9d174e72d42f6042e9bf4ee (patch)
treeb090ea3754b44cbeb7998de3608bfb76ef2fbd79
parentfe66fc6f94221c5d884b63902b8d48ad87aba5e6 (diff)
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
-rw-r--r--src/backend/storage/lmgr/proc.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index cb6e1e3e5bc..3f80c822887 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -268,6 +268,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);
}
/*
@@ -401,7 +407,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);