On Mon, Sep 22, 2025 at 4:21 PM Ajin Cherian <itsa...@gmail.com> wrote:
>
>
> Created a patch v13 with these changes.
>

Please find a few comments:

1)
+ /* update the failure structure so that it can be freed on error */
+ fparams.slot_names = slot_names;
+

Since slot_names is assigned only once, we can make the above
assignment as well only once, inside the if-block where we initialize
slot_names.

2)
extract_slot_names():

+ foreach(lc, remote_slots)
+ {
+ RemoteSlot *remote_slot = (RemoteSlot *) lfirst(lc);
+ char       *slot_name;
+
+ /* Switch to long-lived TopMemoryContext to store slot names */
+ oldcontext = MemoryContextSwitchTo(TopMemoryContext);
+
+ slot_name = pstrdup(remote_slot->name);
+ slot_names = lappend(slot_names, slot_name);
+
+ MemoryContextSwitchTo(oldcontext);
+ }

It will be better to move 'MemoryContextSwitchTo' calls outside of the
loop. No need to switch the context for each slot.

3)
ProcessSlotSyncAPIChanges() gives a feeling that it is actually
processing API changes where instead it is processing interrupts or
config changes. Can we please rename to ProcessSlotSyncAPIInterrupts()

4)
I prefer version 11's slotsync_api_reread_config() over current
slotsync_api_config_changed(). There, even error was taken care of
inside the function, which to me looked better and similar to how
slotsync worker deals with it.

I have made some comment changes, attached the patch. Please include
it if you find it okay.

thanks
Shveta
From 4f5634c33092e536b8662244dd7436f045195690 Mon Sep 17 00:00:00 2001
From: Shveta Malik <shveta.ma...@gmail.com>
Date: Tue, 23 Sep 2025 10:24:19 +0530
Subject: [PATCH] comments changes.

---
 src/backend/replication/logical/slotsync.c | 28 +++++++++++-----------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/src/backend/replication/logical/slotsync.c 
b/src/backend/replication/logical/slotsync.c
index 19792a95635..f980c0f73c4 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -42,8 +42,8 @@
  * If the pg_sync_replication API is used to sync the slots, and if the slots
  * are not ready to be synced and are marked as RS_TEMPORARY because of any of
  * the reasons mentioned above, then the API also waits and retries until the
- * slots are ready to be synced. Refer to the comments in 
SyncReplicationSlots()
- * for more details.
+ * slots are marked as RS_PERSISTENT (which means sync-ready). Refer to the
+ * comments in SyncReplicationSlots() for more details.
  *
  * Any standby synchronized slots will be dropped if they no longer need
  * to be synchronized. See comment atop drop_local_obsolete_slots() for more
@@ -572,7 +572,7 @@ reserve_wal_for_local_slot(XLogRecPtr restart_lsn)
  * local ones, then update the LSNs and persist the local synced slot for
  * future synchronization; otherwise, do nothing.
  *
- * slot_persistence_pending is set to true if any of the slots fail to
+ * *slot_persistence_pending is set to true if any of the slots fail to
  * persist. It is utilized by the pg_sync_replication_slots() API.
  *
  * Return true if the slot is marked as RS_PERSISTENT (sync-ready), otherwise
@@ -604,7 +604,9 @@ update_and_persist_local_synced_slot(RemoteSlot 
*remote_slot, Oid remote_dbid,
                 * the next cycle. It may take more time to create such a
                 * slot. Therefore, we keep this slot and attempt the
                 * synchronization in the next cycle. Update the
-                * slot_persistence_pending flag, so the API can retry.
+                *
+                * We also update the slot_persistence_pending parameter, so
+                * the API can retry.
                 */
                if (slot_persistence_pending)
                        *slot_persistence_pending = true;
@@ -623,7 +625,7 @@ update_and_persist_local_synced_slot(RemoteSlot 
*remote_slot, Oid remote_dbid,
                                errdetail("Synchronization could lead to data 
loss, because the standby could not build a consistent snapshot to decode WALs 
at LSN %X/%08X.",
                                                  
LSN_FORMAT_ARGS(slot->data.restart_lsn)));
 
-               /* set this, so that API can retry */
+               /* Set this, so that API can retry */
                if (slot_persistence_pending)
                        *slot_persistence_pending = true;
 
@@ -650,7 +652,7 @@ update_and_persist_local_synced_slot(RemoteSlot 
*remote_slot, Oid remote_dbid,
  * updated. The slot is then persisted and is considered as sync-ready for
  * periodic syncs.
  *
- * slot_persistence_pending is set to true if any of the slots fail to
+ * *slot_persistence_pending is set to true if any of the slots fail to
  * persist. It is utilized by the pg_sync_replication_slots() API.
  *
  * Returns TRUE if the local slot is updated.
@@ -1953,17 +1955,17 @@ SyncReplicationSlots(WalReceiverConn *wrconn)
 
                validate_remote_info(wrconn);
 
-               /* Retry until all slots are sync ready at least */
+               /* Retry until all the slots are sync-ready */
                for (;;)
                {
                        int             rc;
                        bool    started_tx = false;
                        bool    slot_persistence_pending = false;
 
-                       /* reset flag before every iteration */
+                       /* Reset flag before every iteration */
                        slot_persistence_pending = false;
 
-                       /* check for interrupts and config changes */
+                       /* Check for interrupts and config changes */
                        ProcessSlotSyncAPIChanges();
 
                        /*
@@ -1994,10 +1996,9 @@ SyncReplicationSlots(WalReceiverConn *wrconn)
                         * for future iterations (only needed if we haven't 
done it yet)
                         */
                        if (slot_names == NIL && slot_persistence_pending)
-                               /* Extract slot names from the remote slots */
                                slot_names = extract_slot_names(remote_slots);
 
-                       /* update the failure structure so that it can be freed 
on error */
+                       /* Update the failure structure so that it can be freed 
on error */
                        fparams.slot_names = slot_names;
 
                        /* Free the current remote_slots list */
@@ -2007,11 +2008,11 @@ SyncReplicationSlots(WalReceiverConn *wrconn)
                        if (started_tx)
                                CommitTransactionCommand();
 
-                       /* Done if all slots are at least sync ready */
+                       /* Done if all slots are persisted i.e. are sync-ready 
*/
                        if (!slot_persistence_pending)
                                break;
 
-                       /* wait before retrying */
+                       /* Wait before retrying */
                        rc = WaitLatch(MyLatch,
                                        WL_LATCH_SET | WL_TIMEOUT | 
WL_EXIT_ON_PM_DEATH,
                                        SLOTSYNC_API_NAPTIME_MS,
@@ -2022,7 +2023,6 @@ SyncReplicationSlots(WalReceiverConn *wrconn)
 
                }
 
-               /* Clean up slot_names if allocated in TopMemoryContext */
                if (slot_names)
                        list_free_deep(slot_names);
 
-- 
2.34.1

Reply via email to