From e59dd41e42765e88bc481928448aac03221f5240 Mon Sep 17 00:00:00 2001 From: Harkrishn Patro Date: Mon, 8 Apr 2024 19:58:23 -0700 Subject: [PATCH] Maintain determinstic ordering of replica(s) in CLUSTER SLOTS response (#265) Sort `clusterNode.slaves` while adding a new replica to the cluster on basis of `name`. This will enable deterministic ordering of replica(s) information in `CLUSTER SLOTS` response. Before this change: ``` 127.0.0.1:6380> CLUSTER SLOTS 1) 1) (integer) 0 2) (integer) 16383 3) 1) "127.0.0.1" 2) (integer) 6379 3) "fc72609a620c62d073a31eed9ddde5104c1fa302" 4) (empty array) 4) 1) "127.0.0.1" 2) (integer) 6381 3) "fac84bbf2ffc5cfcdebc92c06b8ead9c3cba4051" 4) (empty array) 5) 1) "127.0.0.1" 2) (integer) 6380 3) "b1249d394326f1485df0b895f2fd38e141aa5056" 4) (empty array) ``` After this change: ``` 127.0.0.1:6380> CLUSTER SLOTS 1) 1) (integer) 0 2) (integer) 16383 3) 1) "127.0.0.1" 2) (integer) 6379 3) "fc72609a620c62d073a31eed9ddde5104c1fa302" 4) (empty array) 4) 1) "127.0.0.1" 2) (integer) 6380 3) "b1249d394326f1485df0b895f2fd38e141aa5056" 4) (empty array) 5) 1) "127.0.0.1" 2) (integer) 6381 3) "fac84bbf2ffc5cfcdebc92c06b8ead9c3cba4051" 4) (empty array) ``` Signed-off-by: Harkrishn Patro --- src/cluster_legacy.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/cluster_legacy.c b/src/cluster_legacy.c index 2e93eda9c..3e2850b17 100644 --- a/src/cluster_legacy.c +++ b/src/cluster_legacy.c @@ -1450,6 +1450,10 @@ int clusterNodeFailureReportsCount(clusterNode *node) { return listLength(node->fail_reports); } +static int clusterNodeNameComparator(const void *node1, const void *node2) { + return strncasecmp((*(clusterNode **)node1)->name, (*(clusterNode **)node2)->name, CLUSTER_NAMELEN); +} + int clusterNodeRemoveSlave(clusterNode *master, clusterNode *slave) { int j; @@ -1479,6 +1483,7 @@ int clusterNodeAddSlave(clusterNode *master, clusterNode *slave) { sizeof(clusterNode*)*(master->numslaves+1)); master->slaves[master->numslaves] = slave; master->numslaves++; + qsort(master->slaves, master->numslaves, sizeof(clusterNode *), clusterNodeNameComparator); master->flags |= CLUSTER_NODE_MIGRATE_TO; return C_OK; }