1proc start_bg_complex_data {host port db ops} { 2 set tclsh [info nameofexecutable] 3 exec $tclsh tests/helpers/bg_complex_data.tcl $host $port $db $ops & 4} 5 6proc stop_bg_complex_data {handle} { 7 catch {exec /bin/kill -9 $handle} 8} 9 10# Creates a master-slave pair and breaks the link continuously to force 11# partial resyncs attempts, all this while flooding the master with 12# write queries. 13# 14# You can specifiy backlog size, ttl, delay before reconnection, test duration 15# in seconds, and an additional condition to verify at the end. 16proc test_psync {descr duration backlog_size backlog_ttl delay cond} { 17 start_server {tags {"repl"}} { 18 start_server {} { 19 20 set master [srv -1 client] 21 set master_host [srv -1 host] 22 set master_port [srv -1 port] 23 set slave [srv 0 client] 24 25 $master config set repl-backlog-size $backlog_size 26 $master config set repl-backlog-ttl $backlog_ttl 27 28 set load_handle0 [start_bg_complex_data $master_host $master_port 9 100000] 29 set load_handle1 [start_bg_complex_data $master_host $master_port 11 100000] 30 set load_handle2 [start_bg_complex_data $master_host $master_port 12 100000] 31 32 test {First server should have role slave after SLAVEOF} { 33 $slave slaveof $master_host $master_port 34 wait_for_condition 50 100 { 35 [s 0 role] eq {slave} 36 } else { 37 fail "Replication not started." 38 } 39 } 40 41 test "Test replication partial resync: $descr" { 42 # Now while the clients are writing data, break the maste-slave 43 # link multiple times. 44 for {set j 0} {$j < $duration*10} {incr j} { 45 after 100 46 # catch {puts "MASTER [$master dbsize] keys, SLAVE [$slave dbsize] keys"} 47 48 if {($j % 20) == 0} { 49 catch { 50 if {$delay} { 51 $slave multi 52 $slave client kill $master_host:$master_port 53 $slave debug sleep $delay 54 $slave exec 55 } else { 56 $slave client kill $master_host:$master_port 57 } 58 } 59 } 60 } 61 stop_bg_complex_data $load_handle0 62 stop_bg_complex_data $load_handle1 63 stop_bg_complex_data $load_handle2 64 set retry 10 65 while {$retry && ([$master debug digest] ne [$slave debug digest])}\ 66 { 67 after 1000 68 incr retry -1 69 } 70 assert {[$master dbsize] > 0} 71 72 if {[$master debug digest] ne [$slave debug digest]} { 73 set csv1 [csvdump r] 74 set csv2 [csvdump {r -1}] 75 set fd [open /tmp/repldump1.txt w] 76 puts -nonewline $fd $csv1 77 close $fd 78 set fd [open /tmp/repldump2.txt w] 79 puts -nonewline $fd $csv2 80 close $fd 81 puts "Master - Slave inconsistency" 82 puts "Run diff -u against /tmp/repldump*.txt for more info" 83 } 84 assert_equal [r debug digest] [r -1 debug digest] 85 eval $cond 86 } 87 } 88 } 89} 90 91test_psync {ok psync} 6 1000000 3600 0 { 92 assert {[s -1 sync_partial_ok] > 0} 93} 94 95test_psync {no backlog} 6 100 3600 0 { 96 assert {[s -1 sync_partial_err] > 0} 97} 98 99test_psync {ok after delay} 3 100000000 3600 3 { 100 assert {[s -1 sync_partial_ok] > 0} 101} 102 103test_psync {backlog expired} 3 100000000 1 3 { 104 assert {[s -1 sync_partial_err] > 0} 105} 106