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