mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 09:00:51 +00:00
Merge pull request #5594 from yongman/fix-rediscli-fixcoverage
Fix choose a random master node for slot assignment
This commit is contained in:
commit
04a5189b50
@ -3505,6 +3505,34 @@ static clusterManagerNode *clusterManagerNodeWithLeastReplicas() {
|
|||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This function 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. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user