From 414c3deac1573ae54325ca6ab629446205774d62 Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 6 Jan 2012 17:28:40 +0100 Subject: [PATCH] Regression test for the main problem causing issue #141. Minor changes/fixes/additions to the test suite itself needed to write the test. --- tests/helpers/gen_write_load.tcl | 15 +++++++ tests/integration/replication.tcl | 68 +++++++++++++++++++++++++++++++ tests/support/test.tcl | 2 +- tests/test_helper.tcl | 2 +- 4 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 tests/helpers/gen_write_load.tcl diff --git a/tests/helpers/gen_write_load.tcl b/tests/helpers/gen_write_load.tcl new file mode 100644 index 00000000..6d1a3451 --- /dev/null +++ b/tests/helpers/gen_write_load.tcl @@ -0,0 +1,15 @@ +source tests/support/redis.tcl + +proc gen_write_load {host port seconds} { + set start_time [clock seconds] + set r [redis $host $port 1] + $r select 9 + while 1 { + $r set [expr rand()] [expr rand()] + if {[clock seconds]-$start_time > $seconds} { + exit 0 + } + } +} + +gen_write_load [lindex $argv 0] [lindex $argv 1] [lindex $argv 2] diff --git a/tests/integration/replication.tcl b/tests/integration/replication.tcl index 49408ac0..e7580157 100644 --- a/tests/integration/replication.tcl +++ b/tests/integration/replication.tcl @@ -65,3 +65,71 @@ start_server {tags {"repl"}} { } {0 0} } } + +proc start_write_load {host port seconds} { + exec tclsh8.5 tests/helpers/gen_write_load.tcl $host $port $seconds & +} + +proc stop_write_load {handle} { + catch {exec /bin/kill -9 $handle} +} + +start_server {tags {"repl"}} { + set master [srv 0 client] + set master_host [srv 0 host] + set master_port [srv 0 port] + set slaves {} + set load_handle0 [start_write_load $master_host $master_port 20] + set load_handle1 [start_write_load $master_host $master_port 20] + set load_handle2 [start_write_load $master_host $master_port 20] + set load_handle3 [start_write_load $master_host $master_port 20] + set load_handle4 [start_write_load $master_host $master_port 20] + after 2000 + start_server {} { + lappend slaves [srv 0 client] + start_server {} { + lappend slaves [srv 0 client] + start_server {} { + lappend slaves [srv 0 client] + test "Connect multiple slaves at the same time (issue #141)" { + [lindex $slaves 0] slaveof $master_host $master_port + [lindex $slaves 1] slaveof $master_host $master_port + [lindex $slaves 2] slaveof $master_host $master_port + + # Wait for all the three slaves to reach the "online" state + set retry 100 + while {$retry} { + set info [r -3 info] + if {[string match {*slave0:*,online*slave1:*,online*slave2:*,online*} $info]} { + break + } else { + incr retry -1 + after 100 + } + } + if {$retry == 0} { + error "assertion:Slaves not correctly synchronized" + } + stop_write_load $load_handle0 + stop_write_load $load_handle1 + stop_write_load $load_handle2 + stop_write_load $load_handle3 + stop_write_load $load_handle4 + after 1000 + set digest [$master debug digest] + set digest0 [[lindex $slaves 0] debug digest] + set digest1 [[lindex $slaves 1] debug digest] + set digest2 [[lindex $slaves 2] debug digest] + assert {$digest ne 0000000000000000000000000000000000000000} + assert {$digest eq $digest0} + assert {$digest eq $digest1} + assert {$digest eq $digest2} + #puts [$master dbsize] + #puts [[lindex $slaves 0] dbsize] + #puts [[lindex $slaves 1] dbsize] + #puts [[lindex $slaves 2] dbsize] + } + } + } + } +} diff --git a/tests/support/test.tcl b/tests/support/test.tcl index e53d497b..f66e54b8 100644 --- a/tests/support/test.tcl +++ b/tests/support/test.tcl @@ -4,7 +4,7 @@ set ::num_failed 0 set ::tests_failed {} proc assert {condition} { - if {![uplevel 1 expr $condition]} { + if {![uplevel 1 [list expr $condition]]} { error "assertion:Expected condition '$condition' to be true ([uplevel 1 [list subst -nocommands $condition]])" } } diff --git a/tests/test_helper.tcl b/tests/test_helper.tcl index 41c3557d..13b59b92 100644 --- a/tests/test_helper.tcl +++ b/tests/test_helper.tcl @@ -115,7 +115,7 @@ proc reconnect {args} { } # re-set $srv in the servers list - set ::servers [lreplace $::servers end+$level 1 $srv] + lset ::servers end+$level $srv } proc redis_deferring_client {args} { -- 2.45.2