1start_server {tags {"repl"}} {
2    start_server {} {
3        test {First server should have role slave after SLAVEOF} {
4            r -1 slaveof [srv 0 host] [srv 0 port]
5            after 1000
6            s -1 role
7        } {slave}
8
9        test {If min-slaves-to-write is honored, write is accepted} {
10            r config set min-slaves-to-write 1
11            r config set min-slaves-max-lag 10
12            r set foo 12345
13            wait_for_condition 50 100 {
14                [r -1 get foo] eq {12345}
15            } else {
16                fail "Write did not reached slave"
17            }
18        }
19
20        test {No write if min-slaves-to-write is < attached slaves} {
21            r config set min-slaves-to-write 2
22            r config set min-slaves-max-lag 10
23            catch {r set foo 12345} err
24            set err
25        } {NOREPLICAS*}
26
27        test {If min-slaves-to-write is honored, write is accepted (again)} {
28            r config set min-slaves-to-write 1
29            r config set min-slaves-max-lag 10
30            r set foo 12345
31            wait_for_condition 50 100 {
32                [r -1 get foo] eq {12345}
33            } else {
34                fail "Write did not reached slave"
35            }
36        }
37
38        test {No write if min-slaves-max-lag is > of the slave lag} {
39            r -1 deferred 1
40            r config set min-slaves-to-write 1
41            r config set min-slaves-max-lag 2
42            r -1 debug sleep 6
43            assert {[r set foo 12345] eq {OK}}
44            after 4000
45            catch {r set foo 12345} err
46            assert {[r -1 read] eq {OK}}
47            r -1 deferred 0
48            set err
49        } {NOREPLICAS*}
50
51        test {min-slaves-to-write is ignored by slaves} {
52            r config set min-slaves-to-write 1
53            r config set min-slaves-max-lag 10
54            r -1 config set min-slaves-to-write 1
55            r -1 config set min-slaves-max-lag 10
56            r set foo aaabbb
57            wait_for_condition 50 100 {
58                [r -1 get foo] eq {aaabbb}
59            } else {
60                fail "Write did not reached slave"
61            }
62        }
63
64        # Fix parameters for the next test to work
65        r config set min-slaves-to-write 0
66        r -1 config set min-slaves-to-write 0
67        r flushall
68
69        test {MASTER and SLAVE dataset should be identical after complex ops} {
70            createComplexDataset r 10000
71            after 500
72            if {[r debug digest] ne [r -1 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        }
86    }
87}
88