Commit 92f4786f authored by Simon Riggs's avatar Simon Riggs

Additional test for each commit in sync rep path to plug minute

possibility of race condition that would effect performance only.
Requested by Robert Haas. Re-arrange related comments.
parent bfa4440c
...@@ -114,21 +114,28 @@ SyncRepWaitForLSN(XLogRecPtr XactCommitLSN) ...@@ -114,21 +114,28 @@ SyncRepWaitForLSN(XLogRecPtr XactCommitLSN)
/* Reset the latch before adding ourselves to the queue. */ /* Reset the latch before adding ourselves to the queue. */
ResetLatch(&MyProc->waitLatch); ResetLatch(&MyProc->waitLatch);
/*
* Set our waitLSN so WALSender will know when to wake us, and add
* ourselves to the queue.
*/
LWLockAcquire(SyncRepLock, LW_EXCLUSIVE); LWLockAcquire(SyncRepLock, LW_EXCLUSIVE);
Assert(MyProc->syncRepState == SYNC_REP_NOT_WAITING); Assert(MyProc->syncRepState == SYNC_REP_NOT_WAITING);
if (!WalSndCtl->sync_standbys_defined)
{
/* /*
* We don't wait for sync rep if WalSndCtl->sync_standbys_defined is * We don't wait for sync rep if WalSndCtl->sync_standbys_defined is
* not set. See SyncRepUpdateSyncStandbysDefined. * not set. See SyncRepUpdateSyncStandbysDefined.
*
* Also check that the standby hasn't already replied. Unlikely
* race condition but we'll be fetching that cache line anyway
* so its likely to be a low cost check.
*/ */
if (!WalSndCtl->sync_standbys_defined ||
XLByteLE(XactCommitLSN, WalSndCtl->lsn))
{
LWLockRelease(SyncRepLock); LWLockRelease(SyncRepLock);
return; return;
} }
/*
* Set our waitLSN so WALSender will know when to wake us, and add
* ourselves to the queue.
*/
MyProc->waitLSN = XactCommitLSN; MyProc->waitLSN = XactCommitLSN;
MyProc->syncRepState = SYNC_REP_WAITING; MyProc->syncRepState = SYNC_REP_WAITING;
SyncRepQueueInsert(); SyncRepQueueInsert();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment