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
02e38516
Unverified
Commit
02e38516
authored
Jul 03, 2018
by
Salvatore Sanfilippo
Committed by
GitHub
Jul 03, 2018
Browse files
Merge pull request #5081 from trevor211/fixClusterFailover
cluster failover bug
parents
2edcafb3
2e167f7d
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/replication.c
View file @
02e38516
...
@@ -1087,6 +1087,7 @@ void replicationCreateMasterClient(int fd, int dbid) {
...
@@ -1087,6 +1087,7 @@ void replicationCreateMasterClient(int fd, int dbid) {
if
(
server
.
master
->
reploff
==
-
1
)
if
(
server
.
master
->
reploff
==
-
1
)
server
.
master
->
flags
|=
CLIENT_PRE_PSYNC
;
server
.
master
->
flags
|=
CLIENT_PRE_PSYNC
;
if
(
dbid
!=
-
1
)
selectDb
(
server
.
master
,
dbid
);
if
(
dbid
!=
-
1
)
selectDb
(
server
.
master
,
dbid
);
server
.
repl_down_since
=
0
;
}
}
void
restartAOF
()
{
void
restartAOF
()
{
...
@@ -1950,7 +1951,6 @@ void replicationSetMaster(char *ip, int port) {
...
@@ -1950,7 +1951,6 @@ void replicationSetMaster(char *ip, int port) {
* our own parameters, to later PSYNC with the new master. */
* our own parameters, to later PSYNC with the new master. */
if
(
was_master
)
replicationCacheMasterUsingMyself
();
if
(
was_master
)
replicationCacheMasterUsingMyself
();
server
.
repl_state
=
REPL_STATE_CONNECT
;
server
.
repl_state
=
REPL_STATE_CONNECT
;
server
.
repl_down_since
=
0
;
}
}
/* Cancel replication, setting the instance as a master itself. */
/* Cancel replication, setting the instance as a master itself. */
...
...
tests/cluster/tests/05-slave-selection.tcl
View file @
02e38516
...
@@ -92,3 +92,80 @@ test "Node #10 should eventually replicate node #5" {
...
@@ -92,3 +92,80 @@ test "Node #10 should eventually replicate node #5" {
fail
"#10 didn't became slave of #5"
fail
"#10 didn't became slave of #5"
}
}
}
}
source
"../tests/includes/init-tests.tcl"
# Create a cluster with 3 master and 15 slaves, so that we have 5
# slaves for eatch master.
test
"Create a 3 nodes cluster"
{
create_cluster 3 15
}
test
"Cluster is up"
{
assert_cluster_state ok
}
test
"The first master has actually 5 slaves"
{
assert
{[
llength
[
lindex
[
R 0 role
]
2
]]
== 5
}
}
test
{
Slaves of #0 are instance #3, #6, #9, #12 and #15 as expected
}
{
set port0
[
get_instance_attrib redis 0 port
]
assert
{[
lindex
[
R 3 role
]
2
]
== $port0
}
assert
{[
lindex
[
R 6 role
]
2
]
== $port0
}
assert
{[
lindex
[
R 9 role
]
2
]
== $port0
}
assert
{[
lindex
[
R 12 role
]
2
]
== $port0
}
assert
{[
lindex
[
R 15 role
]
2
]
== $port0
}
}
test
{
Instance #3, #6, #9, #12 and #15 synced with the master
}
{
wait_for_condition 1000 50
{
[
RI 3 master_link_status
]
eq
{
up
}
&&
[
RI 6 master_link_status
]
eq
{
up
}
&&
[
RI 9 master_link_status
]
eq
{
up
}
&&
[
RI 12 master_link_status
]
eq
{
up
}
&&
[
RI 15 master_link_status
]
eq
{
up
}
}
else
{
fail
"Instance #3 or #6 or #9 or #12 or #15 master link status is not up"
}
}
proc master_detected
{
instances
}
{
foreach instance
[
dict keys $instances
]
{
if
{[
RI $instance role
]
eq
{
master
}}
{
return true
}
}
return false
}
test
"New Master down consecutively"
{
set instances
[
dict create 0 1 3 1 6 1 9 1 12 1 15 1
]
set loops
[
expr
{[
dict size $instances
]
-1
}]
for
{
set i 0
}
{
$i
< $loops
}
{
incr i
}
{
set master_id -1
foreach instance
[
dict keys $instances
]
{
if
{[
RI $instance role
]
eq
{
master
}}
{
set master_id $instance
break
;
}
}
if
{
$master
_id eq -1
}
{
fail
"no master detected, #loop
$i
"
}
set instances
[
dict remove $instances $master_id
]
kill_instance redis $master_id
wait_for_condition 1000 50
{
[
master_detected $instances
]
}
else
{
failover
"No failover detected when master
$master
_id fails"
}
assert_cluster_state ok
}
}
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