diff --git a/src/backend/distributed/operations/worker_node_manager.c b/src/backend/distributed/operations/worker_node_manager.c index 76f2732ba..811f22731 100644 --- a/src/backend/distributed/operations/worker_node_manager.c +++ b/src/backend/distributed/operations/worker_node_manager.c @@ -108,7 +108,7 @@ ActiveReadableNodeCount(void) * NodeIsCoordinator returns true if the given node represents the coordinator. */ bool -NodeIsCoordinator(WorkerNode *node) +NodeIsCoordinator(const WorkerNode *node) { return node->groupId == COORDINATOR_GROUP_ID; } @@ -352,6 +352,9 @@ CompareWorkerNodes(const void *leftElement, const void *rightElement) * WorkerNodeCompare compares two worker nodes by their host name and port * number. Two nodes that only differ by their rack locations are considered to * be equal to each other. + * + * This function also makes sure that coordinator nodes are always considered + * lexicographically smaller than other worker nodes. */ int WorkerNodeCompare(const void *lhsKey, const void *rhsKey, Size keySize) @@ -359,6 +362,15 @@ WorkerNodeCompare(const void *lhsKey, const void *rhsKey, Size keySize) const WorkerNode *workerLhs = (const WorkerNode *) lhsKey; const WorkerNode *workerRhs = (const WorkerNode *) rhsKey; + if (NodeIsCoordinator(workerLhs)) + { + return -1; + } + if (NodeIsCoordinator(workerRhs)) + { + return 1; + } + return NodeNamePortCompare(workerLhs->workerName, workerRhs->workerName, workerLhs->workerPort, workerRhs->workerPort); } diff --git a/src/include/distributed/worker_manager.h b/src/include/distributed/worker_manager.h index 5ad7f4962..4d4c36ca2 100644 --- a/src/include/distributed/worker_manager.h +++ b/src/include/distributed/worker_manager.h @@ -95,7 +95,7 @@ extern bool NodeIsPrimaryAndRemote(WorkerNode *worker); extern bool NodeIsPrimary(WorkerNode *worker); extern bool NodeIsSecondary(WorkerNode *worker); extern bool NodeIsReadable(WorkerNode *worker); -extern bool NodeIsCoordinator(WorkerNode *node); +extern bool NodeIsCoordinator(const WorkerNode *node); extern WorkerNode * SetWorkerColumn(WorkerNode *workerNode, int columnIndex, Datum value); extern WorkerNode * SetWorkerColumnOptional(WorkerNode *workerNode, int columnIndex, Datum value);