diff options
author | antirez <antirez@gmail.com> | 2017-04-28 10:37:07 +0200 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2017-04-28 10:37:07 +0200 |
commit | c180bc7d98061fd59be54ca83b67abfd6ce65414 (patch) | |
tree | 3461076bc27bafd4ca5c74b40605e3d387b9375a /tests/integration/psync2-reg.tcl | |
parent | 469d6e2b37e2913ecb673f910cdb7dbd3af18a67 (diff) | |
download | redis-c180bc7d98061fd59be54ca83b67abfd6ce65414.tar.gz |
Regression test for PSYNC2 issue #3899 added.
Experimentally verified that it can trigger the issue reverting the fix.
At least on my system... Being the bug time/backlog dependant, it is
very hard to tell if this test will be able to trigger the problem
consistently, however even if it triggers the problem once in a while,
we'll see it in the CI environment at http://ci.redis.io.
Diffstat (limited to 'tests/integration/psync2-reg.tcl')
-rw-r--r-- | tests/integration/psync2-reg.tcl | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/integration/psync2-reg.tcl b/tests/integration/psync2-reg.tcl new file mode 100644 index 000000000..d41be51b8 --- /dev/null +++ b/tests/integration/psync2-reg.tcl @@ -0,0 +1,61 @@ +# Issue 3899 regression test. +# We create a chain of three instances: master -> slave -> slave2 +# and continuously break the link while traffic is generated by +# redis-benchmark. At the end we check that the data is the same +# everywhere. + +start_server {tags {"psync2"}} { +start_server {} { +start_server {} { + set start_time [clock seconds] ; # Test start time + + # Config + set debug_msg 0 ; # Enable additional debug messages + + set duration 20 ; # Total test seconds + + for {set j 0} {$j < 3} {incr j} { + set R($j) [srv [expr 0-$j] client] + set R_host($j) [srv [expr 0-$j] host] + set R_port($j) [srv [expr 0-$j] port] + if {$debug_msg} {puts "Log file: [srv [expr 0-$j] stdout]"} + } + + # Setup the replication and backlog parameters + $R(1) slaveof $R_host(0) $R_port(0) + $R(2) slaveof $R_host(0) $R_port(0) + $R(0) set foo bar + wait_for_condition 50 1000 { + [$R(1) dbsize] == 1 && [$R(2) dbsize] == 1 + } else { + fail "Slaves not replicating from master" + } + + $R(0) config set repl-backlog-size 10mb + $R(1) config set repl-backlog-size 10mb + + set cycle_start_time [clock milliseconds] + set bench_pid [exec src/redis-benchmark -p $R_port(0) -n 10000000 -r 1000 incr __rand_int__ > /dev/null &] + while 1 { + set elapsed [expr {[clock milliseconds]-$cycle_start_time}] + if {$elapsed > $duration*1000} break + if {rand() < .05} { + test "Kill first slave link with the master" { + $R(1) client kill type master + } + } + if {rand() < .05} { + test "Kill chained slave link with the master" { + $R(2) client kill type master + } + } + after 100 + } + + wait_for_condition 50 1000 { + ([$R(0) debug digest] eq [$R(1) debug digest]) && + ([$R(1) debug digest] eq [$R(2) debug digest]) + } else { + fail "The three instances have different data sets" + } +}}} |