From 596d3804c784b06f2125aa7727b82a265b08ccfb Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Thu, 5 Apr 2018 10:18:01 +0300
Subject: [PATCH 1/1] Call HandleStartupProcInterrupts() less frequently in WAL
 redo.

HandleStartupProcInterrupts() calls PostmasterIsAlive(), which calls read()
on the postmaster death watch pipe. That's relatively expensive, when we do
it between every WAL record.
---
 src/backend/access/transam/xlog.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index b4fd8395b7..3406c58c9b 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7072,6 +7072,7 @@ StartupXLOG(void)
 		{
 			ErrorContextCallback errcallback;
 			TimestampTz xtime;
+			uint32		records_replayed = 0;
 
 			InRedo = true;
 
@@ -7105,8 +7106,13 @@ StartupXLOG(void)
 				}
 #endif
 
-				/* Handle interrupt signals of startup process */
-				HandleStartupProcInterrupts();
+				/*
+				 * Handle interrupt signals of startup process. This includes
+				 * a call to PostmasterIsAlive(), which isn't totally free, so
+				 * don't do this on every record, to avoid the overhead.
+				 */
+				if (records_replayed % 32 == 0)
+					HandleStartupProcInterrupts();
 
 				/*
 				 * Pause WAL replay, if requested by a hot-standby session via
@@ -7269,6 +7275,7 @@ StartupXLOG(void)
 
 				/* Remember this record as the last-applied one */
 				LastRec = ReadRecPtr;
+				records_replayed++;
 
 				/* Allow read-only connections if we're consistent now */
 				CheckRecoveryConsistency();
-- 
2.11.0

