From 89b14bb03eabb2380d04f720bb3404808fe3c240 Mon Sep 17 00:00:00 2001 From: Ahmet Gedemenli Date: Thu, 21 Oct 2021 16:33:33 +0300 Subject: [PATCH] Mark autoConverted=false when cascading --- ..._table_operation_for_connected_relations.c | 21 ++++++++++-- .../citus_add_local_table_to_metadata.c | 34 +++++++++++++------ src/include/distributed/commands.h | 7 ++-- .../expected/auto_undist_citus_local.out | 5 +-- 4 files changed, 50 insertions(+), 17 deletions(-) diff --git a/src/backend/distributed/commands/cascade_table_operation_for_connected_relations.c b/src/backend/distributed/commands/cascade_table_operation_for_connected_relations.c index a1d94b5db..fb42348e2 100644 --- a/src/backend/distributed/commands/cascade_table_operation_for_connected_relations.c +++ b/src/backend/distributed/commands/cascade_table_operation_for_connected_relations.c @@ -87,7 +87,8 @@ CascadeOperationForRelationIdList(List *relationIdList, LOCKMODE lockMode, { LockRelationsWithLockMode(relationIdList, lockMode); - if (cascadeOperationType == CASCADE_ADD_LOCAL_TABLE_TO_METADATA) + if (cascadeOperationType == CASCADE_USER_ADD_LOCAL_TABLE_TO_METADATA || + cascadeOperationType == CASCADE_AUTO_ADD_LOCAL_TABLE_TO_METADATA) { /* * In CreateCitusLocalTable function, this check would never error out, @@ -474,11 +475,25 @@ ExecuteCascadeOperationForRelationIdList(List *relationIdList, break; } - case CASCADE_ADD_LOCAL_TABLE_TO_METADATA: + case CASCADE_USER_ADD_LOCAL_TABLE_TO_METADATA: { if (!IsCitusTable(relationId)) { - CreateCitusLocalTable(relationId, cascadeViaForeignKeys, true); + bool autoConverted = false; + CreateCitusLocalTable(relationId, cascadeViaForeignKeys, + autoConverted); + } + + break; + } + + case CASCADE_AUTO_ADD_LOCAL_TABLE_TO_METADATA: + { + if (!IsCitusTable(relationId)) + { + bool autoConverted = true; + CreateCitusLocalTable(relationId, cascadeViaForeignKeys, + autoConverted); } break; 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 bdc31e1a6..00034dc84 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 @@ -52,6 +52,7 @@ static void ErrorIfAddingPartitionTableToMetadata(Oid relationId); static void ErrorIfUnsupportedCreateCitusLocalTable(Relation relation); static void ErrorIfUnsupportedCitusLocalTableKind(Oid relationId); static void ErrorIfUnsupportedCitusLocalColumnDefinition(Relation relation); +static CascadeOperationType GetCascadeTypeForCitusLocalTables(bool autoConverted); static List * GetShellTableDDLEventsForCitusLocalTable(Oid relationId); static uint64 ConvertLocalTableToShard(Oid relationId); static void RenameRelationToShardRelation(Oid shellRelationId, uint64 shardId); @@ -260,20 +261,14 @@ CreateCitusLocalTable(Oid relationId, bool cascadeViaForeignKeys, bool autoConve qualifiedRelationName, qualifiedRelationName))); } - /* save the relation name, to obtain the shell relation id later */ - char *relationName = get_rel_name(relationId); - Oid relationSchemaId = get_rel_namespace(relationId); + CascadeOperationType cascadeType = + GetCascadeTypeForCitusLocalTables(autoConverted); /* * By acquiring AccessExclusiveLock, make sure that no modifications happen * on the relations. */ - CascadeOperationForFkeyConnectedRelations(relationId, lockMode, - CASCADE_ADD_LOCAL_TABLE_TO_METADATA); - - Oid shellRelationId = get_relname_relid(relationName, relationSchemaId); - - UpdatePartitionAutoConverted(shellRelationId, autoConverted); + CascadeOperationForFkeyConnectedRelations(relationId, lockMode, cascadeType); /* * We converted every foreign key connected table in our subgraph @@ -289,8 +284,11 @@ CreateCitusLocalTable(Oid relationId, bool cascadeViaForeignKeys, bool autoConve { relationList = lappend_oid(relationList, relationId); + CascadeOperationType cascadeType = + GetCascadeTypeForCitusLocalTables(autoConverted); + CascadeOperationForRelationIdList(relationList, AccessExclusiveLock, - CASCADE_ADD_LOCAL_TABLE_TO_METADATA); + cascadeType); return; } } @@ -549,6 +547,22 @@ ErrorIfUnsupportedCitusLocalColumnDefinition(Relation relation) } +/* + * GetCascadeTypeForCitusLocalTables returns CASCADE_AUTO_ADD_LOCAL_TABLE_TO_METADATA + * if autoConverted is true. Returns CASCADE_USER_ADD_LOCAL_TABLE_TO_METADATA otherwise. + */ +static CascadeOperationType +GetCascadeTypeForCitusLocalTables(bool autoConverted) +{ + if (autoConverted) + { + return CASCADE_AUTO_ADD_LOCAL_TABLE_TO_METADATA; + } + + return CASCADE_USER_ADD_LOCAL_TABLE_TO_METADATA; +} + + /* * GetShellTableDDLEventsForCitusLocalTable returns a list of DDL commands * to create the shell table from scratch. diff --git a/src/include/distributed/commands.h b/src/include/distributed/commands.h index 092ca9041..71b0f55f5 100644 --- a/src/include/distributed/commands.h +++ b/src/include/distributed/commands.h @@ -512,8 +512,11 @@ typedef enum CascadeOperationType /* execute UndistributeTable on each relation */ CASCADE_FKEY_UNDISTRIBUTE_TABLE = 1 << 1, - /* execute CreateCitusLocalTable on each relation */ - CASCADE_ADD_LOCAL_TABLE_TO_METADATA = 1 << 2, + /* execute CreateCitusLocalTable on each relation, with autoConverted = false */ + CASCADE_USER_ADD_LOCAL_TABLE_TO_METADATA = 1 << 2, + + /* execute CreateCitusLocalTable on each relation, with autoConverted = true */ + CASCADE_AUTO_ADD_LOCAL_TABLE_TO_METADATA = 1 << 3, } CascadeOperationType; extern void CascadeOperationForFkeyConnectedRelations(Oid relationId, diff --git a/src/test/regress/expected/auto_undist_citus_local.out b/src/test/regress/expected/auto_undist_citus_local.out index 8085c6ae5..d12b9541b 100644 --- a/src/test/regress/expected/auto_undist_citus_local.out +++ b/src/test/regress/expected/auto_undist_citus_local.out @@ -476,7 +476,7 @@ SELECT logicalrelid, autoconverted FROM pg_dist_partition logicalrelid | autoconverted --------------------------------------------------------------------- citus_local_table_1 | f - citus_local_table_2 | t + citus_local_table_2 | f citus_local_table_3 | f (3 rows) @@ -489,8 +489,9 @@ SELECT logicalrelid, autoconverted FROM pg_dist_partition logicalrelid | autoconverted --------------------------------------------------------------------- citus_local_table_1 | f + citus_local_table_2 | f citus_local_table_3 | f -(2 rows) +(3 rows) -- a single drop table cascades into multiple undistributes DROP TABLE IF EXISTS citus_local_table_1, citus_local_table_2, citus_local_table_3, citus_local_table_2, reference_table_1;