Change overly strict Assert in TransactionGroupUpdateXidStatus.
authorAmit Kapila <[email protected]>
Thu, 12 Dec 2019 06:21:30 +0000 (11:51 +0530)
committerAmit Kapila <[email protected]>
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
Back-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,