diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 0a573f7f65..7210ca5fdd 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 8605fe7670..b5f66fbfb0 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; + int pgprocno = arrayP->pgprocnos[index]; + volatile PGPROC *proc = &allProcs[pgprocno]; + volatile PGXACT *pgxact = &allPgXact[pgprocno]; + VirtualTransactionId vxid; - GET_VXID_FROM_PGPROC(vxid, *proc); - if (VirtualTransactionIdIsValid(vxid)) + GET_VXID_FROM_PGPROC(vxid, *proc); + + if (pgxact->delayChkpt && VirtualTransactionIdIsValid(vxid)) + { + int i; + + 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);