mirror of
https://github.com/fluencelabs/redis
synced 2025-03-25 20:01:04 +00:00
- Fixed bug in clusterManagerGetAntiAffinityScore
- Code improvements
This commit is contained in:
parent
605d7262e6
commit
87f5a7c0b4
@ -505,7 +505,6 @@ static int dictSdsKeyCompare(void *privdata, const void *key1,
|
|||||||
static void dictSdsDestructor(void *privdata, void *val)
|
static void dictSdsDestructor(void *privdata, void *val)
|
||||||
{
|
{
|
||||||
DICT_NOTUSED(privdata);
|
DICT_NOTUSED(privdata);
|
||||||
|
|
||||||
sdsfree(val);
|
sdsfree(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2008,11 +2007,13 @@ result:
|
|||||||
static int clusterManagerGetAntiAffinityScore(clusterManagerNodeArray *ipnodes,
|
static int clusterManagerGetAntiAffinityScore(clusterManagerNodeArray *ipnodes,
|
||||||
int ip_len, clusterManagerNode ***offending, int *offending_len)
|
int ip_len, clusterManagerNode ***offending, int *offending_len)
|
||||||
{
|
{
|
||||||
assert(offending != NULL);
|
|
||||||
int score = 0, i, j;
|
int score = 0, i, j;
|
||||||
int node_len = cluster_manager.nodes->len;
|
int node_len = cluster_manager.nodes->len;
|
||||||
|
clusterManagerNode **offending_p = NULL;
|
||||||
|
if (offending != NULL) {
|
||||||
*offending = zcalloc(node_len * sizeof(clusterManagerNode*));
|
*offending = zcalloc(node_len * sizeof(clusterManagerNode*));
|
||||||
clusterManagerNode **offending_p = *offending;
|
offending_p = *offending;
|
||||||
|
}
|
||||||
for (i = 0; i < ip_len; i++) {
|
for (i = 0; i < ip_len; i++) {
|
||||||
clusterManagerNodeArray *node_array = &(ipnodes[i]);
|
clusterManagerNodeArray *node_array = &(ipnodes[i]);
|
||||||
dict *related = dictCreate(&clusterManagerDictType, NULL);
|
dict *related = dictCreate(&clusterManagerDictType, NULL);
|
||||||
@ -2021,23 +2022,21 @@ static int clusterManagerGetAntiAffinityScore(clusterManagerNodeArray *ipnodes,
|
|||||||
clusterManagerNode *node = node_array->nodes[j];
|
clusterManagerNode *node = node_array->nodes[j];
|
||||||
if (node == NULL) continue;
|
if (node == NULL) continue;
|
||||||
if (!ip) ip = node->ip;
|
if (!ip) ip = node->ip;
|
||||||
sds types;
|
sds types, otypes;
|
||||||
if (!node->replicate) {
|
// We always use the Master ID as key
|
||||||
assert(node->name != NULL);
|
sds key = (!node->replicate ? node->name : node->replicate);
|
||||||
dictEntry *entry = dictFind(related, node->name);
|
assert(key != NULL);
|
||||||
if (entry) types = (sds) dictGetVal(entry);
|
dictEntry *entry = dictFind(related, key);
|
||||||
else types = sdsempty();
|
if (entry) otypes = (sds) dictGetVal(entry);
|
||||||
types = sdscatprintf(types, "m%s", types);
|
|
||||||
dictReplace(related, node->name, types);
|
|
||||||
} else {
|
|
||||||
dictEntry *entry = dictFind(related, node->replicate);
|
|
||||||
if (entry) types = (sds) dictGetVal(entry);
|
|
||||||
else {
|
else {
|
||||||
types = sdsempty();
|
otypes = sdsempty();
|
||||||
dictAdd(related, node->replicate, types);
|
dictAdd(related, key, otypes);
|
||||||
}
|
|
||||||
sdscat(types, "s");
|
|
||||||
}
|
}
|
||||||
|
// Master type 'm' is always set as the first character of the
|
||||||
|
// types string.
|
||||||
|
if (!node->replicate) types = sdscatprintf(otypes, "m%s", otypes);
|
||||||
|
else types = sdscat(otypes, "s");
|
||||||
|
if (types != otypes) dictReplace(related, key, types);
|
||||||
}
|
}
|
||||||
dictIterator *iter = dictGetIterator(related);
|
dictIterator *iter = dictGetIterator(related);
|
||||||
dictEntry *entry;
|
dictEntry *entry;
|
||||||
@ -2048,6 +2047,7 @@ static int clusterManagerGetAntiAffinityScore(clusterManagerNodeArray *ipnodes,
|
|||||||
if (typeslen < 2) continue;
|
if (typeslen < 2) continue;
|
||||||
if (types[0] == 'm') score += (10000 * (typeslen - 1));
|
if (types[0] == 'm') score += (10000 * (typeslen - 1));
|
||||||
else score += (1 * typeslen);
|
else score += (1 * typeslen);
|
||||||
|
if (offending == NULL) continue;
|
||||||
listIter li;
|
listIter li;
|
||||||
listNode *ln;
|
listNode *ln;
|
||||||
listRewind(cluster_manager.nodes, &li);
|
listRewind(cluster_manager.nodes, &li);
|
||||||
@ -2056,11 +2056,12 @@ static int clusterManagerGetAntiAffinityScore(clusterManagerNodeArray *ipnodes,
|
|||||||
if (n->replicate == NULL) continue;
|
if (n->replicate == NULL) continue;
|
||||||
if (!strcmp(n->replicate, name) && !strcmp(n->ip, ip)) {
|
if (!strcmp(n->replicate, name) && !strcmp(n->ip, ip)) {
|
||||||
*(offending_p++) = n;
|
*(offending_p++) = n;
|
||||||
|
if (offending_len != NULL) (*offending_len)++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (offending_len != NULL) *offending_len = offending_p - *offending;
|
//if (offending_len != NULL) *offending_len = offending_p - *offending;
|
||||||
dictReleaseIterator(iter);
|
dictReleaseIterator(iter);
|
||||||
dictRelease(related);
|
dictRelease(related);
|
||||||
}
|
}
|
||||||
@ -2070,8 +2071,8 @@ static int clusterManagerGetAntiAffinityScore(clusterManagerNodeArray *ipnodes,
|
|||||||
static void clusterManagerOptimizeAntiAffinity(clusterManagerNodeArray *ipnodes,
|
static void clusterManagerOptimizeAntiAffinity(clusterManagerNodeArray *ipnodes,
|
||||||
int ip_len)
|
int ip_len)
|
||||||
{
|
{
|
||||||
clusterManagerNode **offenders = NULL, **aux;
|
clusterManagerNode **offenders = NULL;
|
||||||
int score = clusterManagerGetAntiAffinityScore(ipnodes, ip_len, &aux, NULL);
|
int score = clusterManagerGetAntiAffinityScore(ipnodes, ip_len, NULL, NULL);
|
||||||
if (score == 0) goto cleanup;
|
if (score == 0) goto cleanup;
|
||||||
clusterManagerLogInfo(">>> Trying to optimize slaves allocation "
|
clusterManagerLogInfo(">>> Trying to optimize slaves allocation "
|
||||||
"for anti-affinity\n");
|
"for anti-affinity\n");
|
||||||
@ -2088,7 +2089,8 @@ static void clusterManagerOptimizeAntiAffinity(clusterManagerNodeArray *ipnodes,
|
|||||||
&offending_len);
|
&offending_len);
|
||||||
if (score == 0) break;
|
if (score == 0) break;
|
||||||
int rand_idx = rand() % offending_len;
|
int rand_idx = rand() % offending_len;
|
||||||
clusterManagerNode *first = offenders[rand_idx], *second;
|
clusterManagerNode *first = offenders[rand_idx],
|
||||||
|
*second = NULL;
|
||||||
clusterManagerNode **other_replicas = zcalloc((node_len - 1) *
|
clusterManagerNode **other_replicas = zcalloc((node_len - 1) *
|
||||||
sizeof(*other_replicas));
|
sizeof(*other_replicas));
|
||||||
int other_replicas_count = 0;
|
int other_replicas_count = 0;
|
||||||
@ -2110,9 +2112,8 @@ static void clusterManagerOptimizeAntiAffinity(clusterManagerNodeArray *ipnodes,
|
|||||||
*second_master = second->replicate;
|
*second_master = second->replicate;
|
||||||
first->replicate = second_master, first->dirty = 1;
|
first->replicate = second_master, first->dirty = 1;
|
||||||
second->replicate = first_master, second->dirty = 1;
|
second->replicate = first_master, second->dirty = 1;
|
||||||
zfree(aux), aux = NULL;
|
|
||||||
int new_score = clusterManagerGetAntiAffinityScore(ipnodes, ip_len,
|
int new_score = clusterManagerGetAntiAffinityScore(ipnodes, ip_len,
|
||||||
&aux, NULL);
|
NULL, NULL);
|
||||||
if (new_score > score) {
|
if (new_score > score) {
|
||||||
first->replicate = first_master;
|
first->replicate = first_master;
|
||||||
second->replicate = second_master;
|
second->replicate = second_master;
|
||||||
@ -2120,8 +2121,7 @@ static void clusterManagerOptimizeAntiAffinity(clusterManagerNodeArray *ipnodes,
|
|||||||
zfree(other_replicas);
|
zfree(other_replicas);
|
||||||
maxiter--;
|
maxiter--;
|
||||||
}
|
}
|
||||||
zfree(aux), aux = NULL;
|
score = clusterManagerGetAntiAffinityScore(ipnodes, ip_len, NULL, NULL);
|
||||||
score = clusterManagerGetAntiAffinityScore(ipnodes, ip_len, &aux, NULL);
|
|
||||||
char *msg;
|
char *msg;
|
||||||
int perfect = (score == 0);
|
int perfect = (score == 0);
|
||||||
int log_level = (perfect ? CLUSTER_MANAGER_LOG_LVL_SUCCESS :
|
int log_level = (perfect ? CLUSTER_MANAGER_LOG_LVL_SUCCESS :
|
||||||
@ -2134,7 +2134,6 @@ static void clusterManagerOptimizeAntiAffinity(clusterManagerNodeArray *ipnodes,
|
|||||||
clusterManagerLog(log_level, "%s\n", msg);
|
clusterManagerLog(log_level, "%s\n", msg);
|
||||||
cleanup:
|
cleanup:
|
||||||
zfree(offenders);
|
zfree(offenders);
|
||||||
zfree(aux);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static sds clusterManagerNodeSlotsString(clusterManagerNode *node) {
|
static sds clusterManagerNodeSlotsString(clusterManagerNode *node) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user