Re: Logical Replication of sequences
Peter Smith <smithpb2250@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
Hi Vignesh,
Here are a few review comments for patch 0001:
======
src/backend/catalog/pg_subscription.c
GetSubscriptionRelations:
1.
List *
-GetSubscriptionRelations(Oid subid, bool not_ready)
+GetSubscriptionRelations(Oid subid, bool otherwise return all the
relations of the subscription, bool get_sequences,
+ bool not_ready)
Now the function parameter means the (unchanged) function comment is
not correct anymore.
e.g. It still says "otherwise return all the relations of the
subscription", but that does not account for the parameters indicating
if you only want tables, or only want sequences.
======
src/backend/commands/subscriptioncmds.c
2.
+typedef struct PublicationRelKind
+{
+ RangeVar *rv;
+ char relkind;
+} PublicationRelKind;
+
Is this deserving of a comment to saying what it is for?
~~~
CreateSubscription:
3.
+ *
+ * Similar to origins, it is not clear whether preventing the slot
+ * creation for empty and sequence-only subscriptions is worth
+ * additional complexity.
*/
I think this "Similar to..." comment needs "XXX", same as the earlier
comment it is referring to.
~~~
AlterSubscription_refresh:
4.
+ * Build qsorted array of local relation oids for faster lookup. This
+ * can potentially contain all relation in the database so speed of
+ * lookup is important.
+ *
/all relation/all relations/
~~~
5.
- qsort(subrel_local_oids, subrel_count,
+ qsort(subrel_local_oids, tbl_count,
sizeof(Oid), oid_cmp);
- check_publications_origin(wrconn, sub->publications, copy_data,
- sub->retaindeadtuples, sub->origin,
- subrel_local_oids, subrel_count, sub->name);
+ check_publications_origin_tables(wrconn, sub->publications, copy_data,
+ sub->retaindeadtuples, sub->origin,
+ subrel_local_oids, tbl_count,
+ sub->name);
- /*
- * Rels that we want to remove from subscription and drop any slots
- * and origins corresponding to them.
- */
- sub_remove_rels = palloc(subrel_count * sizeof(SubRemoveRels));
+ qsort(subseq_local_oids, seq_count, sizeof(Oid), oid_cmp);
+ check_publications_origin_sequences(wrconn, sub->publications,
+ sub->origin, subseq_local_oids,
+ seq_count, sub->name);
The first qsort wrapping and the blank line spacing are a bit inconsistent here.
~~~
6.
+static void
+check_publications_origin_sequences(WalReceiverConn *wrconn, List
*publications,
+ char *origin, Oid *subrel_local_oids,
+ int subrel_count, char *subname)
Deserving of a function comment?
~
7.
+ for (i = 0; i < subrel_count; i++)
+ {
Declare 'i' as a for-loop variable.
~
8.
+ if (res->status != WALRCV_OK_TUPLES)
+ ereport(ERROR,
+ (errcode(ERRCODE_CONNECTION_FAILURE),
+ errmsg("could not receive list of replicated relations from the
publisher: %s",
+ res->err)));
+
+ /* Process relations. */
+ slot = MakeSingleTupleTableSlot(res->tupledesc, &TTSOpsMinimalTuple);
+ while (tuplestore_gettupleslot(res->tuplestore, true, false, slot))
Since this function is just for sequences, should it say "replicated
sequences" instead of "relations" here?
Similarly, should the "Process relations" maybe say "Process sequence
relations" or "Process sequences"?
~~~
fetch_table_list:
9.
+ appendStringInfo(&cmd,
+ "UNION ALL\n"
+ " SELECT DISTINCT s.schemaname, s.sequencename, NULL::int2vector AS
attrs, " CppAsString2(RELKIND_SEQUENCE) "::\"char\" AS relkind\n"
+ " FROM pg_catalog.pg_publication_sequences s\n"
+ " WHERE s.pubname IN (%s)",
+ pub_names->data);
Missing a final \n?
======
src/backend/replication/logical/syncutils.c
10.
bool
FetchRelationStates(bool *started_tx)
IIUC, you are using the terminology "relations" to apply to both
tables or sequences; OTOH ", tables" is just tables. It seems this
function is table-specific. Should it have a name change like
FetchTableStates?
======
src/test/subscription/t/036_sequences.pl
11.
There are no test cases checking that ALTER commands will correctly
add/remove sequences in the pg_subscription_rel?
======
Kind Regards,
Peter Smith.
Fujitsu Australia