Re: Logical Replication of sequences

From: shveta malik <shveta(dot)malik(at)gmail(dot)com>
To: vignesh C <vignesh21(at)gmail(dot)com>
Cc: Shlok Kyal <shlok(dot)kyal(dot)oss(at)gmail(dot)com>, Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com>, Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com>, "Hayato Kuroda (Fujitsu)" <kuroda(dot)hayato(at)fujitsu(dot)com>, Nisha Moond <nisha(dot)moond412(at)gmail(dot)com>, Dilip Kumar <dilipbalaut(at)gmail(dot)com>, Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>, Peter Smith <smithpb2250(at)gmail(dot)com>, Peter Eisentraut <peter(at)eisentraut(dot)org>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, Euler Taveira <euler(at)eulerto(dot)com>, Michael Paquier <michael(at)paquier(dot)xyz>, "Zhijie Hou (Fujitsu)" <houzj(dot)fnst(at)fujitsu(dot)com>, "Jonathan S(dot) Katz" <jkatz(at)postgresql(dot)org>, shveta malik <shveta(dot)malik(at)gmail(dot)com>
Subject: Re: Logical Replication of sequences
Date: 2025-09-22 06:33:19
Message-ID: CAJpy0uBXpy8mcvKa+oZ=y5sVX+Fe5f6Q7ABTj7fCjqZrvnU_1g@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Thu, Sep 18, 2025 at 4:07 PM vignesh C <vignesh21(at)gmail(dot)com> wrote:
>
> Thanks for the comments, these are handled in the attached patch.
>

Please find a few comments:

patch005:
1)
GetSubscriptionRelations:
+ /* Skip sequences if they were not requested */
+ if (!get_sequences && (relkind == RELKIND_SEQUENCE))
+ continue;
+
+ /* Skip tables if they were not requested */
+ if (!get_tables && (relkind != RELKIND_SEQUENCE))
+ continue;

The use of negated conditions makes the logic harder to follow,
especially in the second if block.

Can we write it as:
bool is_sequence = (relkind == RELKIND_SEQUENCE);

/* Skip if the relation type is not requested */
if ((get_tables && is_sequence) ||
(get_sequences && !is_sequence))
continue;

Or at-least:
/* Skip sequences if they were not requested */
if (get_tables && (relkind == RELKIND_SEQUENCE))
continue;

/* Skip tables if they were not requested */
if (get_sequences && (relkind != RELKIND_SEQUENCE))
continue;

2)

AlterSubscription_refresh_seq:

+ UpdateSubscriptionRelState(sub->oid, relid, SUBREL_STATE_DATASYNC,
+ InvalidXLogRecPtr, false);

Now it seems we are setting SUBREL_STATE_DATASYNC state as well for
sequences. Earlier it was INIT only.

So we need correction at 2 places:
a)
Comment atop GetSubscriptionRelations() which mentions :
* If getting sequences and not_ready is false, retrieve all sequences;
* otherwise, retrieve only sequences that are still in the INIT state
* (i.e., have not reached the READY state).

We shall change it to that have not reached the READY state.

b)
patch 006's commit message says:
This patch introduces sequence synchronization:
Sequences have 2 states:
- INIT (needs synchronizing)
- READY (is already synchronized)

We shall mention the third state as well.

3)
There is some optimization in fetch_relation_list() in patch006. I
think it should be in patch005 itself where we have4 added new logic
to fetch sequeneces and relkind in patch005.
Or do we need those for patch006 specifically?

patch006:
4)
sequencesync.c:

+ * Sequences to be synchronized by the sequencesync worker will
+ * be added to pg_subscription_rel in INIT state when one of the following
+ * commands is executed:
+ * CREATE SUBSCRIPTION
+ * ALTER SUBSCRIPTION ... REFRESH PUBLICATION
+ * ALTER SUBSCRIPTION ... REFRESH PUBLICATION SEQUENCES

I think this comment needs change. 'REFRESH PUBLICATION SEQUENCES' is
not doing that anymore.

5)
* So the state progression is always just: INIT -> READY.
I see even SUBREL_STATE_DATASYNC being set now by
AlterSubscription_refresh_seq()

thanks
Shveta

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Чумак Антон 2025-09-22 06:55:22 Re: [PATCH] Introduce unified support for composite GUC options
Previous Message Shubham Khanna 2025-09-22 06:03:18 Re: Add support for specifying tables in pg_createsubscriber.