summaryrefslogtreecommitdiff
path: root/src/backend/replication/syncrep.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2011-08-09 15:30:51 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2011-08-09 15:30:51 -0400
commit6760a4d4029121981bf3ec24847ddfbacecc070d (patch)
treefeb33208524b430e32fefd2c11158235ba1306a6 /src/backend/replication/syncrep.c
parent028a0c5a2913f18c954845cc014786912f39fa30 (diff)
Documentation improvement and minor code cleanups for the latch facility.
Improve the documentation around weak-memory-ordering risks, and do a pass of general editorialization on the comments in the latch code. Make the Windows latch code more like the Unix latch code where feasible; in particular provide the same Assert checks in both implementations. Fix poorly-placed WaitLatch call in syncrep.c. This patch resolves, for the moment, concerns around weak-memory-ordering bugs in latch-related code: we have documented the restrictions and checked that existing calls meet them. In 9.2 I hope that we will install suitable memory barrier instructions in SetLatch/ResetLatch, so that their callers don't need to be quite so careful.
Diffstat (limited to 'src/backend/replication/syncrep.c')
-rw-r--r--src/backend/replication/syncrep.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/backend/replication/syncrep.c b/src/backend/replication/syncrep.c
index 2b52d1616be..7fcbec24400 100644
--- a/src/backend/replication/syncrep.c
+++ b/src/backend/replication/syncrep.c
@@ -166,13 +166,6 @@ SyncRepWaitForLSN(XLogRecPtr XactCommitLSN)
{
int syncRepState;
- /*
- * Wait on latch for up to 60 seconds. This allows us to check for
- * postmaster death regularly while waiting. Note that timeout here
- * does not necessarily release from loop.
- */
- WaitLatch(&MyProc->waitLatch, 60000000L);
-
/* Must reset the latch before testing state. */
ResetLatch(&MyProc->waitLatch);
@@ -184,6 +177,12 @@ SyncRepWaitForLSN(XLogRecPtr XactCommitLSN)
* walsender changes the state to SYNC_REP_WAIT_COMPLETE, it will
* never update it again, so we can't be seeing a stale value in that
* case.
+ *
+ * Note: on machines with weak memory ordering, the acquisition of
+ * the lock is essential to avoid race conditions: we cannot be sure
+ * the sender's state update has reached main memory until we acquire
+ * the lock. We could get rid of this dance if SetLatch/ResetLatch
+ * contained memory barriers.
*/
syncRepState = MyProc->syncRepState;
if (syncRepState == SYNC_REP_WAITING)
@@ -246,6 +245,13 @@ SyncRepWaitForLSN(XLogRecPtr XactCommitLSN)
SyncRepCancelWait();
break;
}
+
+ /*
+ * Wait on latch for up to 60 seconds. This allows us to check for
+ * cancel/die signal or postmaster death regularly while waiting. Note
+ * that timeout here does not necessarily release from loop.
+ */
+ WaitLatch(&MyProc->waitLatch, 60000000L);
}
/*