0001-slotsync-avoid-false-dropped-replication-slot-log-me.patch
application/octet-stream
Filename: 0001-slotsync-avoid-false-dropped-replication-slot-log-me.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0001
Subject: slotsync: avoid false dropped replication slot log messages during slotsync
| File | + | − |
|---|---|---|
| src/backend/replication/logical/slotsync.c | 24 | 7 |
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