From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Mon, 17 Jan 2011 10:22:24 +0000 (+0200)
Subject: Before exiting walreceiver, fsync() all the WAL received.
X-Git-Tag: REL9_0_3~11
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1435a8554cd514d668a46c4f6b1e4a1e3bd30fd5;p=postgresql

Before exiting walreceiver, fsync() all the WAL received.

Otherwise WAL recovery will replay the un-flushed WAL after walreceiver has
exited, which can lead to a non-recoverable standby if the system crashes hard
at that point.
---

diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index 06646ead94..df4610732b 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -323,6 +323,9 @@ WalRcvDie(int code, Datum arg)
 	/* use volatile pointer to prevent code rearrangement */
 	volatile WalRcvData *walrcv = WalRcv;
 
+	/* Ensure that all WAL records received are flushed to disk */
+	XLogWalRcvFlush();
+
 	SpinLockAcquire(&walrcv->mutex);
 	Assert(walrcv->walRcvState == WALRCV_RUNNING ||
 		   walrcv->walRcvState == WALRCV_STOPPING);