From a3578a6e60b845fb35c63537eec3a314fb9225ff Mon Sep 17 00:00:00 2001 From: Hadi Moshayedi Date: Wed, 21 Aug 2019 12:59:57 -0700 Subject: [PATCH] Sort load_shard_placement_array by worker name/port --- .../distributed/test/distribution_metadata.c | 36 ++++++++++++++++++- .../expected/multi_distribution_metadata.out | 4 +-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/backend/distributed/test/distribution_metadata.c b/src/backend/distributed/test/distribution_metadata.c index 4b959a435..8df36d56f 100644 --- a/src/backend/distributed/test/distribution_metadata.c +++ b/src/backend/distributed/test/distribution_metadata.c @@ -40,6 +40,11 @@ #include "utils/palloc.h" +/* forward declaration of local functions */ +static int CompareShardPlacementsByWorker(const void *leftElement, + const void *rightElement); + + /* declarations for dynamic loading */ PG_FUNCTION_INFO_V1(load_shard_id_array); PG_FUNCTION_INFO_V1(load_shard_interval_array); @@ -143,7 +148,7 @@ load_shard_placement_array(PG_FUNCTION_ARGS) placementList = ShardPlacementList(shardId); } - placementList = SortList(placementList, CompareShardPlacements); + placementList = SortList(placementList, CompareShardPlacementsByWorker); placementCount = list_length(placementList); placementDatumArray = palloc0(placementCount * sizeof(Datum)); @@ -166,6 +171,35 @@ load_shard_placement_array(PG_FUNCTION_ARGS) } +/* + * CompareShardPlacementsByWorker compares two shard placements by their + * worker node name and port. + */ +static int +CompareShardPlacementsByWorker(const void *leftElement, const void *rightElement) +{ + const ShardPlacement *leftPlacement = *((const ShardPlacement **) leftElement); + const ShardPlacement *rightPlacement = *((const ShardPlacement **) rightElement); + + int nodeNameCmp = strncmp(leftPlacement->nodeName, rightPlacement->nodeName, + WORKER_LENGTH); + if (nodeNameCmp != 0) + { + return nodeNameCmp; + } + else if (leftPlacement->nodePort > rightPlacement->nodePort) + { + return 1; + } + else if (leftPlacement->nodePort < rightPlacement->nodePort) + { + return -1; + } + + return 0; +} + + /* * partition_column_id simply finds a distributed table using the provided Oid * and returns the column_id of its partition column. If the specified table is diff --git a/src/test/regress/expected/multi_distribution_metadata.out b/src/test/regress/expected/multi_distribution_metadata.out index ca7f8bb58..1d5e4f849 100644 --- a/src/test/regress/expected/multi_distribution_metadata.out +++ b/src/test/regress/expected/multi_distribution_metadata.out @@ -109,7 +109,7 @@ ERROR: could not find valid entry for shard 540005 SELECT load_shard_placement_array(540001, false); load_shard_placement_array ----------------------------------- - {localhost:57638,localhost:57637} + {localhost:57637,localhost:57638} (1 row) -- only one of which is finalized @@ -123,7 +123,7 @@ SELECT load_shard_placement_array(540001, true); SELECT load_shard_placement_array(540001, false); load_shard_placement_array ----------------------------------- - {localhost:57638,localhost:57637} + {localhost:57637,localhost:57638} (1 row) -- should see column id of 'name'