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            wait_for_condition 50 100 {
6                [s -1 master_link_status] eq {up}
7            } else {
8                fail "Replication not started."
9            }
10        }
11
12        test {If min-slaves-to-write is honored, write is accepted} {
13            r config set min-slaves-to-write 1
14            r config set min-slaves-max-lag 10
15            r set foo 12345
16            wait_for_condition 50 100 {
17                [r -1 get foo] eq {12345}
18            } else {
19                fail "Write did not reached replica"
20            }
21        }
22
23        test {No write if min-slaves-to-write is < attached slaves} {
24            r config set min-slaves-to-write 2
25            r config set min-slaves-max-lag 10
26            catch {r set foo 12345} err
27            set err
28        } {NOREPLICAS*}
29
30        test {If min-slaves-to-write is honored, write is accepted (again)} {
31            r config set min-slaves-to-write 1
32            r config set min-slaves-max-lag 10
33            r set foo 12345
34            wait_for_condition 50 100 {
35                [r -1 get foo] eq {12345}
36            } else {
37                fail "Write did not reached replica"
38            }
39        }
40
41        test {No write if min-slaves-max-lag is > of the slave lag} {
42            r -1 deferred 1
43            r config set min-slaves-to-write 1
44            r config set min-slaves-max-lag 2
45            r -1 debug sleep 6
46            assert {[r set foo 12345] eq {OK}}
47            after 4000
48            catch {r set foo 12345} err
49            assert {[r -1 read] eq {OK}}
50            r -1 deferred 0
51            set err
52        } {NOREPLICAS*}
53
54        test {min-slaves-to-write is ignored by slaves} {
55            r config set min-slaves-to-write 1
56            r config set min-slaves-max-lag 10
57            r -1 config set min-slaves-to-write 1
58            r -1 config set min-slaves-max-lag 10
59            r set foo aaabbb
60            wait_for_condition 50 100 {
61                [r -1 get foo] eq {aaabbb}
62            } else {
63                fail "Write did not reached replica"
64            }
65        }
66
67        # Fix parameters for the next test to work
68        r config set min-slaves-to-write 0
69        r -1 config set min-slaves-to-write 0
70        r flushall
71
72        test {MASTER and SLAVE dataset should be identical after complex ops} {
73            createComplexDataset r 10000
74            after 500
75            if {[r debug digest] ne [r -1 debug digest]} {
76                set csv1 [csvdump r]
77                set csv2 [csvdump {r -1}]
78                set fd [open /tmp/repldump1.txt w]
79                puts -nonewline $fd $csv1
80                close $fd
81                set fd [open /tmp/repldump2.txt w]
82                puts -nonewline $fd $csv2
83                close $fd
84                puts "Master - Replica inconsistency"
85                puts "Run diff -u against /tmp/repldump*.txt for more info"
86            }
87            assert_equal [r debug digest] [r -1 debug digest]
88        }
89    }
90}
91