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);