-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
networking.c/writeToClient: handle WSAEWOULDBLOCK
- fixed writeToClient() after failed tests - adjusted tests to match antirez/[email protected]
- Loading branch information
1 parent
155111f
commit bdcf80e
Showing
30 changed files
with
767 additions
and
128 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
# 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 {} { | ||
# Config | ||
set debug_msg 0 ; # Enable additional debug messages | ||
|
||
set no_exit 0 ; # Do not exit at end of the test | ||
|
||
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 | ||
test "PSYNC2 #3899 regression: setup" { | ||
$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 "PSYNC2 #3899 regression: kill first slave" { | ||
$R(1) client kill type master | ||
} | ||
} | ||
if {rand() < .05} { | ||
test "PSYNC2 #3899 regression: kill chained slave" { | ||
$R(2) client kill type master | ||
} | ||
} | ||
after 100 | ||
} | ||
exec kill -9 $bench_pid | ||
|
||
if {$debug_msg} { | ||
for {set j 0} {$j < 100} {incr j} { | ||
if { | ||
[$R(0) debug digest] == [$R(1) debug digest] && | ||
[$R(1) debug digest] == [$R(2) debug digest] | ||
} break | ||
puts [$R(0) debug digest] | ||
puts [$R(1) debug digest] | ||
puts [$R(2) debug digest] | ||
after 1000 | ||
} | ||
} | ||
|
||
test "PSYNC2 #3899 regression: verify consistency" { | ||
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" | ||
} | ||
} | ||
}}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,182 @@ | ||
start_server {tags {"psync2"}} { | ||
start_server {} { | ||
start_server {} { | ||
start_server {} { | ||
start_server {} { | ||
set master_id 0 ; # Current master | ||
set start_time [clock seconds] ; # Test start time | ||
set counter_value 0 ; # Current value of the Redis counter "x" | ||
|
||
# Config | ||
set debug_msg 0 ; # Enable additional debug messages | ||
|
||
set no_exit 0; ; # Do not exit at end of the test | ||
|
||
set duration 20 ; # Total test seconds | ||
|
||
set genload 1 ; # Load master with writes at every cycle | ||
|
||
set genload_time 5000 ; # Writes duration time in ms | ||
|
||
set disconnect 1 ; # Break replication link between random | ||
# master and slave instances while the | ||
# master is loaded with writes. | ||
|
||
set disconnect_period 1000 ; # Disconnect repl link every N ms. | ||
|
||
for {set j 0} {$j < 5} {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]"} | ||
} | ||
|
||
set cycle 1 | ||
while {([clock seconds]-$start_time) < $duration} { | ||
test "PSYNC2: --- CYCLE $cycle ---" { | ||
incr cycle | ||
} | ||
|
||
# Create a random replication layout. | ||
# Start with switching master (this simulates a failover). | ||
|
||
# 1) Select the new master. | ||
set master_id [randomInt 5] | ||
set used [list $master_id] | ||
test "PSYNC2: \[NEW LAYOUT\] Set #$master_id as master" { | ||
$R($master_id) slaveof no one | ||
if {$counter_value == 0} { | ||
$R($master_id) set x $counter_value | ||
} | ||
} | ||
|
||
# 2) Attach all the slaves to a random instance | ||
while {[llength $used] != 5} { | ||
while 1 { | ||
set slave_id [randomInt 5] | ||
if {[lsearch -exact $used $slave_id] == -1} break | ||
} | ||
set rand [randomInt [llength $used]] | ||
set mid [lindex $used $rand] | ||
set master_host $R_host($mid) | ||
set master_port $R_port($mid) | ||
|
||
test "PSYNC2: Set #$slave_id to replicate from #$mid" { | ||
$R($slave_id) slaveof $master_host $master_port | ||
} | ||
lappend used $slave_id | ||
} | ||
|
||
# 3) Increment the counter and wait for all the instances | ||
# to converge. | ||
test "PSYNC2: cluster is consistent after failover" { | ||
$R($master_id) incr x; incr counter_value | ||
for {set j 0} {$j < 5} {incr j} { | ||
wait_for_condition 50 1000 { | ||
[$R($j) get x] == $counter_value | ||
} else { | ||
fail "Instance #$j x variable is inconsistent" | ||
} | ||
} | ||
} | ||
|
||
# 4) Generate load while breaking the connection of random | ||
# slave-master pairs. | ||
test "PSYNC2: generate load while killing replication links" { | ||
set t [clock milliseconds] | ||
set next_break [expr {$t+$disconnect_period}] | ||
while {[clock milliseconds]-$t < $genload_time} { | ||
if {$genload} { | ||
$R($master_id) incr x; incr counter_value | ||
} | ||
if {[clock milliseconds] == $next_break} { | ||
set next_break \ | ||
[expr {[clock milliseconds]+$disconnect_period}] | ||
set slave_id [randomInt 5] | ||
if {$disconnect} { | ||
$R($slave_id) client kill type master | ||
if {$debug_msg} { | ||
puts "+++ Breaking link for slave #$slave_id" | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
# 5) Increment the counter and wait for all the instances | ||
set x [$R($master_id) get x] | ||
test "PSYNC2: cluster is consistent after load (x = $x)" { | ||
for {set j 0} {$j < 5} {incr j} { | ||
wait_for_condition 50 1000 { | ||
[$R($j) get x] == $counter_value | ||
} else { | ||
fail "Instance #$j x variable is inconsistent" | ||
} | ||
} | ||
} | ||
|
||
# Put down the old master so that it cannot generate more | ||
# replication stream, this way in the next master switch, the time at | ||
# which we move slaves away is not important, each will have full | ||
# history (otherwise PINGs will make certain slaves have more history), | ||
# and sometimes a full resync will be needed. | ||
$R($master_id) slaveof 127.0.0.1 0 ;# We use port zero to make it fail. | ||
|
||
if {$debug_msg} { | ||
for {set j 0} {$j < 5} {incr j} { | ||
puts "$j: sync_full: [status $R($j) sync_full]" | ||
puts "$j: id1 : [status $R($j) master_replid]:[status $R($j) master_repl_offset]" | ||
puts "$j: id2 : [status $R($j) master_replid2]:[status $R($j) second_repl_offset]" | ||
puts "$j: backlog : firstbyte=[status $R($j) repl_backlog_first_byte_offset] len=[status $R($j) repl_backlog_histlen]" | ||
puts "---" | ||
} | ||
} | ||
|
||
test "PSYNC2: total sum of full synchronizations is exactly 4" { | ||
set sum 0 | ||
for {set j 0} {$j < 5} {incr j} { | ||
incr sum [status $R($j) sync_full] | ||
} | ||
assert {$sum == 4} | ||
} | ||
} | ||
|
||
test "PSYNC2: Bring the master back again for next test" { | ||
$R($master_id) slaveof no one | ||
set master_host $R_host($master_id) | ||
set master_port $R_port($master_id) | ||
for {set j 0} {$j < 5} {incr j} { | ||
if {$j == $master_id} continue | ||
$R($j) slaveof $master_host $master_port | ||
} | ||
|
||
# Wait for slaves to sync | ||
wait_for_condition 50 1000 { | ||
[status $R($master_id) connected_slaves] == 4 | ||
} else { | ||
fail "Slave not reconnecting" | ||
} | ||
} | ||
|
||
test "PSYNC2: Partial resync after restart using RDB aux fields" { | ||
# Pick a random slave | ||
set slave_id [expr {($master_id+1)%5}] | ||
set sync_count [status $R($master_id) sync_full] | ||
catch { | ||
$R($slave_id) config rewrite | ||
$R($slave_id) debug restart | ||
} | ||
wait_for_condition 50 1000 { | ||
[status $R($master_id) connected_slaves] == 4 | ||
} else { | ||
fail "Slave not reconnecting" | ||
} | ||
set new_sync_count [status $R($master_id) sync_full] | ||
assert {$sync_count == $new_sync_count} | ||
} | ||
|
||
if {$no_exit} { | ||
while 1 { puts -nonewline .; flush stdout; after 1000} | ||
} | ||
|
||
}}}}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.