Re: Logical Replication of sequences
Amit Kapila <amit.kapila16@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Doc: Add documentation for sequence synchronization.
- 55cefadde874 19 (unreleased) landed
-
Remove unused assignment in CREATE PUBLICATION grammar.
- bfb7419b0bbe 19 (unreleased) landed
-
Add seq_sync_error_count to subscription statistics.
- f6a4c498dcf6 19 (unreleased) landed
-
Fix few issues in commit 5509055d69.
- 5a4eba558aa7 19 (unreleased) landed
-
Add sequence synchronization for logical replication.
- 5509055d6956 19 (unreleased) landed
-
Add worker type argument to logical replication worker functions.
- 3e8e05596a02 19 (unreleased) landed
-
Introduce "REFRESH SEQUENCES" for subscriptions.
- f0b3573c3aac 19 (unreleased) landed
-
Refactor logical worker synchronization code into a separate file.
- 41c674d2e31e 19 (unreleased) landed
-
Standardize use of REFRESH PUBLICATION in code and messages.
- 2436b8c047ff 19 (unreleased) landed
-
Add "ALL SEQUENCES" support to publications.
- 96b378497346 19 (unreleased) landed
-
Expose sequence page LSN via pg_get_sequence_data.
- b93172ca59f4 19 (unreleased) landed
-
Resume conflict-relevant data retention automatically.
- 0d48d393d465 19 (unreleased) cited
-
Post-commit review fixes for 228c370868.
- 1f7e9ba3ac4e 19 (unreleased) cited
-
Generate GUC tables from .dat file
- 63599896545c 19 (unreleased) cited
Attachments
- v1_amit.patch.txt (text/plain)
On Mon, Nov 3, 2025 at 12:35 AM vignesh C <vignesh21@gmail.com> wrote: > Some inor comments on 0001. 1. + /* + * Acquire LogicalRepWorkerLock in LW_EXCLUSIVE mode to block the apply + * worker (holding LW_SHARED) from reading or updating + * last_seqsync_start_time. See ProcessSyncingSequencesForApply(). + */ + LWLockAcquire(LogicalRepWorkerLock, LW_EXCLUSIVE); Is it required to have LW_EXCLUSIVE lock here? In the function ProcessSyncingSequencesForApply(), apply_worker access/update last_seqsync_start_time only once it ensures that sequence sync worker has exited. I have made changes related to this in the attached to show you what I have in mind. 2. + /* + * Worker needs to process sequences across transaction boundary, so + * allocate them under long-lived context. + */ + oldctx = MemoryContextSwitchTo(TopMemoryContext); + + seq = palloc0_object(LogicalRepSequenceInfo); … ... + /* + * Allocate in a long-lived memory context, since these + * errors will be reported after the transaction commits. + */ + oldctx = MemoryContextSwitchTo(TopMemoryContext); + mismatched_seqs = lappend_int(mismatched_seqs, seqidx); At the above and other places in syncworker, we don't need to use TopMemoryContext; rather, we can use ApplyContext allocated via SequenceSyncWorkerMain()->SetupApplyOrSyncWorker()->InitializeLogRepWorker(). 3. ProcessSyncingTablesForApply(current_lsn); + ProcessSyncingSequencesForApply(); I am not sure if the function name ProcessSyncingSequencesForApply is appropriate. For tables, we do some work for concurrently running tablesync workers and launch new as well but for sequences, we don't do any work for sequences that are already being synced. How about ProcessSequencesForSync()? 4. + /* Should never happen. */ + elog(ERROR, "Sequence synchronization worker not expected to process relations"); The first letter of the ERROR message should be small. How about: "sequence synchronization worker is not expected to process relations"? I have made this change in the attached. 5. @@ -5580,7 +5606,8 @@ start_apply(XLogRecPtr origin_startpos) * idle state. */ AbortOutOfAnyTransaction(); - pgstat_report_subscription_error(MySubscription->oid, !am_tablesync_worker()); + pgstat_report_subscription_error(MySubscription->oid, + !am_tablesync_worker()); Why this change? 6. @@ -264,6 +267,8 @@ extern bool logicalrep_worker_launch(LogicalRepWorkerType wtype, Oid userid, Oid relid, dsm_handle subworker_dsm, bool retain_dead_tuples); +extern void launch_sync_worker(LogicalRepWorkerType wtype, int nsyncworkers, + Oid relid, TimestampTz *last_start_time); extern void logicalrep_worker_stop(LogicalRepWorkerType wtype, Oid subid, Oid relid); All the other functions except the newly added one are from launcher.c. So, this one should be after those, no? It should be after the InvalidateSyncingRelStates() declaration. Apart from above, please find attached top-up patch to improve comments and some other cosmetic stuff. The 0001 patch looks good to me apart from the above minor points. -- With Regards, Amit Kapila.