Observe array length in HaveVirtualXIDsDelayingChkpt().
authorNoah Misch <noah@leadboat.com>
Wed, 12 Jun 2013 23:50:14 +0000 (19:50 -0400)
committerNoah Misch <noah@leadboat.com>
Wed, 12 Jun 2013 23:50:14 +0000 (19:50 -0400)
Since commit f21bb9cfb5646e1793dcc9c0ea697bab99afa523, this function
ignores the caller-provided length and loops until it finds a
terminator, which GetVirtualXIDsDelayingChkpt() never adds.  Restore the
previous loop control logic.  In passing, revert the addition of an
unused variable by the same commit, presumably a debugging relic.

src/backend/access/transam/xlog.c
src/backend/storage/ipc/procarray.c

index 0a573f7f65c175120976a4f9117f122c0e43c3a4..7210ca5fddba177fb1c6949761e938165892bb28 100644 (file)
@@ -6984,12 +6984,9 @@ CreateCheckPoint(int flags)
    vxids = GetVirtualXIDsDelayingChkpt(&nvxids);
    if (nvxids > 0)
    {
-       uint32      nwaits = 0;
-
        do
        {
            pg_usleep(10000L);  /* wait for 10 msec */
-           nwaits++;
        } while (HaveVirtualXIDsDelayingChkpt(vxids, nvxids));
    }
    pfree(vxids);
index 8605fe767078eac726e58c75ea8bcff1a652c8bd..b5f66fbfb0415dcd4acaabb8c2671a6d883bf233 100644 (file)
@@ -1849,32 +1849,30 @@ HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids, int nvxids)
 
    LWLockAcquire(ProcArrayLock, LW_SHARED);
 
-   while (VirtualTransactionIdIsValid(*vxids))
+   for (index = 0; index < arrayP->numProcs; index++)
    {
-       for (index = 0; index < arrayP->numProcs; index++)
+       int         pgprocno = arrayP->pgprocnos[index];
+       volatile PGPROC *proc = &allProcs[pgprocno];
+       volatile PGXACT *pgxact = &allPgXact[pgprocno];
+       VirtualTransactionId vxid;
+
+       GET_VXID_FROM_PGPROC(vxid, *proc);
+
+       if (pgxact->delayChkpt && VirtualTransactionIdIsValid(vxid))
        {
-           int         pgprocno = arrayP->pgprocnos[index];
-           volatile PGPROC *proc = &allProcs[pgprocno];
-           volatile PGXACT *pgxact = &allPgXact[pgprocno];
-           VirtualTransactionId vxid;
+           int         i;
 
-           GET_VXID_FROM_PGPROC(vxid, *proc);
-           if (VirtualTransactionIdIsValid(vxid))
+           for (i = 0; i < nvxids; i++)
            {
-               if (VirtualTransactionIdEquals(vxid, *vxids) &&
-                   pgxact->delayChkpt)
+               if (VirtualTransactionIdEquals(vxid, vxids[i]))
                {
                    result = true;
                    break;
                }
            }
+           if (result)
+               break;
        }
-
-       if (result)
-           break;
-
-       /* The virtual transaction is gone now, wait for the next one */
-       vxids++;
    }
 
    LWLockRelease(ProcArrayLock);