v4_PG17_18-0001-Fix-slotsync-worker-busy-loop-causing-rep.patch
application/octet-stream
Filename: v4_PG17_18-0001-Fix-slotsync-worker-busy-loop-causing-rep.patch
Type: application/octet-stream
Part: 1
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 v4-0001
Subject: Fix slotsync worker busy loop causing repeated logical decoding logs.
| File | + | − |
|---|---|---|
| src/backend/replication/logical/slotsync.c | 15 | 2 |
From c3744118809796e34faa37640a1e3b428705a8b9 Mon Sep 17 00:00:00 2001
From: Zhijie Hou <houzj.fnst@fujitsu.com>
Date: Fri, 10 Apr 2026 16:28:44 +0800
Subject: [PATCH v4_PG17_18] Fix slotsync worker busy loop causing repeated
logical decoding logs.
Previously, the slotsync worker could enter a busy loop and emit four logical
log messages every 200 ms, even when both the primary and standby were idle.
This happened because the worker incorrectly treated certain cases as
successful slot updates, causing it to use the minimum sleep interval and
repeatedly restart slot syncing.
This commit fixes this by ensuring the worker does not treat such cases as
updates, allowing it to sleep normally and avoid excessive log output.
---
src/backend/replication/logical/slotsync.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
index 4cbee197ddb..3cbcd77d12f 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -275,9 +275,15 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid,
if (found_consistent_snapshot)
*found_consistent_snapshot = true;
+
+ updated_xmin_or_lsn = true;
}
else
{
+ XLogRecPtr old_confirmed_lsn = slot->data.confirmed_flush;
+ XLogRecPtr old_restart_lsn = slot->data.restart_lsn;
+ XLogRecPtr old_catalog_xmin = slot->data.catalog_xmin;
+
LogicalSlotAdvanceAndCheckSnapState(remote_slot->confirmed_lsn,
found_consistent_snapshot);
@@ -289,9 +295,16 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid,
errdetail_internal("Remote slot has LSN %X/%X but local slot has LSN %X/%X.",
LSN_FORMAT_ARGS(remote_slot->confirmed_lsn),
LSN_FORMAT_ARGS(slot->data.confirmed_flush)));
- }
- updated_xmin_or_lsn = true;
+ /*
+ * It is possible that the slot's xmin or LSNs are not updated,
+ * when the synced slot has reached consistent snapshot state or
+ * cannot build one at all.
+ */
+ updated_xmin_or_lsn = (old_confirmed_lsn != slot->data.confirmed_flush ||
+ old_restart_lsn != slot->data.restart_lsn ||
+ old_catalog_xmin != slot->data.catalog_xmin);
+ }
}
if (remote_dbid != slot->data.database ||
--
2.53.0.windows.2