]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix excessive logging in idle slotsync worker.
authorAmit Kapila <akapila@postgresql.org>
Mon, 13 Apr 2026 04:36:50 +0000 (10:06 +0530)
committerAmit Kapila <akapila@postgresql.org>
Mon, 13 Apr 2026 04:36:50 +0000 (10:06 +0530)
The slotsync worker was incorrectly identifying no-op states as successful
updates, triggering a busy loop to sync slots that logged messages every
200ms. This patch corrects the logic to properly classify these states,
enabling the worker to respect normal sleep intervals when no work is
performed.

Reported-by: Fujii Masao <masao.fujii@gmail.com>
Author: Zhijie Hou <houzj.fnst@fujitsu.com>
Reviewed-by: Amit Kapila <amit.kapila16@gmail.com>
Reviewed-by: shveta malik <shveta.malik@gmail.com>
Backpatch-through: 17, where it was introduced
Discussion: https://postgr.es/m/CAHGQGwF6zG9Z8ws1yb3hY1VqV-WT7hR0qyXCn2HdbjvZQKufDw@mail.gmail.com

src/backend/replication/logical/slotsync.c

index 2b1c5cf50d2ae16fb14401c10afee162e047cd58..d01b401cd28b47a58f56550a461a8bc79f2a48d5 100644 (file)
@@ -332,10 +332,15 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid)
                        slot->data.confirmed_flush = remote_slot->confirmed_lsn;
                        slot->data.catalog_xmin = remote_slot->catalog_xmin;
                        SpinLockRelease(&slot->mutex);
+
+                       updated_xmin_or_lsn = true;
                }
                else
                {
                        bool            found_consistent_snapshot;
+                       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);
@@ -365,9 +370,16 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid)
 
                                skip_reason = SS_SKIP_NO_CONSISTENT_SNAPSHOT;
                        }
-               }
 
-               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);
+               }
        }
 
        /* Update slot sync skip stats */