
Previously (and by default after commit) when master loose its last slot (due to migration, for example), its replicas will migrate to new last slot holder. There are cases where this is not desired: * Consolidation that results with removed nodes (including the replica, eventually). * Manually configured cluster topologies, which the admin wishes to preserve. Needlessly migrating a replica triggers a full synchronization and can have a negative impact, so we prefer to be able to avoid it where possible. This commit adds 'cluster-allow-replica-migration' configuration option that is enabled by default to preserve existed behavior. When disabled, replicas will not be auto-migrated. Fixes #4896 Co-authored-by: Oran Agra <oran@redislabs.com>
72 lines
2.0 KiB
Tcl
72 lines
2.0 KiB
Tcl
# Replica migration test #2.
|
|
#
|
|
# Check that if 'cluster-allow-replica-migration' is set to 'no', slaves do not
|
|
# migrate when master becomes empty.
|
|
|
|
source "../tests/includes/init-tests.tcl"
|
|
|
|
# Create a cluster with 5 master and 15 slaves, to make sure there are no
|
|
# empty masters and make rebalancing simpler to handle during the test.
|
|
test "Create a 5 nodes cluster" {
|
|
create_cluster 5 15
|
|
}
|
|
|
|
test "Cluster is up" {
|
|
assert_cluster_state ok
|
|
}
|
|
|
|
test "Each master should have at least two replicas attached" {
|
|
foreach_redis_id id {
|
|
if {$id < 5} {
|
|
wait_for_condition 1000 50 {
|
|
[llength [lindex [R 0 role] 2]] >= 2
|
|
} else {
|
|
fail "Master #$id does not have 2 slaves as expected"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
test "Set allow-replica-migration no" {
|
|
foreach_redis_id id {
|
|
R $id CONFIG SET cluster-allow-replica-migration no
|
|
}
|
|
}
|
|
|
|
set master0_id [dict get [get_myself 0] id]
|
|
test "Resharding all the master #0 slots away from it" {
|
|
set output [exec \
|
|
../../../src/redis-cli --cluster rebalance \
|
|
127.0.0.1:[get_instance_attrib redis 0 port] \
|
|
{*}[rediscli_tls_config "../../../tests"] \
|
|
--cluster-weight ${master0_id}=0 >@ stdout ]
|
|
}
|
|
|
|
test "Wait cluster to be stable" {
|
|
wait_for_condition 1000 50 {
|
|
[catch {exec ../../../src/redis-cli --cluster \
|
|
check 127.0.0.1:[get_instance_attrib redis 0 port] \
|
|
{*}[rediscli_tls_config "../../../tests"] \
|
|
}] == 0
|
|
} else {
|
|
fail "Cluster doesn't stabilize"
|
|
}
|
|
}
|
|
|
|
test "Master #0 stil should have its replicas" {
|
|
assert { [llength [lindex [R 0 role] 2]] >= 2 }
|
|
}
|
|
|
|
test "Each master should have at least two replicas attached" {
|
|
foreach_redis_id id {
|
|
if {$id < 5} {
|
|
wait_for_condition 1000 50 {
|
|
[llength [lindex [R 0 role] 2]] >= 2
|
|
} else {
|
|
fail "Master #$id does not have 2 slaves as expected"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|