Change overly strict Assert in TransactionGroupUpdateXidStatus.
authorAmit Kapila <akapila@postgresql.org>
Thu, 12 Dec 2019 06:21:30 +0000 (11:51 +0530)
committerAmit Kapila <akapila@postgresql.org>
Tue, 17 Dec 2019 03:59:22 +0000 (09:29 +0530)
This Assert thought that an overflowed transaction can never get registered
for the group update.  But that is not true, because even when the number
of children for a transaction got reduced, the overflow flag is not
changed.  And, for group update, we only care about the current number of
children for a transaction that is being committed.

Based on comments by Andres Freund, remove a redundant Assert in
TransactionIdSetPageStatus as we already had a static Assert for the same
condition a few lines earlier.

Reported-by: Vignesh C
Author: Dilip Kumar
Reviewed-by: Amit Kapila
Backpatch-through: 11
Discussion: https://postgr.es/m/CAFiTN-s5=uJw-Z6JC9gcqtBSjXsrHnU63PXBrA=pnBjqnkm5UA@mail.gmail.com

src/backend/access/transam/clog.c

index 7f7eb21b4f4a8c3acca35e9e725dd4b261f55c4b..f3f1b989266f4a0437773f58a3585510a24db356 100644 (file)
@@ -299,13 +299,6 @@ TransactionIdSetPageStatus(TransactionId xid, int nsubxids,
        memcmp(subxids, MyProc->subxids.xids,
               nsubxids * sizeof(TransactionId)) == 0)
    {
-       /*
-        * We don't try to do group update optimization if a process has
-        * overflowed the subxids array in its PGPROC, since in that case we
-        * don't have a complete list of XIDs for it.
-        */
-       Assert(THRESHOLD_SUBTRANS_CLOG_OPT <= PGPROC_MAX_CACHED_SUBXIDS);
-
        /*
         * If we can immediately acquire CLogControlLock, we update the status
         * of our own XID and release the lock.  If not, try use group XID
@@ -520,10 +513,10 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status,
        PGXACT     *pgxact = &ProcGlobal->allPgXact[nextidx];
 
        /*
-        * Overflowed transactions should not use group XID status update
-        * mechanism.
+        * Transactions with more than THRESHOLD_SUBTRANS_CLOG_OPT sub-XIDs
+        * should not use group XID status update mechanism.
         */
-       Assert(!pgxact->overflowed);
+       Assert(pgxact->nxids <= THRESHOLD_SUBTRANS_CLOG_OPT);
 
        TransactionIdSetPageStatusInternal(proc->clogGroupMemberXid,
                                           pgxact->nxids,