Re: Improve pg_sync_replication_slots() to wait for primary to advance
Ajin Cherian <itsajin@gmail.com>
From: Ajin Cherian <itsajin@gmail.com>
To: Japin Li <japinli@hotmail.com>
Cc: shveta malik <shveta.malik@gmail.com>,
Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>, Ashutosh Sharma <ashu.coek88@gmail.com>,
Amit Kapila <amit.kapila16@gmail.com>, PostgreSQL mailing lists <pgsql-hackers@postgresql.org>
Date: 2025-10-30T10:18:31Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Enhance slot synchronization API to respect promotion signal.
- 4bed04d39566 17.10 landed
- 94efd308bcec 18.4 landed
- 1362bc33e025 19 (unreleased) landed
-
Fix inconsistent elevel in pg_sync_replication_slots() retry logic.
- f1ddaa15357f 19 (unreleased) landed
-
Refactor slot synchronization logic in slotsync.c.
- 788ec96d591d 19 (unreleased) landed
-
Fix intermittent BF failure in 040_standby_failover_slots_sync.
- b47c50e5667b 19 (unreleased) landed
-
Add retry logic to pg_sync_replication_slots().
- 0d2d4a0ec3ec 19 (unreleased) landed
-
Fix LOCK_TIMEOUT handling in slotsync worker.
- 04396eacd3fa 19 (unreleased) cited
-
Add slotsync skip statistics.
- 76b78721ca49 19 (unreleased) cited
Attachments
- v20-0001-Improve-initial-slot-synchronization-in-pg_sync_.patch (application/octet-stream) patch v20-0001
On Mon, Oct 27, 2025 at 8:22 PM Japin Li <japinli@hotmail.com> wrote:
>
>
> Hi, Ajin
>
> Thanks for updating the patch.
>
> On Mon, 27 Oct 2025 at 18:47, Ajin Cherian <itsajin@gmail.com> wrote:
> > On Fri, Oct 24, 2025 at 8:29 PM shveta malik <shveta.malik@gmail.com> wrote:
> >>
> >> On Wed, Oct 22, 2025 at 10:25 AM Ajin Cherian <itsajin@gmail.com> wrote:
> >> >
> >> >
> >> > I've modified the comments to reflect the new changes.
> >> >
> >> > attaching patch v18 with the above changes.
> >> >
> >>
> >> Thanks for the patch. The test is still not clear. Can we please add
> >> the test after the test of "Test logical failover slots corresponding
> >> to different plugins" finishes instead of adding it in between?
> >>
> >
> > I've rewritten the tests again to make this possible. Attaching v19
> > which has the modified tap test.
>
> Here are some comments on the new patch.
>
> 1. Given the existence of the foreach_ptr macro, we can switch the usage of
> foreach to foreach_ptr.
>
> diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
> index 1b78ffc5ff1..5db51407a82 100644
> --- a/src/backend/replication/logical/slotsync.c
> +++ b/src/backend/replication/logical/slotsync.c
> @@ -872,7 +872,6 @@ fetch_remote_slots(WalReceiverConn *wrconn, List *slot_names)
>
> if (slot_names != NIL)
> {
> - ListCell *lc;
> bool first_slot = true;
>
> /*
> @@ -880,10 +879,8 @@ fetch_remote_slots(WalReceiverConn *wrconn, List *slot_names)
> */
> appendStringInfoString(&query, " AND slot_name IN (");
>
> - foreach(lc, slot_names)
> + foreach_ptr(char, slot_name, slot_names)
> {
> - char *slot_name = (char *) lfirst(lc);
> -
> if (!first_slot)
> appendStringInfoString(&query, ", ");
>
> @@ -1872,15 +1869,13 @@ static List *
> extract_slot_names(List *remote_slots)
> {
> List *slot_names = NIL;
> - ListCell *lc;
> MemoryContext oldcontext;
>
> /* Switch to long-lived TopMemoryContext to store slot names */
> oldcontext = MemoryContextSwitchTo(TopMemoryContext);
>
> - foreach(lc, remote_slots)
> + foreach_ptr(RemoteSlot, remote_slot, remote_slots)
> {
> - RemoteSlot *remote_slot = (RemoteSlot *) lfirst(lc);
> char *slot_name;
>
> slot_name = pstrdup(remote_slot->name);
>
> 2. To append a signal character, switch from appendStringInfoString() to the
> more efficient appendStringInfoChar().
>
> + appendStringInfoString(&query, ")");
>
> 3. The query memory can be released immediately after walrcv_exec() because
> there are no subsequent references.
>
> @@ -895,6 +892,7 @@ fetch_remote_slots(WalReceiverConn *wrconn, List *slot_names)
>
> /* Execute the query */
> res = walrcv_exec(wrconn, query.data, SLOTSYNC_COLUMN_COUNT, slotRow);
> + pfree(query.data);
> if (res->status != WALRCV_OK_TUPLES)
> ereport(ERROR,
> errmsg("could not fetch failover logical slots info from the primary server: %s",
> @@ -975,7 +973,6 @@ fetch_remote_slots(WalReceiverConn *wrconn, List *slot_names)
> }
>
> walrcv_clear_result(res);
> - pfree(query.data);
>
> return remote_slot_list;
> }
>
Thanks for your review, Japin. Here's patch v20 addressing the comments.
regards,
Ajin Cherian
Fujitsu Australia