postgres.git / summary / log / commit / refs

commit    741deb2603c758c67f199c9129d2e92bd80cec2e
Author:   Amit Kapila <akapila@postgresql.org>
Date:     Mon Jun 28 03:12:48 2021 +0000
First released in: 14.0, 11.13, 12.8, 13.4

    Fix race condition in TransactionGroupUpdateXidStatus().
    
    When we cannot immediately acquire XactSLRULock 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


src/backend/access/transam/clog.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c index 5d6e088e8bd..40170b868ba 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; } [parent: fd7bc10ab4c6]