summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmit Kapila2021-06-28 03:39:42 +0000
committerAmit Kapila2021-06-28 03:39:42 +0000
commitc62c3769ff6134f442c9acb623be4a0d4b17ca11 (patch)
treeed5698b1179bc13a336569554a542bc4e4877a0d
parent38ca11adeb5a9a2812510048dd0d43dfbd05caf8 (diff)
Fix race condition in TransactionGroupUpdateXidStatus().
When we cannot immediately acquire CLogControlLock in exclusive mode at commit time, we add ourselves to a list of processes that need their XIDs status update. We do this if the clog page where we need to update the current transaction status is the same as the group leader's clog page, otherwise, we allow the caller to clear it by itself. Now, when we can't add ourselves to any group, we were not clearing the current proc if it has already become a member of some group which was leading to an assertion failure when the same proc was assigned to another backend after the current backend exits. Reported-by: Alexander Lakhin Bug: 17072 Author: Amit Kapila Tested-By: Alexander Lakhin Backpatch-through: 11, where it was introduced Discussion: https://postgr.es/m/17072-2f8764857ef2c92a@postgresql.org
-rw-r--r--src/backend/access/transam/clog.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c
index 26a6f5a389a..4f2baa0d3b9 100644
--- a/src/backend/access/transam/clog.c
+++ b/src/backend/access/transam/clog.c
@@ -450,7 +450,12 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status,
if (nextidx != INVALID_PGPROCNO &&
ProcGlobal->allProcs[nextidx].clogGroupMemberPage != proc->clogGroupMemberPage)
{
+ /*
+ * Ensure that this proc is not a member of any clog group that
+ * needs an XID status update.
+ */
proc->clogGroupMember = false;
+ pg_atomic_write_u32(&proc->clogGroupNext, INVALID_PGPROCNO);
return false;
}