From bf73f2992016c555262657b3288fc99bacf8594f Mon Sep 17 00:00:00 2001
From: Peter Smith <peter.b.smith@fujitsu.com>
Date: Wed, 11 Aug 2021 17:07:34 +1000
Subject: [PATCH v1] WIP - skip the keepalive on FIRST loop iteration

---
 src/backend/replication/walsender.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index d8051c3..b25b2c7 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -1408,6 +1408,7 @@ WalSndWaitForWal(XLogRecPtr loc)
 	static XLogRecPtr RecentFlushPtr = InvalidXLogRecPtr;
 	extern int hogestate;
 	bool		lagtaken = false;
+	bool		loop_first_time = true;
 
 	/*
 	 * Fast path to avoid acquiring the spinlock in case we already know we
@@ -1477,7 +1478,8 @@ WalSndWaitForWal(XLogRecPtr loc)
 		 * otherwise idle, this keepalive will trigger a reply. Processing the
 		 * reply will update these MyWalSnd locations.
 		 */
-		if (MyWalSnd->flush < sentPtr &&
+		if (!loop_first_time && /* avoid keepalive on first iteration */
+			MyWalSnd->flush < sentPtr &&
 			MyWalSnd->write < sentPtr &&
 			!waiting_for_ping_response)
 		{
@@ -1557,6 +1559,7 @@ WalSndWaitForWal(XLogRecPtr loc)
 			wakeEvents |= WL_SOCKET_WRITEABLE;
 
 		WalSndWait(wakeEvents, sleeptime, WAIT_EVENT_WAL_SENDER_WAIT_WAL);
+		loop_first_time = false;
 	}
 
 	/* reactivate latch so WalSndLoop knows to continue */
-- 
1.8.3.1

