v1-0001-Use-outer-memory-context-across-slot-sync-retries.patch
application/octet-stream
Filename: v1-0001-Use-outer-memory-context-across-slot-sync-retries.patch
Type: application/octet-stream
Part: 0
From aa99d017b04af586d74fafc67656289f85633a87 Mon Sep 17 00:00:00 2001
From: alterego655 <824662526@qq.com>
Date: Fri, 29 May 2026 10:28:57 +0800
Subject: [PATCH v1] Use outer memory context across slot sync retries
Capture the outer memory context once before the retry loop in
SyncReplicationSlots() to better better matches the actual lifetime model:
sync_retry_ctx is the per-cycle child context, while slot_names must live
in the parent/outer context across resets. Rename the oldctx to outerctx
to express the parent/child relationship more clearly.
---
src/backend/replication/logical/slotsync.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
index 93f41be32af..e22155b7192 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -2014,17 +2014,20 @@ SyncReplicationSlots(WalReceiverConn *wrconn)
List *remote_slots = NIL;
List *slot_names = NIL; /* List of slot names to track */
MemoryContext sync_retry_ctx;
+ MemoryContext outerctx;
check_and_set_sync_info(MyProcPid);
validate_remote_info(wrconn);
+ outerctx = CurrentMemoryContext;
+
/*
* Setup and use a per-sync-cycle memory context, which is reset every
* time we loop below. This avoids having to retail freeing the memory
* used in each sync cycle.
*/
- sync_retry_ctx = AllocSetContextCreate(CurrentMemoryContext,
+ sync_retry_ctx = AllocSetContextCreate(outerctx,
"slot sync retry context",
ALLOCSET_DEFAULT_SIZES);
@@ -2033,7 +2036,6 @@ SyncReplicationSlots(WalReceiverConn *wrconn)
{
bool slot_persistence_pending = false;
bool some_slot_updated = false;
- MemoryContext oldctx;
/* Check for interrupts and config changes */
CHECK_FOR_INTERRUPTS();
@@ -2045,7 +2047,7 @@ SyncReplicationSlots(WalReceiverConn *wrconn)
Assert(IsTransactionState());
MemoryContextReset(sync_retry_ctx);
- oldctx = MemoryContextSwitchTo(sync_retry_ctx);
+ MemoryContextSwitchTo(sync_retry_ctx);
/*
* Fetch remote slot info for the given slot_names. If slot_names
@@ -2067,7 +2069,7 @@ SyncReplicationSlots(WalReceiverConn *wrconn)
* slot_names must survive later sync_retry_ctx resets, so copy it
* in the outer context.
*/
- MemoryContextSwitchTo(oldctx);
+ MemoryContextSwitchTo(outerctx);
/*
* If slot_persistence_pending is true, extract slot names for
--
2.51.0