Re: Fix slot synchronization with two_phase decoding enabled
Nisha Moond <nisha.moond412@gmail.com>
From: Nisha Moond <nisha.moond412@gmail.com>
To: Masahiko Sawada <sawada.mshk@gmail.com>
Cc: shveta malik <shveta.malik@gmail.com>,
Amit Kapila <amit.kapila16@gmail.com>, "Zhijie Hou (Fujitsu)" <houzj.fnst@fujitsu.com>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2025-05-30T09:30:30Z
Lists: pgsql-hackers
On Fri, May 30, 2025 at 12:55 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote: > > On Thu, May 29, 2025 at 2:00 AM Nisha Moond <nisha.moond412@gmail.com> wrote: > > > > On Wed, May 28, 2025 at 6:10 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote: > > > > > > On Sun, May 25, 2025 at 11:34 PM Nisha Moond <nisha.moond412@gmail.com> wrote: > > > > > > > > to > > > > On Fri, May 23, 2025 at 10:06 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote: > > > > > > > > > > > > > > > Here are review comments for v14 patch: > > > > > > > > > > > > > Thank you for the review. > > > > > > > > > I think we need to include a basic test case where we simply create a > > > > > subscription with two_phase=true and then enable the failover via > > > > > ALTER SUBSCRIPTION after making sure that slot's restart_lsn passed > > > > > two_phase_at. Probably if we use this case in 003_logical_slots.pl, we > > > > > can avoid creating regress_sub2? > > > > > > > > > > > > > A test has been added in 040_standby_failover_slots_sync.pl to enable > > > > failover via ALTER SUBSCRIPTION. > > > > > > Yes but the slot is originally created via SQL API, which seems > > > uncommon usage in practice. I thought it would be good to have the > > > basic steps in the tests to enable both fields. > > > > > > > Apologies for the earlier misunderstanding. I've updated > > 040_standby_failover_slots_sync.pl to modify the slot creation via the > > CREATE SUBSCRIPTION command as suggested. > > > > > > Regarding regress_sub2 in 003_logical_slots.pl : > > > > If we use ALTER SUBSCRIPTION to set failover=true on regress_sub, it > > > > leads to pg_upgrade failure, as it attempts to create a slot on the > > > > new_node(upgraded version) with both two_phase and failover enabled, > > > > which is an unsupported combination. > > > > > > I think that the pg_upgrade test should cover the case where it > > > restores logical slots with both fields enabled in the new cluster. > > > When I actually tried this case, I realized that pg_upgrade doesn't > > > handle this case; it tried to create the logical slot via SQL API but > > > it failed as we don't allow it to create a logical slot with enabling > > > both two_phase and failover. How can we handle this case? > > > > > > > On further analysis, it seems feasible and safe to allow creation of > > slot and subscription with both two_phase and failover enabled during > > upgrade (pg_upgrade). > > As before starting the upgrade, pg_upgrade ensures that - > > a) All slot changes have been fully consumed. > > b) No prepared transactions exist. > > Additionally, it is also documented[1] - "Obviously, no one should be > > accessing the clusters during the upgrade." > > > > Though, if allowed, the slot may be created with a restart_lsn < > > two_phase_at. IIUC, the guarantees above make it impossible for a > > prepared transaction to exist before two_phase_at, thus preventing the > > bug case. > > True, but I think we need to cover the simple pg_dump and pg_restore > case too, without pg_upgrade. Otherwise the dump file won't work if > the database has at least one subscription with two_phase and failover > enabled. > Agree that we need to cover the simple pg_dump and pg_restore with the patch. When pg_dump and pg_restore are used outside of pg_upgrade, there's no guarantee that the target system does not have any prepared transactions. In such cases, restoring a subscription with both two_phase and failover enabled could lead to the bug, so we should avoid allowing both options via pg_restore. Here are a few possible solutions: 1) Split the CREATE SUBSCRIPTION command of such subscriptions in pg_restore : first create the sub with two_phase: - CREATE SUBSCRIPTION ... with (two_phase = on) then enable failover - ALTER SUBSCRIPTION ... with (failover=true) However, this approach adds complexity in pg_restore and may still fail if the slot's restart_lsn is earlier than two_phase_at. 2) Prevent dump of subscription in non-upgrade mode: Raise an error/warning during pg_dump when a subscription with both two_phase and failover is encountered (unless in binary upgrade mode). That is, either fail the pg_dump, or skip dumping subscriptions in such a case with a warning. We can include a helpful hint: "Disable failover for subscription <sub-name> before dumping and re-enable it after restore." 3) Dump such subscriptions with (two_phase=on, failover=on, create_slot=false) together. As pg_dump always sets "connect=false" for subscription, it is up to users to reactivate the subscription suitably. In this case, we can add some document to warn that it's the user's responsibility to ensure the remote slot is in a safe state. What do you think? Please let me know if you have any other suggestions for handling this in pg_dump/pg_restore. -- Thanks & Regards, Nisha Moond
Commits
-
Don't retreat slot's confirmed_flush LSN.
- ad5eaf390c58 18.0 landed
- 7318f241d29c 17.6 landed
- c0f51fde534d 16.10 landed
- 9d1a62359606 15.14 landed
- e68459489c20 14.19 landed
- e323d9df002d 13.22 landed
-
Fix assertion failure during decoding from synced slots.
- 3ff2a1f0c9e8 18.0 landed
-
Fix xmin advancement during fast_forward decoding.
- d65485b02b1f 13.21 landed
- aaf9e95e8764 18.0 landed
- 36148b22ee09 17.5 landed
- 21a7caeeb948 16.9 landed
- f6429bd7db5e 15.13 landed
- 1f63b3626a52 14.18 landed
-
Fix slot synchronization for two_phase enabled slots.
- 4868c96bc8c6 18.0 landed
-
Again match pg_user_mappings to information_schema.user_mapping_options.
- b6e39ca92eee 9.4.13 cited