From d44933c9f94becaf5e5ab1172373ccc18170a28d Mon Sep 17 00:00:00 2001 From: Lakshmi N 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