mirror of https://github.com/citusdata/citus.git
Merge pull request #2904 from citusdata/sort_load_shard_placement_array
Sort load_shard_placement_array by worker name/portpull/2864/head
commit
3de851d3c5
|
@ -40,6 +40,11 @@
|
||||||
#include "utils/palloc.h"
|
#include "utils/palloc.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* forward declaration of local functions */
|
||||||
|
static int CompareShardPlacementsByWorker(const void *leftElement,
|
||||||
|
const void *rightElement);
|
||||||
|
|
||||||
|
|
||||||
/* declarations for dynamic loading */
|
/* declarations for dynamic loading */
|
||||||
PG_FUNCTION_INFO_V1(load_shard_id_array);
|
PG_FUNCTION_INFO_V1(load_shard_id_array);
|
||||||
PG_FUNCTION_INFO_V1(load_shard_interval_array);
|
PG_FUNCTION_INFO_V1(load_shard_interval_array);
|
||||||
|
@ -143,7 +148,7 @@ load_shard_placement_array(PG_FUNCTION_ARGS)
|
||||||
placementList = ShardPlacementList(shardId);
|
placementList = ShardPlacementList(shardId);
|
||||||
}
|
}
|
||||||
|
|
||||||
placementList = SortList(placementList, CompareShardPlacements);
|
placementList = SortList(placementList, CompareShardPlacementsByWorker);
|
||||||
|
|
||||||
placementCount = list_length(placementList);
|
placementCount = list_length(placementList);
|
||||||
placementDatumArray = palloc0(placementCount * sizeof(Datum));
|
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
|
* 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
|
* and returns the column_id of its partition column. If the specified table is
|
||||||
|
|
|
@ -109,7 +109,7 @@ ERROR: could not find valid entry for shard 540005
|
||||||
SELECT load_shard_placement_array(540001, false);
|
SELECT load_shard_placement_array(540001, false);
|
||||||
load_shard_placement_array
|
load_shard_placement_array
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
{localhost:57638,localhost:57637}
|
{localhost:57637,localhost:57638}
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- only one of which is finalized
|
-- only one of which is finalized
|
||||||
|
@ -123,7 +123,7 @@ SELECT load_shard_placement_array(540001, true);
|
||||||
SELECT load_shard_placement_array(540001, false);
|
SELECT load_shard_placement_array(540001, false);
|
||||||
load_shard_placement_array
|
load_shard_placement_array
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
{localhost:57638,localhost:57637}
|
{localhost:57637,localhost:57638}
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- should see column id of 'name'
|
-- should see column id of 'name'
|
||||||
|
|
Loading…
Reference in New Issue