From 065db645b961c0f50814cf486ea34fa7bf2be382 Mon Sep 17 00:00:00 2001 From: Burak Velioglu Date: Wed, 19 Jan 2022 13:24:33 +0300 Subject: [PATCH] Move table related part out from metadata --- .../citus_add_local_table_to_metadata.c | 5 +- .../commands/create_distributed_table.c | 2 +- .../distributed/commands/dependencies.c | 5 +- .../distributed/metadata/metadata_sync.c | 85 ++++++++++++------- src/include/distributed/metadata_sync.h | 1 + 5 files changed, 60 insertions(+), 38 deletions(-) diff --git a/src/backend/distributed/commands/citus_add_local_table_to_metadata.c b/src/backend/distributed/commands/citus_add_local_table_to_metadata.c index ee83ea4fa..20486c332 100644 --- a/src/backend/distributed/commands/citus_add_local_table_to_metadata.c +++ b/src/backend/distributed/commands/citus_add_local_table_to_metadata.c @@ -1242,11 +1242,12 @@ FinalizeCitusLocalTableCreation(Oid relationId, List *dependentSequenceList) if (ShouldSyncTableMetadata(relationId)) { CreateShellTableOnWorkers(relationId); - CreateTableMetadataOnWorkers(relationId); - ObjectAddress relationAddress = { 0 }; ObjectAddressSet(relationAddress, RelationRelationId, relationId); MarkObjectDistributed(&relationAddress); + + CreateTableMetadataOnWorkers(relationId); + CreateInterTableRelationshipOfRelationOnWorkers(relationId); } /* diff --git a/src/backend/distributed/commands/create_distributed_table.c b/src/backend/distributed/commands/create_distributed_table.c index 273baf1aa..1ee67fe46 100644 --- a/src/backend/distributed/commands/create_distributed_table.c +++ b/src/backend/distributed/commands/create_distributed_table.c @@ -539,6 +539,7 @@ CreateDistributedTable(Oid relationId, Var *distributionColumn, char distributio CreateShellTableOnWorkers(relationId); MarkObjectDistributed(&tableAddress); CreateTableMetadataOnWorkers(relationId); + CreateInterTableRelationshipOfRelationOnWorkers(relationId); } /* @@ -601,7 +602,6 @@ void EnsureSequenceTypeSupported(Oid seqOid, Oid seqTypId) { List *citusTableIdList = CitusTableTypeIdList(ANY_CITUS_TABLE_TYPE); - Oid citusTableId = InvalidOid; foreach_oid(citusTableId, citusTableIdList) { diff --git a/src/backend/distributed/commands/dependencies.c b/src/backend/distributed/commands/dependencies.c index 57fb9507f..4bcaa4bcd 100644 --- a/src/backend/distributed/commands/dependencies.c +++ b/src/backend/distributed/commands/dependencies.c @@ -374,7 +374,8 @@ GetCitusTableDDLCommandList(Oid relationId) List * ReplicateAllDependenciesToNodeCommandList(const char *nodeName, int nodePort) { - List *ddlCommands = NIL; + /* since we are executing ddl commands disable propagation first, primarily for mx */ + List *ddlCommands = list_make1(DISABLE_DDL_PROPAGATION); /* * collect all dependencies in creation order and get their ddl commands @@ -412,8 +413,6 @@ ReplicateAllDependenciesToNodeCommandList(const char *nodeName, int nodePort) GetDependencyCreateDDLCommands(dependency)); } - /* since we are executing ddl commands lets disable propagation, primarily for mx */ - ddlCommands = lcons(DISABLE_DDL_PROPAGATION, ddlCommands); ddlCommands = lappend(ddlCommands, ENABLE_DDL_PROPAGATION); return ddlCommands; diff --git a/src/backend/distributed/metadata/metadata_sync.c b/src/backend/distributed/metadata/metadata_sync.c index 830218a24..849981b34 100644 --- a/src/backend/distributed/metadata/metadata_sync.c +++ b/src/backend/distributed/metadata/metadata_sync.c @@ -637,8 +637,7 @@ DistributedObjectMetadataSyncCommandList(void) /* * GetDistributedTableMetadataEvents returns the full set of DDL commands necessary to - * create the given distributed table metadata on a worker. The list includes setting up - * any shard metadata, setting the truncate trigger and foreign key constraints. + * create the given distributed table metadata on a worker. */ static List * GetDistributedTableMetadataEvents(Oid relationId) @@ -647,41 +646,15 @@ GetDistributedTableMetadataEvents(Oid relationId) List *commandList = NIL; - /* if the table is owned by an extension we only propagate pg_dist_* records */ - bool tableOwnedByExtension = IsTableOwnedByExtension(relationId); - /* command to insert pg_dist_partition entry */ char *metadataCommand = DistributionCreateCommand(cacheEntry); commandList = lappend(commandList, metadataCommand); - /* commands to create the truncate trigger of the table */ - if (!IsForeignTable(relationId)) - { - char *truncateTriggerCreateCommand = TruncateTriggerCreateCommand(relationId); - commandList = lappend(commandList, truncateTriggerCreateCommand); - } - /* commands to insert pg_dist_shard & pg_dist_placement entries */ List *shardIntervalList = LoadShardIntervalList(relationId); List *shardMetadataInsertCommandList = ShardListInsertCommand(shardIntervalList); commandList = list_concat(commandList, shardMetadataInsertCommandList); - if (!tableOwnedByExtension) - { - /* commands to create foreign key constraints */ - List *foreignConstraintCommands = - GetReferencingForeignConstaintCommands(relationId); - commandList = list_concat(commandList, foreignConstraintCommands); - - /* commands to create partitioning hierarchy */ - if (PartitionTable(relationId)) - { - char *alterTableAttachPartitionCommands = - GenerateAlterTableAttachPartitionCommand(relationId); - commandList = lappend(commandList, alterTableAttachPartitionCommands); - } - } - return commandList; } @@ -1857,7 +1830,48 @@ HasMetadataWorkers(void) /* - * CreateShellTableOnWorkers creates the shell table on each worker node with metadata. + * CreateInterTableRelationshipOfRelationOnWorkers create inter table relationship + * for the the given relation id. + */ +void +CreateInterTableRelationshipOfRelationOnWorkers(Oid relationId) +{ + /* if the table is owned by an extension we don't create */ + bool tableOwnedByExtension = IsTableOwnedByExtension(relationId); + if (tableOwnedByExtension) + { + return; + } + + List *commandList = NIL; + + /* commands to create foreign key constraints */ + List *foreignConstraintCommands = + GetReferencingForeignConstaintCommands(relationId); + commandList = list_concat(commandList, foreignConstraintCommands); + + /* commands to create partitioning hierarchy */ + if (PartitionTable(relationId)) + { + char *alterTableAttachPartitionCommands = + GenerateAlterTableAttachPartitionCommand(relationId); + commandList = lappend(commandList, alterTableAttachPartitionCommands); + } + + /* prevent recursive propagation */ + SendCommandToWorkersWithMetadata(DISABLE_DDL_PROPAGATION); + + const char *command = NULL; + foreach_ptr(command, commandList) + { + SendCommandToWorkersWithMetadata(command); + } +} + + +/* + * CreateShellTableOnWorkers creates the shell table on each worker node with metadata + * including sequence dependency and truncate triggers. */ void CreateShellTableOnWorkers(Oid relationId) @@ -1885,6 +1899,13 @@ CreateShellTableOnWorkers(Oid relationId) List *sequenceDependencyCommandList = SequenceDependencyCommandList(relationId); commandList = list_concat(commandList, sequenceDependencyCommandList); + /* commands to create the truncate trigger of the table */ + if (!IsForeignTable(relationId)) + { + char *truncateTriggerCreateCommand = TruncateTriggerCreateCommand(relationId); + commandList = lappend(commandList, truncateTriggerCreateCommand); + } + /* prevent recursive propagation */ SendCommandToWorkersWithMetadata(DISABLE_DDL_PROPAGATION); @@ -1898,9 +1919,9 @@ CreateShellTableOnWorkers(Oid relationId) /* * CreateTableMetadataOnWorkers creates the list of commands needed to create the - * given distributed table and sends these commands to all metadata workers i.e. workers - * with hasmetadata=true. Before sending the commands, in order to prevent recursive - * propagation, DDL propagation on workers are disabled with a + * metadata of the given distributed table and sends these commands to all metadata + * workers i.e. workers with hasmetadata=true. Before sending the commands, in order + * to prevent recursive propagation, DDL propagation on workers are disabled with a * `SET citus.enable_ddl_propagation TO off;` command. */ void diff --git a/src/include/distributed/metadata_sync.h b/src/include/distributed/metadata_sync.h index 598104f89..1fd4fe790 100644 --- a/src/include/distributed/metadata_sync.h +++ b/src/include/distributed/metadata_sync.h @@ -54,6 +54,7 @@ extern List * GrantOnSchemaDDLCommands(Oid schemaId); extern char * PlacementUpsertCommand(uint64 shardId, uint64 placementId, int shardState, uint64 shardLength, int32 groupId); extern char * TruncateTriggerCreateCommand(Oid relationId); +extern void CreateInterTableRelationshipOfRelationOnWorkers(Oid relationId); extern void CreateShellTableOnWorkers(Oid relationId); extern void CreateTableMetadataOnWorkers(Oid relationId); extern List * DetachPartitionCommandList(void);