From 7f31b0ec12e52b6c967047384353895538161840 Mon Sep 17 00:00:00 2001
From: Alvaro Herrera <alvherre@alvh.no-ip.org>
Date: Thu, 29 Apr 2021 13:19:54 -0400
Subject: [PATCH] Alvaro's edits

---
 src/backend/replication/slot.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index d28330cbd8..cd6f75b3e9 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1172,19 +1172,17 @@ InvalidateObsoleteReplicationSlot(ReplicationSlot *s, XLogRecPtr oldestLSN)
 
 	while (true)
 	{
-		XLogRecPtr	restart_lsn = InvalidXLogRecPtr;
+		XLogRecPtr	restart_lsn;
 		bool		slot_conflicts;
 		NameData	slotname;
 		int			active_pid = 0;
 
 		Assert(LWLockHeldByMeInMode(ReplicationSlotControlLock, LW_SHARED));
 
-		CHECK_FOR_INTERRUPTS();
-
 		slot_conflicts = false;
 
 		if (!s->in_use)
-			continue;
+			break;
 
 		/*
 		 * Check if the slot needs to be invalidated. If it needs to be
@@ -1205,12 +1203,16 @@ InvalidateObsoleteReplicationSlot(ReplicationSlot *s, XLogRecPtr oldestLSN)
 			slotname = s->data.name;
 			active_pid = s->active_pid;
 
-			/* check if we can acquire it */
+			/*
+			 * If the slot can be acquired, do so and mark it invalidated
+			 * immediately.  Otherwise we'll signal the owning process, below,
+			 * and retry.
+			 */
 			if (active_pid == 0)
 			{
 				MyReplicationSlot = s;
 				s->active_pid = MyProcPid;
-				s->data.invalidated_at = s->data.restart_lsn;
+				s->data.invalidated_at = restart_lsn;
 				s->data.restart_lsn = InvalidXLogRecPtr;
 			}
 		}
@@ -1262,6 +1264,7 @@ InvalidateObsoleteReplicationSlot(ReplicationSlot *s, XLogRecPtr oldestLSN)
 
 			/* re-acquire for next loop iteration */
 			LWLockAcquire(ReplicationSlotControlLock, LW_SHARED);
+			continue;
 		}
 		else
 		{
@@ -1286,7 +1289,6 @@ InvalidateObsoleteReplicationSlot(ReplicationSlot *s, XLogRecPtr oldestLSN)
 
 			break;
 		}
-
 	}
 
 	Assert(!released_lock == LWLockHeldByMeInMode(ReplicationSlotControlLock, LW_SHARED));
@@ -1313,8 +1315,6 @@ restart:
 	{
 		ReplicationSlot *s = &ReplicationSlotCtl->replication_slots[i];
 
-		CHECK_FOR_INTERRUPTS();
-
 		if (!s->in_use)
 			continue;
 
-- 
2.20.1

