From 320a8ecdea2928144fdaefd15c5e07e0849ba1f6 Mon Sep 17 00:00:00 2001 From: Burak Velioglu Date: Tue, 4 Jan 2022 12:04:33 +0300 Subject: [PATCH] Check groupid existence hackily while removing metadata --- .../distributed/executor/adaptive_executor.c | 2 +- .../distributed/metadata/metadata_cache.c | 28 ++++++++++++++++--- .../distributed/operations/shard_rebalancer.c | 2 +- .../operations/worker_node_manager.c | 2 +- .../distributed/worker/worker_drop_protocol.c | 6 ++++ src/include/distributed/metadata_cache.h | 2 +- src/include/distributed/metadata_sync.h | 2 +- 7 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/backend/distributed/executor/adaptive_executor.c b/src/backend/distributed/executor/adaptive_executor.c index 0e9d96fd5..58a01a6d9 100644 --- a/src/backend/distributed/executor/adaptive_executor.c +++ b/src/backend/distributed/executor/adaptive_executor.c @@ -2187,7 +2187,7 @@ LookupTaskPlacementHostAndPort(ShardPlacement *taskPlacement, char **nodeName, * there were changes in pg_dist_node and we will get those invalidations * in LookupNodeForGroup. */ - WorkerNode *workerNode = LookupNodeForGroup(taskPlacement->groupId); + WorkerNode *workerNode = LookupNodeForGroup(taskPlacement->groupId, false); *nodeName = workerNode->workerName; *nodePort = workerNode->workerPort; } diff --git a/src/backend/distributed/metadata/metadata_cache.c b/src/backend/distributed/metadata/metadata_cache.c index 52c4d258e..0461279f9 100644 --- a/src/backend/distributed/metadata/metadata_cache.c +++ b/src/backend/distributed/metadata/metadata_cache.c @@ -833,7 +833,12 @@ ResolveGroupShardPlacement(GroupShardPlacement *groupShardPlacement, ShardPlacement *shardPlacement = CitusMakeNode(ShardPlacement); int32 groupId = groupShardPlacement->groupId; - WorkerNode *workerNode = LookupNodeForGroup(groupId); + WorkerNode *workerNode = LookupNodeForGroup(groupId, true); + + if (workerNode == NULL) + { + return NULL; + } /* copy everything into shardPlacement but preserve the header */ CitusNode header = shardPlacement->type; @@ -929,7 +934,7 @@ LookupNodeByNodeIdOrError(uint32 nodeId) * appropriate error message. */ WorkerNode * -LookupNodeForGroup(int32 groupId) +LookupNodeForGroup(int32 groupId, bool checkExistence) { bool foundAnyNodes = false; @@ -954,8 +959,18 @@ LookupNodeForGroup(int32 groupId) if (!foundAnyNodes) { - ereport(ERROR, (errmsg("there is a shard placement in node group %d but " - "there are no nodes in that group", groupId))); + if (checkExistence) + { + ereport(NOTICE, (errmsg("there is a shard placement in node group %d but " + "there are no nodes in that group", groupId))); + + return NULL; + } + else + { + ereport(ERROR, (errmsg("there is a shard placement in node group %d but " + "there are no nodes in that group", groupId))); + } } switch (ReadFromSecondaries) @@ -1014,6 +1029,11 @@ ShardPlacementListIncludingOrphanedPlacements(uint64 shardId) tableEntry, shardIndex); + if (shardPlacement == NULL) + { + return NULL; + } + placementList = lappend(placementList, shardPlacement); } diff --git a/src/backend/distributed/operations/shard_rebalancer.c b/src/backend/distributed/operations/shard_rebalancer.c index 166423cf0..05f2a7619 100644 --- a/src/backend/distributed/operations/shard_rebalancer.c +++ b/src/backend/distributed/operations/shard_rebalancer.c @@ -391,7 +391,7 @@ FullShardPlacementList(Oid relationId, ArrayType *excludedShardArray) placementIndex++) { GroupShardPlacement *groupPlacement = &placementArray[placementIndex]; - WorkerNode *worker = LookupNodeForGroup(groupPlacement->groupId); + WorkerNode *worker = LookupNodeForGroup(groupPlacement->groupId, false); ShardPlacement *placement = CitusMakeNode(ShardPlacement); placement->shardId = groupPlacement->shardId; placement->shardLength = groupPlacement->shardLength; diff --git a/src/backend/distributed/operations/worker_node_manager.c b/src/backend/distributed/operations/worker_node_manager.c index 7fbc53e32..48142b965 100644 --- a/src/backend/distributed/operations/worker_node_manager.c +++ b/src/backend/distributed/operations/worker_node_manager.c @@ -455,7 +455,7 @@ CoordinatorNodeIfAddedAsWorkerOrError() { ErrorIfCoordinatorNotAddedAsWorkerNode(); - WorkerNode *coordinatorNode = LookupNodeForGroup(COORDINATOR_GROUP_ID); + WorkerNode *coordinatorNode = LookupNodeForGroup(COORDINATOR_GROUP_ID, false); WorkerNode *coordinatorNodeCopy = palloc0(sizeof(WorkerNode)); *coordinatorNodeCopy = *coordinatorNode; diff --git a/src/backend/distributed/worker/worker_drop_protocol.c b/src/backend/distributed/worker/worker_drop_protocol.c index 14381cd75..58b291585 100644 --- a/src/backend/distributed/worker/worker_drop_protocol.c +++ b/src/backend/distributed/worker/worker_drop_protocol.c @@ -268,6 +268,12 @@ worker_drop_distributed_table_metadata_only(PG_FUNCTION_ARGS) uint64 shardId = *shardIdPointer; List *shardPlacementList = ShardPlacementListIncludingOrphanedPlacements(shardId); + if (shardPlacementList == NULL) + { + ereport(NOTICE, (errmsg("placement for relation with oid %d does not exist, skipping", relationId))); + PG_RETURN_VOID(); + } + ShardPlacement *placement = NULL; foreach_ptr(placement, shardPlacementList) { diff --git a/src/include/distributed/metadata_cache.h b/src/include/distributed/metadata_cache.h index 4461cb1e9..d9ae0529e 100644 --- a/src/include/distributed/metadata_cache.h +++ b/src/include/distributed/metadata_cache.h @@ -211,7 +211,7 @@ extern bool HasAnyNodes(void); extern HTAB * GetWorkerNodeHash(void); extern WorkerNode * LookupNodeByNodeId(uint32 nodeId); extern WorkerNode * LookupNodeByNodeIdOrError(uint32 nodeId); -extern WorkerNode * LookupNodeForGroup(int32 groupId); +extern WorkerNode * LookupNodeForGroup(int32 groupId, bool checkExistence); /* namespace oids */ extern Oid CitusCatalogNamespaceId(void); diff --git a/src/include/distributed/metadata_sync.h b/src/include/distributed/metadata_sync.h index e357b7d13..98b0b643a 100644 --- a/src/include/distributed/metadata_sync.h +++ b/src/include/distributed/metadata_sync.h @@ -75,7 +75,7 @@ extern Oid GetAttributeTypeOid(Oid relationId, AttrNumber attnum); #define REMOVE_ALL_CLUSTERED_TABLES_ONLY_COMMAND \ "SELECT worker_drop_distributed_table_only(logicalrelid::regclass::text) FROM pg_dist_partition" #define REMOVE_ALL_CLUSTERED_TABLES_METADATA_ONLY_COMMAND \ - "SELECT worker_drop_distributed_table_metadata_only(logicalrelid) FROM pg_dist_partition" + "SELECT worker_drop_distributed_table_metadata_only(logicalrelid::oid) FROM pg_dist_partition" #define REMOVE_ALL_CLUSTERED_TABLES_COMMAND \ "SELECT worker_drop_distributed_table(logicalrelid::regclass::text) FROM pg_dist_partition" #define DISABLE_DDL_PROPAGATION "SET citus.enable_ddl_propagation TO 'off'"