From 2961c891616a6d60e28aea748c3c2422cb4f90b6 Mon Sep 17 00:00:00 2001 From: yongman Date: Fri, 23 Nov 2018 16:58:55 +0800 Subject: [PATCH 1/2] Fix choose a random master node for slot assignment --- src/redis-cli.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/redis-cli.c b/src/redis-cli.c index 28c842fd..a7a4d685 100644 --- a/src/redis-cli.c +++ b/src/redis-cli.c @@ -3505,6 +3505,34 @@ static clusterManagerNode *clusterManagerNodeWithLeastReplicas() { return node; } +/* This fucntion returns a random master node, return NULL if none */ + +static clusterManagerNode *clusterManagerNodeMasterRandom() { + int master_count = 0; + int idx; + listIter li; + listNode *ln; + listRewind(cluster_manager.nodes, &li); + while ((ln = listNext(&li)) != NULL) { + clusterManagerNode *n = ln->value; + if (n->flags & CLUSTER_MANAGER_FLAG_SLAVE) continue; + master_count++; + } + + srand(time(NULL)); + idx = rand() % master_count; + listRewind(cluster_manager.nodes, &li); + while ((ln = listNext(&li)) != NULL) { + clusterManagerNode *n = ln->value; + if (n->flags & CLUSTER_MANAGER_FLAG_SLAVE) continue; + if (!idx--) { + return n; + } + } + /* Can not be reached */ + return NULL; +} + static int clusterManagerFixSlotsCoverage(char *all_slots) { int i, fixed = 0; list *none = NULL, *single = NULL, *multi = NULL; @@ -3577,16 +3605,12 @@ static int clusterManagerFixSlotsCoverage(char *all_slots) { "across the cluster:\n"); clusterManagerPrintSlotsList(none); if (confirmWithYes("Fix these slots by covering with a random node?")){ - srand(time(NULL)); listIter li; listNode *ln; listRewind(none, &li); while ((ln = listNext(&li)) != NULL) { sds slot = ln->value; - long idx = (long) (rand() % listLength(cluster_manager.nodes)); - listNode *node_n = listIndex(cluster_manager.nodes, idx); - assert(node_n != NULL); - clusterManagerNode *n = node_n->value; + clusterManagerNode *n = clusterManagerNodeMasterRandom(); clusterManagerLogInfo(">>> Covering slot %s with %s:%d\n", slot, n->ip, n->port); /* Ensure the slot is not already assigned. */ From 221dfbd322227ac35b43f0a10855b02f9095ed72 Mon Sep 17 00:00:00 2001 From: yongman Date: Fri, 23 Nov 2018 23:51:16 +0800 Subject: [PATCH 2/2] fix typo --- src/redis-cli.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/redis-cli.c b/src/redis-cli.c index a7a4d685..f307d31c 100644 --- a/src/redis-cli.c +++ b/src/redis-cli.c @@ -3505,7 +3505,7 @@ static clusterManagerNode *clusterManagerNodeWithLeastReplicas() { return node; } -/* This fucntion returns a random master node, return NULL if none */ +/* This function returns a random master node, return NULL if none */ static clusterManagerNode *clusterManagerNodeMasterRandom() { int master_count = 0;