From b487979a362f90b866a86b1600791178b5574a75 Mon Sep 17 00:00:00 2001
From: Alvaro Herrera <alvherre@alvh.no-ip.org>
Date: Fri, 29 Jan 2021 22:34:58 -0300
Subject: [PATCH v2 3/3] add barriers

---
 src/backend/access/transam/xlog.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 8073a92ceb..458efc5a55 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -1169,6 +1169,8 @@ XLogInsertRecord(XLogRecData *rdata,
 	{
 		/* advance global request to include new block(s) */
 		pg_atomic_monotonic_advance_u64(&XLogCtl->LogwrtRqst.Write, EndPos);
+		pg_memory_barrier();
+
 		/* update local result copy */
 		LogwrtResult.Write = pg_atomic_read_u64(&XLogCtl->LogwrtResult.Write);
 		LogwrtResult.Flush = pg_atomic_read_u64(&XLogCtl->LogwrtResult.Flush);
@@ -2165,6 +2167,7 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, bool opportunistic)
 
 			/* Before waiting, update LogwrtResult */
 			pg_atomic_monotonic_advance_u64(&XLogCtl->LogwrtRqst.Write, OldPageRqstPtr);
+			pg_memory_barrier();
 
 			LogwrtResult.Write = pg_atomic_read_u64(&XLogCtl->LogwrtResult.Write);
 			LogwrtResult.Flush = pg_atomic_read_u64(&XLogCtl->LogwrtResult.Flush);
@@ -2678,6 +2681,7 @@ XLogWrite(XLogwrt WriteRqst, bool flexible)
 
 		pg_atomic_monotonic_advance_u64(&XLogCtl->LogwrtRqst.Write, LogwrtResult.Write);
 		pg_atomic_monotonic_advance_u64(&XLogCtl->LogwrtRqst.Flush, LogwrtResult.Flush);
+		pg_write_barrier();
 	}
 }
 
@@ -2905,6 +2909,7 @@ XLogFlush(XLogRecPtr record)
 		WriteRqstPtr = pg_atomic_read_u64(&XLogCtl->LogwrtRqst.Write);
 		LogwrtResult.Write = pg_atomic_read_u64(&XLogCtl->LogwrtResult.Write);
 		LogwrtResult.Flush = pg_atomic_read_u64(&XLogCtl->LogwrtResult.Flush);
+		pg_read_barrier();
 
 		/* done already? */
 		if (record <= LogwrtResult.Flush)
@@ -2936,6 +2941,7 @@ XLogFlush(XLogRecPtr record)
 		/* Got the lock; recheck whether request is satisfied */
 		LogwrtResult.Write = pg_atomic_read_u64(&XLogCtl->LogwrtResult.Write);
 		LogwrtResult.Flush = pg_atomic_read_u64(&XLogCtl->LogwrtResult.Flush);
+		pg_read_barrier();
 		if (record <= LogwrtResult.Flush)
 		{
 			LWLockRelease(WALWriteLock);
@@ -3055,6 +3061,7 @@ XLogBackgroundFlush(void)
 	LogwrtResult.Flush = pg_atomic_read_u64(&XLogCtl->LogwrtResult.Flush);
 	WriteRqst.Write = pg_atomic_read_u64(&XLogCtl->LogwrtRqst.Write);
 	WriteRqst.Flush = pg_atomic_read_u64(&XLogCtl->LogwrtRqst.Flush);
+	pg_read_barrier();
 
 	/* back off to last completed page boundary */
 	WriteRqst.Write -= WriteRqst.Write % XLOG_BLCKSZ;
@@ -3138,6 +3145,7 @@ XLogBackgroundFlush(void)
 	LWLockAcquire(WALWriteLock, LW_EXCLUSIVE);
 	LogwrtResult.Write = pg_atomic_read_u64(&XLogCtl->LogwrtResult.Write);
 	LogwrtResult.Flush = pg_atomic_read_u64(&XLogCtl->LogwrtResult.Flush);
+	pg_read_barrier();
 	if (WriteRqst.Write > LogwrtResult.Write ||
 		WriteRqst.Flush > LogwrtResult.Flush)
 	{
@@ -3227,6 +3235,7 @@ XLogNeedsFlush(XLogRecPtr record)
 	/* read LogwrtResult and update local state */
 	LogwrtResult.Write = pg_atomic_read_u64(&XLogCtl->LogwrtResult.Write);
 	LogwrtResult.Flush = pg_atomic_read_u64(&XLogCtl->LogwrtResult.Flush);
+	pg_read_barrier();
 
 	/* check again */
 	if (record <= LogwrtResult.Flush)
@@ -7780,6 +7789,7 @@ StartupXLOG(void)
 
 	pg_atomic_write_u64(&XLogCtl->LogwrtRqst.Write, EndOfLog);
 	pg_atomic_write_u64(&XLogCtl->LogwrtRqst.Flush, EndOfLog);
+	pg_write_barrier();
 
 	/*
 	 * Update full_page_writes in shared memory and write an XLOG_FPW_CHANGE
-- 
2.20.1

