From 090e8a984cf1a8a3ef7f6db6dc919f843902d80c Mon Sep 17 00:00:00 2001
From: Simon Riggs <simon@2ndQuadrant.com>
Date: Thu, 7 Jun 2012 19:26:03 +0100
Subject: [PATCH] Wake WALSender to reduce data loss at failover for async
 commit. WALSender now woken up after each background flush by WALwriter,
 avoiding multi-second replication delay for an all-async commit workload.
 Replication delay reduced from 7s with default settings to 200ms, allowing
 significantly reduced data loss at failover.

Andres Freund and Simon Riggs
---
 src/backend/access/transam/xlog.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 3902c58313..64d7660b38 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -2115,6 +2115,7 @@ XLogBackgroundFlush(void)
 {
 	XLogRecPtr	WriteRqstPtr;
 	bool		flexible = true;
+	bool		wrote_something = false;
 
 	/* XLOG doesn't need flushing during recovery */
 	if (RecoveryInProgress())
@@ -2183,10 +2184,18 @@ XLogBackgroundFlush(void)
 		WriteRqst.Write = WriteRqstPtr;
 		WriteRqst.Flush = WriteRqstPtr;
 		XLogWrite(WriteRqst, flexible, false);
+		wrote_something = true;
 	}
 	LWLockRelease(WALWriteLock);
 
 	END_CRIT_SECTION();
+
+	/*
+	 * If we wrote something then we have something to send to standbys also,
+	 * otherwise the replication delay become around 7s with just async commit.
+	 */
+	if (wrote_something)
+		WalSndWakeup();
 }
 
 /*
-- 
2.40.0