Fix choose a random master node for slot assignment

This commit is contained in:
yongman 2018-11-23 16:58:55 +08:00
parent 0c12ebf6e7
commit 2961c89161

View File

@ -3505,6 +3505,34 @@ static clusterManagerNode *clusterManagerNodeWithLeastReplicas() {
return node; 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) { static int clusterManagerFixSlotsCoverage(char *all_slots) {
int i, fixed = 0; int i, fixed = 0;
list *none = NULL, *single = NULL, *multi = NULL; list *none = NULL, *single = NULL, *multi = NULL;
@ -3577,16 +3605,12 @@ static int clusterManagerFixSlotsCoverage(char *all_slots) {
"across the cluster:\n"); "across the cluster:\n");
clusterManagerPrintSlotsList(none); clusterManagerPrintSlotsList(none);
if (confirmWithYes("Fix these slots by covering with a random node?")){ if (confirmWithYes("Fix these slots by covering with a random node?")){
srand(time(NULL));
listIter li; listIter li;
listNode *ln; listNode *ln;
listRewind(none, &li); listRewind(none, &li);
while ((ln = listNext(&li)) != NULL) { while ((ln = listNext(&li)) != NULL) {
sds slot = ln->value; sds slot = ln->value;
long idx = (long) (rand() % listLength(cluster_manager.nodes)); clusterManagerNode *n = clusterManagerNodeMasterRandom();
listNode *node_n = listIndex(cluster_manager.nodes, idx);
assert(node_n != NULL);
clusterManagerNode *n = node_n->value;
clusterManagerLogInfo(">>> Covering slot %s with %s:%d\n", clusterManagerLogInfo(">>> Covering slot %s with %s:%d\n",
slot, n->ip, n->port); slot, n->ip, n->port);
/* Ensure the slot is not already assigned. */ /* Ensure the slot is not already assigned. */