Dear Vignesh,
Here are remained comments for v20250723 0003-0005. I've not checked the latest
version.
01.
```
* PostgreSQL logical replication: common synchronization code
```
How about: "Common code for synchronizations"? Since this file locates in
replication/logical, initial part is bit trivial.
02.
How do you feel to separate header file into syncutils.h file? We can put some
definitions needed for synchronizations.
03.
```
-extern void getSubscriptionTables(Archive *fout);
+extern void getSubscriptionRelations(Archive *fout);
```
Assuming that this function obtains both tables and sequences. I'm now wondering
we can say "relation" for both the tables and sequences in the context. E.g.,
getTableData()->makeTableDataInfo() seems to obtain both table and sequence
data,
and dumpSequenceData() dumps sequences. How about keep getSubscriptionTables, or
getSubscriptionTablesAndSequences?
04.
```
/*
* dumpSubscriptionTable
* Dump the definition of the given subscription table mapping. This
will be
* used only in binary-upgrade mode for PG17 or later versions.
*/
static void
dumpSubscriptionTable(Archive *fout, const SubRelInfo *subrinfo)
```
If you rename getSubscriptionTables, dumpSubscriptionTable should be also
renamed.
05.
```
/*
* Gets list of all relations published by FOR ALL SEQUENCES publication(s).
*/
List *
GetAllSequencesPublicationRelations(void)
```
It looks very similar with GetAllTablesPublicationRelations(). Can we combine
them?
I feel we can pass the kind of target relation and pubviaroot.
06.
```
--- a/src/backend/catalog/pg_subscription.c
+++ b/src/backend/catalog/pg_subscription.c
@@ -27,6 +27,7 @@
#include "utils/array.h"
#include "utils/builtins.h"
#include "utils/fmgroids.h"
+#include "utils/memutils.h"
```
I can build without the header.
07.
```
+ /*
+ * XXX: If the subscription is for a sequence-only publication,
creating a
+ * replication origin is unnecessary because incremental synchronization
+ * of sequences is not supported, and sequence data is fully synced
during
+ * a REFRESH, which does not rely on the origin. If the publication is
+ * later modified to include tables, the origin can be created during
the
+ * ALTER SUBSCRIPTION ... REFRESH command.
+ */
ReplicationOriginNameForLogicalRep(subid, InvalidOid, originname,
sizeof(originname));
replorigin_create(originname);
```
The comment is bit misleading because currently we create the replicaton origin
in the case. Can you clarify the point like:
```
XXX: Now the replication origin is created for all the cases, but it is
unnecessary
when the subcription is for a sequence-only publicaiton....
```
08.
```
+ * XXX: If the subscription is for a sequence-only
publication,
+ * creating this slot is unnecessary. It can be created
later
+ * during the ALTER SUBSCRIPTION ... REFRESH
PUBLICATION or ALTER
+ * SUBSCRIPTION ... REFRESH PUBLICATION SEQUENCES
command, if the
+ * publication is updated to include tables.
```
Same as above.
09.
```
+ * Assert copy_data is true.
+ * Assert refresh_tables is false.
+ * Assert refresh_sequences is true
```
IIUC assertions are rarely described the comment stop function. If you want to
add, we should say like:
```
In Assert enabled builds, we verify that parameters are passed correctly...
```
10.
```
+#ifdef USE_ASSERT_CHECKING
+ /* Sanity checks for parameter values */
+ if (resync_all_sequences)
+ Assert(copy_data && !refresh_tables && refresh_sequences);
+#endif
```
How about below, which does not require ifdef.
```
Assert(!resync_all_sequences ||
(copy_data && !refresh_tables && refresh_sequences));
```
11.
```
+ bool issequence;
+ bool istable;
```
Isn't it enough to use istable?
12.
```
+ /* Relation is either a sequence or a table */
+ issequence = get_rel_relkind(subrel->srrelid) ==
RELKIND_SEQUENCE;
```
How about adding an Assert() to ensure the relation is either of table or
sequence?
13.
```
+ * not_ready:
+ * If getting tables and not_ready is false get all tables, otherwise,
+ * only get tables that have not reached READY state.
+ * If getting sequences and not_ready is false get all sequences,
+ * otherwise, only get sequences that have not reached READY state (i.e. are
+ * still in INIT state).
```
Two parts decribe mostly same point. How about:
If true, this function returns only the relations that are not in a ready state.
Otherwise returns all the relations of the subscription.
14.
```
+ char table_state;
```
It should be `relation_state`.
15.
```
+#define SEQ_LOG_CNT_INVALID 0
```
Can you add comment how we use it?
16.
```
+
+ TimestampTz last_seqsync_start_time;
```
I can't find the user of this attribute, is it needed?
17.
```
+ FetchRelationStates(&has_pending_sequences);
+ ProcessSyncingTablesForApply(current_lsn);
+ if (has_pending_sequences)
+ ProcessSyncingSequencesForApply();
```
IIUC we do not always call ProcessSyncingSequencesForApply() because it would
acquire
the LW lock. Can you clariy it as comments?
18.
```
+ case WORKERTYPE_SEQUENCESYNC:
+ /* Should never happen. */
+ Assert(0);
```
Should we call elog(ERROR) instead of Assert(0) like another case?
19.
```
/* Find the leader apply worker and signal it. */
logicalrep_worker_wakeup(MyLogicalRepWorker->subid, InvalidOid);
```
Do we have to signal to the leader even when the sequence worker exits?
Best regards,
Hayato Kuroda
FUJITSU LIMITED