RE: Synchronizing slots from primary to standby
Zhijie Hou (Fujitsu) <houzj.fnst@fujitsu.com>
Attachments
- v51-0003-Additional-test-to-validate-the-restart_lsn-of-s.patch (application/octet-stream) patch v51-0003
- v51-0001-Allow-logical-walsenders-to-wait-for-the-physica.patch (application/octet-stream) patch v51-0001
- v51-0002-Add-logical-slot-sync-capability-to-the-physical.patch (application/octet-stream) patch v51-0002
On Wednesday, December 20, 2023 4:03 PM Kuroda, Hayato/黒田 隼人 <kuroda.hayato@fujitsu.com> wrote:
Hi,
>
> Dear Amit, Shveta,
>
> > > walsender.c
> > >
> > > 01. WalSndWaitForStandbyConfirmation
> > >
> > > ```
> > > + sleeptime =
> WalSndComputeSleeptime(GetCurrentTimestamp());
> > > ```
> > >
> > > It works well, but I'm not sure whether we should use
> > WalSndComputeSleeptime()
> > > because the function won't be called by walsender.
> > >
> >
> > I don't think it is correct to use this function because it is
> > walsender specific, for example, it uses 'last_reply_timestamp' which
> > won't be even initialized in the backend environment. We need to
> > probably use a different logic for sleep here or need to use a
> > hard-coded value.
>
> Oh, you are right. I haven't look until the func.
>
> > I think we should change the name of functions like
> > WalSndWaitForStandbyConfirmation() as they are no longer used by
> > walsender. IIRC, earlier, we had a common logic to wait from both
> > walsender and SQL APIs which led to this naming but that is no longer
> > true with the latest patch.
>
> How about "WaitForStandbyConfirmation", which is simpler? There are some
> functions like "WaitForParallelWorkersToFinish", "WaitForProcSignalBarrier"
> and so on.
Thanks for the comments. I think WaitForStandbyConfirmation is OK.
And I removed the WalSnd prefix for these functions and move them to
slot.c where the standby_slot_names is declared.
>
> > > 02.WalSndWaitForStandbyConfirmation
> > >
> > > ```
> > > + ConditionVariableTimedSleep(&WalSndCtl->wal_confirm_rcv_cv,
> > sleeptime,
> > > +
> > WAIT_EVENT_WAL_SENDER_WAIT_FOR_STANDBY_CONFIRMATION)
> > > ```
> > >
> > > Hmm, is it OK to use the same event as WalSndWaitForWal()? IIUC it
> > > should be
> > avoided.
> > >
> >
> > Agreed. So, how about using
> > WAIT_EVENT_WAIT_FOR_STANDBY_CONFIRMATION
> > so that we can use it both from the backend and walsender?
>
> Seems right. Note again that a description of .txt file must be also fixed.
Changed.
>
> Anyway, further comments on v50-0001.
>
> ~~~~~
> protocol.sgml
>
> 01. create_replication_slot
>
> ```
> + <varlistentry>
> + <term><literal>FAILOVER { 'true' | 'false' }</literal></term>
> + <listitem>
> + <para>
> + If true, the slot is enabled to be synced to the physical
> + standbys so that logical replication can be resumed after failover.
> + </para>
> + </listitem>
> + </varlistentry>
> ```
>
> IIUC, the true/false is optional. libpqwalreceiver does not add the boolean.
> Also you can follow the notation of `TWO_PHASE`.
Changed.
>
> 02. alter_replication_slot
>
> ```
> + <variablelist>
> + <varlistentry>
> + <term><literal>FAILOVER { 'true' | 'false' }</literal></term>
> + <listitem>
> + <para>
> + If true, the slot is enabled to be synced to the physical
> + standbys so that logical replication can be resumed after failover.
> + </para>
> + </listitem>
> + </varlistentry>
> + </variablelist>
> ```
>
> Apart from above, this boolean is mandatory, right?
> But you can follow other notation.
>
Right, changed it to optional to be consistent with others.
>
> ~~~~~~~
> slot.c
>
> 03. validate_standby_slots
>
> ```
> + /* Need a modifiable copy of string. */
> ...
> + /* Verify syntax and parse string into a list of identifiers. */
> ```
>
> Unnecessary comma?
You mean comma or period ? I think the current style is OK.
>
> 04. validate_standby_slots
>
> ```
> + if (!ok || !ReplicationSlotCtl)
> + {
> + pfree(rawname);
> + list_free(elemlist);
> + return ok;
> + }
> ```
>
> It may be more efficient to exit earlier when ReplicationSlotCtl is NULL.
I think even if ReplicationSlotCtl is NULL, we still need to check the syntax
of the slot names.
>
> ~~~~~~~
> walsender.c
>
> 05. PhysicalWakeupLogicalWalSnd
>
> ```
> +/*
> + * Wake up the logical walsender processes with failover-enabled slots
> +if the
> + * physical slot of the current walsender is specified in
> +standby_slot_names
> + * GUC.
> + */
> +void
> +PhysicalWakeupLogicalWalSnd(void)
> ```
>
> The function can be called from backend processes, but you said "the current
> walsender"
> in the comment.
Changed the words.
>
> 06. WalSndRereadConfigAndReInitSlotList
>
> ```
> + char *pre_standby_slot_names;
> +
> + ProcessConfigFile(PGC_SIGHUP);
> +
> + /*
> + * If we are running on a standby, there is no need to reload
> + * standby_slot_names since we do not support syncing slots to
> cascading
> + * standbys.
> + */
> + if (RecoveryInProgress())
> + return;
> +
> + pre_standby_slot_names = pstrdup(standby_slot_names);
> ```
>
> I felt that we must preserve pre_standby_slot_names before calling
> ProcessConfigFile().
>
Good catch. Fixed.
>
> 07. WalSndFilterStandbySlots
>
> I felt the prefix "WalSnd" may not be needed because both backend processes
> and walsender will call the function.
Right, renamed.
Attach the V51 patch set which addressed Kuroda-san's comments.
I also tried to improve the test in 0003 to make it stable.
Best Regards,
Hou zj
Commits
-
Doc: Add the new section "Logical Replication Failover".
- b560a98a17ae 17.0 landed
-
Fix the review comments and a bug in the slot sync code.
- 3741f2a09d52 17.0 landed
-
Fix a test in failover slots regression test.
- 7e85d1c75f29 17.0 landed
-
Fix the intermittent buildfarm failures in 040_standby_failover_slots_sync.
- 6f3d8d5e7cc2 17.0 landed
-
Split XLogCtl->LogwrtResult into separate struct members
- c9920a9068ea 17.0 cited
-
Ensure that the sync slots reach a consistent state after promotion without losing data.
- 2ec005b4e297 17.0 landed
-
Introduce a new GUC 'standby_slot_names'.
- bf279ddd1c28 17.0 landed
-
Fix BF failure introduced by commit b3f6b14cf4.
- def0ce337068 17.0 landed
-
Fixups for commit 93db6cbda0.
- b3f6b14cf48f 17.0 landed
-
Fix BF failure in commit 93db6cbda0.
- d13ff82319cc 17.0 landed
-
Add a new slot sync worker to synchronize logical slots.
- 93db6cbda037 17.0 landed
-
Improve ERROR/LOG messages added by commits ddd5f4f54a and 7a424ece48.
- 801792e528d6 17.0 landed
-
Disable autovacuum on primary in 040_standby_failover_slots_sync test.
- b7bdade6a42f 17.0 landed
-
Fix the incorrect format specifier used in commit 7a424ece48.
- b987be39c3c7 17.0 landed
-
Change the LOG level in 040_standby_failover_slots_sync.pl to DEBUG2.
- d9e225f275b7 17.0 landed
-
Add more LOG and DEBUG messages for slot synchronization.
- 7a424ece4828 17.0 landed
-
Another try to fix BF failure introduced in commit ddd5f4f54a.
- 9bc1eee988c3 17.0 landed
-
Fix BF introduced in commit ddd5f4f54a.
- bd8fc1677b88 17.0 landed
-
Add a slot synchronization function.
- ddd5f4f54a02 17.0 landed
-
Clean-ups for 776621a5e4 and 7329240437.
- 22f7e61a6330 17.0 landed
-
Enhance libpqrcv APIs to support slot synchronization.
- dafbfed9efbe 17.0 landed
-
Add a failover option to subscriptions.
- 776621a5e479 17.0 landed
-
Allow setting failover property in the replication command.
- 73292404370c 17.0 landed
-
Allow to enable failover property for replication slots via SQL API.
- c393308b69d2 17.0 landed
-
Add macros for looping through a List without a ListCell.
- 14dd0f27d7cd 17.0 cited
-
Track conflict_reason in pg_replication_slots.
- 007693f2a3ac 17.0 cited
-
Allow upgrades to preserve the full subscription's state.
- 9a17be1e244a 17.0 cited
-
Add support for incremental backup.
- dc212340058b 17.0 cited
-
Simplify some logic in CreateReplicationSlot()
- e83aa9f92fdd 17.0 cited
-
Fix uninitialized access to InitialRunningXacts during decoding after ERROR.
- c7256e6564fa 15.5 cited
-
Flexible options for CREATE_REPLICATION_SLOT.
- 0266e98c6b86 15.0 cited
-
Empty search_path in logical replication apply worker and walsender.
- 11da97024abb 14.0 cited
-
Fix oldest xmin and LSN computation across repslots after advancing
- b48df818dcbd 14.0 cited
-
Require C99 (and thus MSCV 2013 upwards).
- d9dd406fe281 12.0 cited