mirror of
https://github.com/fluencelabs/redis
synced 2025-03-23 11:00:50 +00:00
The test now runs in a self-contained directory. The general abstractions to run the tests in an environment where mutliple instances are executed at the same time was extrapolated into instances.tcl, that will be reused to test Redis Cluster.
127 lines
3.8 KiB
Tcl
127 lines
3.8 KiB
Tcl
# Check the basic monitoring and failover capabilities.
|
|
|
|
source "../tests/includes/init-tests.tcl"
|
|
|
|
if {$::simulate_error} {
|
|
test "This test will fail" {
|
|
fail "Simulated error"
|
|
}
|
|
}
|
|
|
|
test "Basic failover works if the master is down" {
|
|
set old_port [RI $master_id tcp_port]
|
|
set addr [S 0 SENTINEL GET-MASTER-ADDR-BY-NAME mymaster]
|
|
assert {[lindex $addr 1] == $old_port}
|
|
kill_instance redis $master_id
|
|
foreach_sentinel_id id {
|
|
wait_for_condition 1000 50 {
|
|
[lindex [S $id SENTINEL GET-MASTER-ADDR-BY-NAME mymaster] 1] != $old_port
|
|
} else {
|
|
fail "At least one Sentinel did not received failover info"
|
|
}
|
|
}
|
|
restart_instance redis $master_id
|
|
set addr [S 0 SENTINEL GET-MASTER-ADDR-BY-NAME mymaster]
|
|
set master_id [get_instance_id_by_port redis [lindex $addr 1]]
|
|
}
|
|
|
|
test "New master [join $addr {:}] role matches" {
|
|
assert {[RI $master_id role] eq {master}}
|
|
}
|
|
|
|
test "All the other slaves now point to the new master" {
|
|
foreach_redis_id id {
|
|
if {$id != $master_id && $id != 0} {
|
|
wait_for_condition 1000 50 {
|
|
[RI $id master_port] == [lindex $addr 1]
|
|
} else {
|
|
fail "Redis ID $id not configured to replicate with new master"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
test "The old master eventually gets reconfigured as a slave" {
|
|
wait_for_condition 1000 50 {
|
|
[RI 0 master_port] == [lindex $addr 1]
|
|
} else {
|
|
fail "Old master not reconfigured as slave of new master"
|
|
}
|
|
}
|
|
|
|
test "ODOWN is not possible without N (quorum) Sentinels reports" {
|
|
foreach_sentinel_id id {
|
|
S $id SENTINEL SET mymaster quorum [expr $sentinels+1]
|
|
}
|
|
set old_port [RI $master_id tcp_port]
|
|
set addr [S 0 SENTINEL GET-MASTER-ADDR-BY-NAME mymaster]
|
|
assert {[lindex $addr 1] == $old_port}
|
|
kill_instance redis $master_id
|
|
|
|
# Make sure failover did not happened.
|
|
set addr [S 0 SENTINEL GET-MASTER-ADDR-BY-NAME mymaster]
|
|
assert {[lindex $addr 1] == $old_port}
|
|
restart_instance redis $master_id
|
|
}
|
|
|
|
test "Failover is not possible without majority agreement" {
|
|
foreach_sentinel_id id {
|
|
S $id SENTINEL SET mymaster quorum $quorum
|
|
}
|
|
|
|
# Crash majority of sentinels
|
|
for {set id 0} {$id < $quorum} {incr id} {
|
|
kill_instance sentinel $id
|
|
}
|
|
|
|
# Kill the current master
|
|
kill_instance redis $master_id
|
|
|
|
# Make sure failover did not happened.
|
|
set addr [S $quorum SENTINEL GET-MASTER-ADDR-BY-NAME mymaster]
|
|
assert {[lindex $addr 1] == $old_port}
|
|
restart_instance redis $master_id
|
|
|
|
# Cleanup: restart Sentinels to monitor the master.
|
|
for {set id 0} {$id < $quorum} {incr id} {
|
|
restart_instance sentinel $id
|
|
}
|
|
}
|
|
|
|
test "Failover works if we configure for absolute agreement" {
|
|
foreach_sentinel_id id {
|
|
S $id SENTINEL SET mymaster quorum $sentinels
|
|
}
|
|
|
|
# Wait for Sentinels to monitor the master again
|
|
foreach_sentinel_id id {
|
|
wait_for_condition 1000 50 {
|
|
[dict get [S $id SENTINEL MASTER mymaster] info-refresh] < 100000
|
|
} else {
|
|
fail "At least one Sentinel is not monitoring the master"
|
|
}
|
|
}
|
|
|
|
kill_instance redis $master_id
|
|
|
|
foreach_sentinel_id id {
|
|
wait_for_condition 1000 50 {
|
|
[lindex [S $id SENTINEL GET-MASTER-ADDR-BY-NAME mymaster] 1] != $old_port
|
|
} else {
|
|
fail "At least one Sentinel did not received failover info"
|
|
}
|
|
}
|
|
restart_instance redis $master_id
|
|
set addr [S 0 SENTINEL GET-MASTER-ADDR-BY-NAME mymaster]
|
|
set master_id [get_instance_id_by_port redis [lindex $addr 1]]
|
|
|
|
# Set the min ODOWN agreement back to strict majority.
|
|
foreach_sentinel_id id {
|
|
S $id SENTINEL SET mymaster quorum $quorum
|
|
}
|
|
}
|
|
|
|
test "New master [join $addr {:}] role matches" {
|
|
assert {[RI $master_id role] eq {master}}
|
|
}
|