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