RE: Conflict detection for update_deleted in logical replication
Zhijie Hou (Fujitsu) <houzj.fnst@fujitsu.com>
Attachments
- v30-0001-Maintain-the-oldest-non-removeable-tranasction-I.patch (application/octet-stream) patch v30-0001
- v30-0002-Maintain-the-replication-slot-in-logical-launche.patch (application/octet-stream) patch v30-0002
- v30-0003-Add-a-retain_conflict_info-option-to-subscriptio.patch (application/octet-stream) patch v30-0003
- v30-0004-Introduce-a-new-GUC-max_conflict_retention_durat.patch (application/octet-stream) patch v30-0004
- v30-0005-Re-create-the-replication-slot-if-the-conflict-r.patch (application/octet-stream) patch v30-0005
- v30-0006-Add-a-tap-test-to-verify-the-management-of-the-n.patch (application/octet-stream) patch v30-0006
- v30-0007-Support-the-conflict-detection-for-update_delete.patch (application/octet-stream) patch v30-0007
On Thu, Apr 17, 2025 at 12:19 PM shveta malik wrote: > > On Wed, Apr 16, 2025 at 10:30 AM shveta malik <shveta.malik@gmail.com> > wrote: > > > > On Wed, Mar 26, 2025 at 4:17 PM Zhijie Hou (Fujitsu) > > <houzj.fnst@fujitsu.com> wrote: > > > > > > Here's a rebased version of the patch series. > > > > > > > Thanks Hou-San for the patches. I am going through this long thread and > patches. One doubt I have is whenever there is a chance of conflict-slot update > (either xmin or possibility of its invalidation), apply-worker gives a wake-up call > to the launcher (ApplyLauncherWakeup). Shouldn't that suffice to wake-up > launcher irrespective of its nap-time? Do we actually need to introduce > MIN/MAX_NAPTIME_PER_SLOT_UPDATE in the launcher and the logic > around it? Thanks for reviewing. After rethinking, I agree that the wakeup is sufficient, so I removed the nap-time logic in this version. > Few comments for patch004: > Config.sgml: > 1) > + <para> > + Maximum duration (in milliseconds) for which conflict > + information can be retained for conflict detection by the apply worker. > + The default value is <literal>0</literal>, indicating that conflict > + information is retained until it is no longer needed for detection > + purposes. > + </para> > > IIUC, the above is not entirely accurate. Suppose the subscriber manages to > catch up and sets oldest_nonremovable_xid to 100, which is then updated in > slot. After this, the apply worker takes a nap and begins a new xid update cycle. > Now, let’s say the next candidate_xid is 200, but this time the subscriber fails > to keep up and exceeds max_conflict_retention_duration. As a result, it sets > oldest_nonremovable_xid to InvalidTransactionId, and the launcher skips > updating the slot’s xmin. If the time exceeds the max_conflict_retention_duration, the launcher would Invalidate the slot, instead of skipping updating it. So the conflict info(e.g., dead tuples) would not be retained anymore. > However, the previous xmin value (100) is still there > in the slot, causing its data to be retained beyond the > max_conflict_retention_duration. The xid 200 which actually honors > max_conflict_retention_duration was never marked for retention. If my > understanding is correct, then the documentation doesn’t fully capture this > scenario. As mentioned above, the strategy here is to invalidate the slot. > > 2) > + The replication slot > + <quote><literal>pg_conflict_detection</literal></quote> that > used to > + retain conflict information will be invalidated if all apply workers > + associated with the subscription, where > > Subscription --> subscriptions > > 3) > Name stop_conflict_retention in MyLogicalRepWorker is confusing. Shall it be > stop_conflict_info_retention? Changed. Here is V30 patch set includes the following changes: * Addressed above comments. * Added the retention timeout check in wait_for_local_flush(), as suggested by Nisha[1]. * Improved upgrade codes and added a test for upgrade of retain_conflict_info option, as suggested by Kuroda-san[2]. [1] https://www.postgresql.org/message-id/CABdArM4Ft8q3dZv4Bqw%3DrbS5_LFMXDJMRr3vC8a_KMCX1qatpg%40mail.gmail.com [2] https://www.postgresql.org/message-id/OSCPR01MB14966269726272F2F2B2BD3B0F5B22%40OSCPR01MB14966.jpnprd01.prod.outlook.com Best Regards, Hou zj
Commits
-
Fix intermittent BF failures in 035_conflicts.
- 0f42206531b3 19 (unreleased) landed
-
Resume conflict-relevant data retention automatically.
- 0d48d393d465 19 (unreleased) landed
-
Fix intermittent test failure introduced in 6456c6e2c4.
- 01d793698f59 19 (unreleased) landed
-
Fix Coverity issue reported in commit a850be2fe.
- 5ac3c1ac22cb 19 (unreleased) landed
-
Add test to prevent premature removal of conflict-relevant data.
- 6456c6e2c4ad 19 (unreleased) landed
-
Post-commit review fixes for 228c370868.
- 1f7e9ba3ac4e 19 (unreleased) landed
-
Add max_retention_duration option to subscriptions.
- a850be2fe653 19 (unreleased) landed
-
Detect and report update_deleted conflicts.
- fd5a1a0c3e56 19 (unreleased) landed
-
Preserve conflict-relevant data during logical replication.
- 228c37086855 19 (unreleased) landed
-
Integrate FullTransactionIds deeper into two-phase code
- 62a17a92833d 19 (unreleased) cited
-
Improve checks for GUC recovery_target_timeline
- fd7d7b719137 19 (unreleased) cited
-
Prevent excessive delays before launching new logrep workers.
- fd519419c948 18.0 cited
-
Keep WAL segments by slot's last saved restart LSN
- ca307d5cec90 18.0 cited
-
Rework some code handling pg_subscription data in psql and pg_dump
- 08691ea958c2 18.0 cited
-
Use generateClonedIndexStmt to propagate CREATE INDEX to partitions.
- 68dfecbef210 18.0 cited