diff options
author | Noah Misch <noah@leadboat.com> | 2013-06-12 19:50:14 -0400 |
---|---|---|
committer | Noah Misch <noah@leadboat.com> | 2013-06-12 19:50:14 -0400 |
commit | fb435f40d5e34f85076a0af56b2f3bf7b86122b8 (patch) | |
tree | 314675c91827fe812600690f71ce46d653f1736f /src | |
parent | ff53890f687c7f6b2a10db6661e9c32faf832636 (diff) | |
download | postgresql-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.c | 3 | ||||
-rw-r--r-- | src/backend/storage/ipc/procarray.c | 30 |
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); |