mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
Introduce "REFRESH SEQUENCES" for subscriptions.
This patch adds support for a new SQL command: ALTER SUBSCRIPTION ... REFRESH SEQUENCES This command updates the sequence entries present in the pg_subscription_rel catalog table with the INIT state to trigger resynchronization. In addition to the new command, the following subscription commands have been enhanced to automatically refresh sequence mappings: ALTER SUBSCRIPTION ... REFRESH PUBLICATION ALTER SUBSCRIPTION ... ADD PUBLICATION ALTER SUBSCRIPTION ... DROP PUBLICATION ALTER SUBSCRIPTION ... SET PUBLICATION These commands will perform the following actions: Add newly published sequences that are not yet part of the subscription. Remove sequences that are no longer included in the publication. This ensures that sequence replication remains aligned with the current state of the publication on the publisher side. Note that the actual synchronization of sequence data/values will be handled in a subsequent patch that introduces a dedicated sequence sync worker. Author: Vignesh C <vignesh21@gmail.com> Reviewed-by: Amit Kapila <amit.kapila16@gmail.com> Reviewed-by: shveta malik <shveta.malik@gmail.com> Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com> Reviewed-by: Hayato Kuroda <kuroda.hayato@fujitsu.com> Reviewed-by: Dilip Kumar <dilipbalaut@gmail.com> Reviewed-by: Peter Smith <smithpb2250@gmail.com> Reviewed-by: Nisha Moond <nisha.moond412@gmail.com> Reviewed-by: Shlok Kyal <shlok.kyal.oss@gmail.com> Reviewed-by: Chao Li <li.evan.chao@gmail.com> Reviewed-by: Hou Zhijie <houzj.fnst@fujitsu.com> Discussion: https://postgr.es/m/CAA4eK1LC+KJiAkSrpE_NwvNdidw9F2os7GERUeSxSKv71gXysQ@mail.gmail.com
This commit is contained in:
@@ -708,6 +708,9 @@ logicalrep_read_rel(StringInfo in)
|
||||
/* Read the replica identity. */
|
||||
rel->replident = pq_getmsgbyte(in);
|
||||
|
||||
/* relkind is not sent */
|
||||
rel->relkind = 0;
|
||||
|
||||
/* Get attribute description */
|
||||
logicalrep_read_attrs(in, rel);
|
||||
|
||||
|
||||
@@ -196,6 +196,17 @@ logicalrep_relmap_update(LogicalRepRelation *remoterel)
|
||||
entry->remoterel.atttyps[i] = remoterel->atttyps[i];
|
||||
}
|
||||
entry->remoterel.replident = remoterel->replident;
|
||||
|
||||
/*
|
||||
* XXX The walsender currently does not transmit the relkind of the remote
|
||||
* relation when replicating changes. Since we support replicating only
|
||||
* table changes at present, we default to initializing relkind as
|
||||
* RELKIND_RELATION. This is needed in CheckSubscriptionRelkind() to check
|
||||
* if the publisher and subscriber relation kinds are compatible.
|
||||
*/
|
||||
entry->remoterel.relkind =
|
||||
(remoterel->relkind == 0) ? RELKIND_RELATION : remoterel->relkind;
|
||||
|
||||
entry->remoterel.attkeys = bms_copy(remoterel->attkeys);
|
||||
MemoryContextSwitchTo(oldctx);
|
||||
}
|
||||
@@ -425,6 +436,7 @@ logicalrep_rel_open(LogicalRepRelId remoteid, LOCKMODE lockmode)
|
||||
|
||||
/* Check for supported relkind. */
|
||||
CheckSubscriptionRelkind(entry->localrel->rd_rel->relkind,
|
||||
remoterel->relkind,
|
||||
remoterel->nspname, remoterel->relname);
|
||||
|
||||
/*
|
||||
|
||||
@@ -149,8 +149,9 @@ FetchRelationStates(bool *started_tx)
|
||||
*started_tx = true;
|
||||
}
|
||||
|
||||
/* Fetch tables and sequences that are in non-ready state. */
|
||||
rstates = GetSubscriptionRelations(MySubscription->oid, true);
|
||||
/* Fetch tables that are in non-ready state. */
|
||||
rstates = GetSubscriptionRelations(MySubscription->oid, true, false,
|
||||
true);
|
||||
|
||||
/* Allocate the tracking info in a permanent memory context. */
|
||||
oldctx = MemoryContextSwitchTo(CacheMemoryContext);
|
||||
|
||||
@@ -840,7 +840,7 @@ fetch_remote_table_info(char *nspname, char *relname, LogicalRepRelation *lrel,
|
||||
/*
|
||||
* We don't support the case where the column list is different for
|
||||
* the same table when combining publications. See comments atop
|
||||
* fetch_table_list. So there should be only one row returned.
|
||||
* fetch_relation_list. So there should be only one row returned.
|
||||
* Although we already checked this when creating the subscription, we
|
||||
* still need to check here in case the column list was changed after
|
||||
* creating the subscription and before the sync worker is started.
|
||||
|
||||
@@ -3368,6 +3368,7 @@ apply_handle_tuple_routing(ApplyExecutionData *edata,
|
||||
* at CREATE/ALTER SUBSCRIPTION would be insufficient.
|
||||
*/
|
||||
CheckSubscriptionRelkind(partrel->rd_rel->relkind,
|
||||
relmapentry->remoterel.relkind,
|
||||
get_namespace_name(RelationGetNamespace(partrel)),
|
||||
RelationGetRelationName(partrel));
|
||||
|
||||
@@ -3564,6 +3565,7 @@ apply_handle_tuple_routing(ApplyExecutionData *edata,
|
||||
|
||||
/* Check that new partition also has supported relkind. */
|
||||
CheckSubscriptionRelkind(partrel_new->rd_rel->relkind,
|
||||
relmapentry->remoterel.relkind,
|
||||
get_namespace_name(RelationGetNamespace(partrel_new)),
|
||||
RelationGetRelationName(partrel_new));
|
||||
|
||||
|
||||
@@ -1137,9 +1137,9 @@ pgoutput_column_list_init(PGOutputData *data, List *publications,
|
||||
*
|
||||
* Note that we don't support the case where the column list is different
|
||||
* for the same table when combining publications. See comments atop
|
||||
* fetch_table_list. But one can later change the publication so we still
|
||||
* need to check all the given publication-table mappings and report an
|
||||
* error if any publications have a different column list.
|
||||
* fetch_relation_list. But one can later change the publication so we
|
||||
* still need to check all the given publication-table mappings and report
|
||||
* an error if any publications have a different column list.
|
||||
*/
|
||||
foreach(lc, publications)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user