Re: Logical Replication of sequences
vignesh C <vignesh21@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
- v20250930-0001-Enhance-pg_get_sequence_data-function.patch (text/x-patch) patch v20250930-0001
- v20250930-0005-Introduce-REFRESH-PUBLICATION-SEQUENCES-fo.patch (text/x-patch) patch v20250930-0005
- v20250930-0004-Update-ALTER-SUBSCRIPTION-REFRESH-to-ALTER.patch (text/x-patch) patch v20250930-0004
- v20250930-0002-Introduce-ALL-SEQUENCES-support-for-Postgr.patch (text/x-patch) patch v20250930-0002
- v20250930-0003-Reorganize-tablesync-Code-and-Introduce-sy.patch (text/x-patch) patch v20250930-0003
- v20250930-0006-New-worker-for-sequence-synchronization-du.patch (text/x-patch) patch v20250930-0006
- v20250930-0007-Documentation-for-sequence-synchronization.patch (text/x-patch) patch v20250930-0007
On Mon, 29 Sept 2025 at 09:59, shveta malik <shveta.malik@gmail.com> wrote: > > On Fri, Sep 26, 2025 at 12:55 PM vignesh C <vignesh21@gmail.com> wrote: > > > > On Thu, 25 Sept 2025 at 12:23, shveta malik <shveta.malik@gmail.com> wrote: > > > > > > sequencesync_list_invalidate_cb(): > > > 5) > > > > > > + /* invalidate all entries */ > > > + hash_seq_init(&status, sequences_to_copy); > > > + while ((entry = (LogicalRepSequenceInfo *) hash_seq_search(&status)) != NULL) > > > + entry->entry_valid = false; > > > > > > Can you please elaborate when this case can be hit? I see such logic > > > in all such invalidation functions registered with > > > CacheRegisterRelcacheCallback(), but could not find any relevant > > > comment. > > > > I noticed this could happen in cases like: > > create publication for all tables; > > alter publication on many relations; > > > > but there might be more apart from this > > > > Okay. I will review more here. > > > Rest of the comments were addressed. > > The attached patch has the changes for the same. > > > > Thanks. > > I found a race condition between the apply worker and the sequence > sync worker, where a sequence might be deleted from > pg_subscription_rel and fail to be re-added when it should be. > > Steps: > > 1) > The publisher and subscriber both have two sequences: seq1 and seq2. > > 2) > A REFRESH PUBLICATION SEQUENCES command is executed on the subscriber. > Before the sequencesync worker on the subscriber can locate the > corresponding sequence on the publisher, the sequence gets dropped on > the publisher. In other words, the sequence is removed from the > publisher before walrcv_exec() is called in copy_sequences(). > > 3) > Before the sequencesync worker on the subscriber can drop the sequence > locally, it is recreated on the publisher. Then, a second REFRESH > PUBLICATION SEQUENCES command is executed on the subscriber. (i.e., > before RemoveSubscriptionRel() is reached in copy_sequences(), the > sequence is already recreated on the publisher and a new refresh > command is issued on the subscriber.) > > 4) > During this second REFRESH PUBLICATION SEQUENCES, the sequence is > found to already exist in pg_subscription_rel, so it is not re-added. > However, concurrently, the sequencesync worker from the first refresh > proceeds and drops the sequence from the subscriber. > > As a result, the sequence ends up being removed from > pg_subscription_rel, even though it should have remained after both > REFRESH PUBLICATION SEQUENCES commands. I've resolved it by modifying the sequence sync worker to no longer remove sequences from pg_subscription_rel, aligning its behavior with that of the tablesync worker. This change ensures consistency and also addresses the reported problem. The attached patch includes the necessary modifications. Regards, Vignesh