From d44933c9f94becaf5e5ab1172373ccc18170a28d Mon Sep 17 00:00:00 2001
From: Lakshmi N <lakshmi.jhs@gmail.com>
Date: Fri, 8 May 2026 19:42:29 -0700
Subject: [PATCH] slotsync: avoid false dropped replication slot log messages
 during slotsync

---
 src/backend/replication/logical/slotsync.c | 31 +++++++++++++++++-----
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
index ad3747e598c..072f5c55e36 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -566,17 +566,34 @@ drop_local_obsolete_slots(List *remote_slot_list)
 
 			if (synced_slot)
 			{
+				NameData	slotname;
+				Oid			slotdb;
+
+				/*
+				 * Snapshot the identity for the log message below.  Once
+				 * ReplicationSlotDropAcquired() returns, the shared-memory
+				 * entry can be immediately reused by another backend (its
+				 * 'in_use' flag is cleared and ReplicationSlotControlLock is
+				 * released), so reading local_slot->data afterwards is unsafe.
+				 */
+				memcpy(&slotname, &local_slot->data.name, sizeof(NameData));
+				slotdb = local_slot->data.database;
+
 				ReplicationSlotAcquire(NameStr(local_slot->data.name), true, false);
 				ReplicationSlotDropAcquired();
-			}
 
-			UnlockSharedObject(DatabaseRelationId, local_slot->data.database,
-							   0, AccessShareLock);
+				UnlockSharedObject(DatabaseRelationId, slotdb,
+								   0, AccessShareLock);
 
-			ereport(LOG,
-					errmsg("dropped replication slot \"%s\" of database with OID %u",
-						   NameStr(local_slot->data.name),
-						   local_slot->data.database));
+				ereport(LOG,
+						errmsg("dropped replication slot \"%s\" of database with OID %u",
+							   NameStr(slotname), slotdb));
+			}
+			else
+			{
+				UnlockSharedObject(DatabaseRelationId, local_slot->data.database,
+								   0, AccessShareLock);
+			}
 		}
 	}
 }
-- 
2.43.0

