Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
4e0c2f9c
Commit
4e0c2f9c
authored
Feb 20, 2018
by
artix
Browse files
- Fixed bug in clusterManagerGetAntiAffinityScore
- Code improvements
parent
18910013
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/redis-cli.c
View file @
4e0c2f9c
...
@@ -505,7 +505,6 @@ static int dictSdsKeyCompare(void *privdata, const void *key1,
...
@@ -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:
...
@@ -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;
*
offending
=
zcalloc
(
node_len
*
sizeof
(
clusterManagerNode
*
));
clusterManagerNode **offending_p = NULL;
clusterManagerNode
**
offending_p
=
*
offending
;
if (offending != NULL) {
*offending = zcalloc(node_len * sizeof(clusterManagerNode*));
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,
...
@@ -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
);
else {
dictReplace
(
related
,
node
->
name
,
types
);
otypes = sdsempty();
}
else
{
dictAdd(related, key, otypes);
dictEntry
*
entry
=
dictFind
(
related
,
node
->
replicate
);
if
(
entry
)
types
=
(
sds
)
dictGetVal
(
entry
);
else
{
types
=
sdsempty
();
dictAdd
(
related
,
node
->
replicate
,
types
);
}
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,
...
@@ -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,
...
@@ -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,
...
@@ -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,
...
@@ -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,
...
@@ -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,
...
@@ -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,
...
@@ -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) {
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment