Re: Logical Replication of sequences

shveta malik <shveta.malik@gmail.com>

From: shveta malik <shveta.malik@gmail.com>
To: vignesh C <vignesh21@gmail.com>
Cc: Shlok Kyal <shlok.kyal.oss@gmail.com>, Chao Li <li.evan.chao@gmail.com>, Amit Kapila <amit.kapila16@gmail.com>, Shinya Kato <shinya11.kato@gmail.com>, Peter Smith <smithpb2250@gmail.com>, Masahiko Sawada <sawada.mshk@gmail.com>, "Hayato Kuroda (Fujitsu)" <kuroda.hayato@fujitsu.com>, "Zhijie Hou (Fujitsu)" <houzj.fnst@fujitsu.com>, Dilip Kumar <dilipbalaut@gmail.com>, Nisha Moond <nisha.moond412@gmail.com>, Peter Eisentraut <peter@eisentraut.org>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>, Euler Taveira <euler@eulerto.com>, Michael Paquier <michael@paquier.xyz>, "Jonathan S. Katz" <jkatz@postgresql.org>, shveta malik <shveta.malik@gmail.com>
Date: 2025-12-19T04:34:53Z
Lists: pgsql-hackers

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Doc: Add documentation for sequence synchronization.

  2. Remove unused assignment in CREATE PUBLICATION grammar.

  3. Add seq_sync_error_count to subscription statistics.

  4. Fix few issues in commit 5509055d69.

  5. Add sequence synchronization for logical replication.

  6. Add worker type argument to logical replication worker functions.

  7. Introduce "REFRESH SEQUENCES" for subscriptions.

  8. Refactor logical worker synchronization code into a separate file.

  9. Standardize use of REFRESH PUBLICATION in code and messages.

  10. Add "ALL SEQUENCES" support to publications.

  11. Expose sequence page LSN via pg_get_sequence_data.

  12. Resume conflict-relevant data retention automatically.

  13. Post-commit review fixes for 228c370868.

  14. Generate GUC tables from .dat file

On Thu, Dec 18, 2025 at 5:30 PM vignesh C <vignesh21@gmail.com> wrote:
>
> On Thu, 18 Dec 2025 at 17:03, shveta malik <shveta.malik@gmail.com> wrote:
> >
> > On Thu, Dec 18, 2025 at 3:04 PM vignesh C <vignesh21@gmail.com> wrote:
> > >
> > > On Thu, 18 Dec 2025 at 12:37, Shlok Kyal <shlok.kyal.oss@gmail.com> wrote:
> > > >
> > > > Hi Team,
> > > >
> > > > While working on another thread, I noticed a bug introduced by commit
> > > > as part of this thread.
> > > > In function pg_get_publication_tables, We have code:
> > > > ```
> > > >                      if (pub_elem->alltables)
> > > > pub_elem_tables = GetAllPublicationRelations(RELKIND_RELATION,
> > > >  pub_elem->pubviaroot);
> > > > else
> > > > {
> > > > List     *relids,
> > > >    *schemarelids;
> > > >
> > > > relids = GetPublicationRelations(pub_elem->oid,
> > > >  pub_elem->pubviaroot ?
> > > >  PUBLICATION_PART_ROOT :
> > > >  PUBLICATION_PART_LEAF);
> > > > schemarelids = GetAllSchemaPublicationRelations(pub_elem->oid,
> > > > pub_elem->pubviaroot ?
> > > > PUBLICATION_PART_ROOT :
> > > > PUBLICATION_PART_LEAF);
> > > > pub_elem_tables = list_concat_unique_oid(relids, schemarelids);
> > > > }
> > > > ```
> > > >
> > > > So, when we create an 'ALL SEQUENCE publication' and we execute
> > > > 'SELECT * from pg_publication_tables'
> > > > We will enter the else condition in the above code, which does not
> > > > seem correct to me.
> > > > It will call functions which are not required to be called. It will
> > > > also call the function 'GetPublicationRelations' which contradicts the
> > > > comment above this function.
> > > >
> > > > Similar issue is present for functions "InvalidatePubRelSyncCache" and
> > > > "AlterPublicationOptions".
> > >
> > > Thanks Shlok for reporting these issues,  In the areas highlighted, we
> > > can skip processing for sequences-only publications. The attached
> > > patch implements these changes.
> > >
> >
> > We have '!pub->alltables' check at 2 more places:
> > -- pgoutput_row_filter_init()
>
> It's not necessary here, because only publications that actually
> replicate the given relation are passed to pgoutput_row_filter_init.
> Sequence publications are excluded from this list, so they will never
> appear there.
>
> > -- pg_get_publication_tables()
>
> We don't need to explicitly check !pub->allsequences here. The guard
> if (funcctx->call_cntr < list_length(table_infos))
> already ensures that the remaining code is executed only when
> table_infos contains elements. If the list has entries, it necessarily
> represents a table publication, and it will enumerate those tables. If
> the list is empty, the condition fails and no rows are returned, so
> the extra check is not required.
>

Okay, the patch LGTM.

thanks
Shveta