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
10start_server {tags {"repl"}} {
11    start_server {} {
12
13        set master [srv -1 client]
14        set master_host [srv -1 host]
15        set master_port [srv -1 port]
16        set slave [srv 0 client]
17
18        set load_handle0 [start_bg_complex_data $master_host $master_port 9 100000]
19        set load_handle1 [start_bg_complex_data $master_host $master_port 11 100000]
20        set load_handle2 [start_bg_complex_data $master_host $master_port 12 100000]
21
22        test {First server should have role slave after SLAVEOF} {
23            $slave slaveof $master_host $master_port
24            after 1000
25            s 0 role
26        } {slave}
27
28        test {Test replication with parallel clients writing in differnet DBs} {
29            after 5000
30            stop_bg_complex_data $load_handle0
31            stop_bg_complex_data $load_handle1
32            stop_bg_complex_data $load_handle2
33            set retry 10
34            while {$retry && ([$master debug digest] ne [$slave debug digest])}\
35            {
36                after 1000
37                incr retry -1
38            }
39            assert {[$master dbsize] > 0}
40
41            if {[$master debug digest] ne [$slave debug digest]} {
42                set csv1 [csvdump r]
43                set csv2 [csvdump {r -1}]
44                set fd [open /tmp/repldump1.txt w]
45                puts -nonewline $fd $csv1
46                close $fd
47                set fd [open /tmp/repldump2.txt w]
48                puts -nonewline $fd $csv2
49                close $fd
50                puts "Master - Slave inconsistency"
51                puts "Run diff -u against /tmp/repldump*.txt for more info"
52            }
53            assert_equal [r debug digest] [r -1 debug digest]
54        }
55    }
56}
57
58start_server {tags {"repl"}} {
59    start_server {} {
60        set master [srv -1 client]
61        set master_host [srv -1 host]
62        set master_port [srv -1 port]
63        set slave [srv 0 client]
64
65        test {First server should have role slave after SLAVEOF} {
66            $slave slaveof $master_host $master_port
67            wait_for_condition 50 100 {
68                [s 0 master_link_status] eq {up}
69            } else {
70                fail "Replication not started."
71            }
72        }
73
74        test {With min-slaves-to-write (1,3): master should be writable} {
75            $master config set min-slaves-max-lag 3
76            $master config set min-slaves-to-write 1
77            $master set foo bar
78        } {OK}
79
80        test {With min-slaves-to-write (2,3): master should not be writable} {
81            $master config set min-slaves-max-lag 3
82            $master config set min-slaves-to-write 2
83            catch {$master set foo bar} e
84            set e
85        } {NOREPLICAS*}
86
87        test {With min-slaves-to-write: master not writable with lagged slave} {
88            $master config set min-slaves-max-lag 2
89            $master config set min-slaves-to-write 1
90            assert {[$master set foo bar] eq {OK}}
91            $slave deferred 1
92            $slave debug sleep 6
93            after 4000
94            catch {$master set foo bar} e
95            set e
96        } {NOREPLICAS*}
97    }
98}
99
100start_server {tags {"repl"}} {
101    start_server {} {
102        set master [srv -1 client]
103        set master_host [srv -1 host]
104        set master_port [srv -1 port]
105        set slave [srv 0 client]
106
107        test {First server should have role slave after SLAVEOF} {
108            $slave slaveof $master_host $master_port
109            wait_for_condition 50 100 {
110                [s 0 role] eq {slave}
111            } else {
112                fail "Replication not started."
113            }
114        }
115
116        test {Replication: commands with many arguments (issue #1221)} {
117            # We now issue large MSET commands, that may trigger a specific
118            # class of bugs, see issue #1221.
119            for {set j 0} {$j < 100} {incr j} {
120                set cmd [list mset]
121                for {set x 0} {$x < 1000} {incr x} {
122                    lappend cmd [randomKey] [randomValue]
123                }
124                $master {*}$cmd
125            }
126
127            set retry 10
128            while {$retry && ([$master debug digest] ne [$slave debug digest])}\
129            {
130                after 1000
131                incr retry -1
132            }
133            assert {[$master dbsize] > 0}
134        }
135
136        test {Replication of SPOP command -- alsoPropagate() API} {
137            $master del myset
138            set size [expr 1+[randomInt 100]]
139            set content {}
140            for {set j 0} {$j < $size} {incr j} {
141                lappend content [randomValue]
142            }
143            $master sadd myset {*}$content
144
145            set count [randomInt 100]
146            set result [$master spop myset $count]
147
148            wait_for_condition 50 100 {
149                [$master debug digest] eq [$slave debug digest]
150            } else {
151                fail "SPOP replication inconsistency"
152            }
153        }
154    }
155}
156