aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNoah Misch <noah@leadboat.com>2013-06-12 19:50:14 -0400
committerNoah Misch <noah@leadboat.com>2013-06-12 19:50:14 -0400
commitfb435f40d5e34f85076a0af56b2f3bf7b86122b8 (patch)
tree314675c91827fe812600690f71ce46d653f1736f /src
parentff53890f687c7f6b2a10db6661e9c32faf832636 (diff)
downloadpostgresql-fb435f40d5e34f85076a0af56b2f3bf7b86122b8.tar.gz
postgresql-fb435f40d5e34f85076a0af56b2f3bf7b86122b8.zip
Observe array length in HaveVirtualXIDsDelayingChkpt().
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/transam/xlog.c3
-rw-r--r--src/backend/storage/ipc/procarray.c30
2 files changed, 14 insertions, 19 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 0a573f7f65c..7210ca5fddb 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -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);
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index 8605fe76707..b5f66fbfb04 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -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);