*** a/src/backend/access/transam/xlog.c --- b/src/backend/access/transam/xlog.c *************** *** 6984,6995 **** 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); --- 6984,6992 ---- *** a/src/backend/storage/ipc/procarray.c --- b/src/backend/storage/ipc/procarray.c *************** *** 1849,1880 **** HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids, int nvxids) LWLockAcquire(ProcArrayLock, LW_SHARED); ! while (VirtualTransactionIdIsValid(*vxids)) { ! 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 (VirtualTransactionIdIsValid(vxid)) { ! if (VirtualTransactionIdEquals(vxid, *vxids) && ! pgxact->delayChkpt) { result = true; break; } } } - - if (result) - break; - - /* The virtual transaction is gone now, wait for the next one */ - vxids++; } LWLockRelease(ProcArrayLock); --- 1849,1878 ---- LWLockAcquire(ProcArrayLock, LW_SHARED); ! 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 i; ! for (i = 0; i < nvxids; i++) { ! if (VirtualTransactionIdEquals(vxid, vxids[i])) { result = true; break; } } + if (result) + break; } } LWLockRelease(ProcArrayLock);