postgres.git / summary / log / commit / refs

commit    fb435f40d5e34f85076a0af56b2f3bf7b86122b8
Author:   Noah Misch <noah@leadboat.com>
Date:     Wed Jun 12 23:50:14 2013 +0000
First released in: 9.3.0

    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.


src/backend/access/transam/xlog.c | 3 --- 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); [parent: ff53890f687c]