summaryrefslogtreecommitdiff
path: root/examples/redis-unstable/tests/unit/moduleapi/rdbloadsave.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'examples/redis-unstable/tests/unit/moduleapi/rdbloadsave.tcl')
-rw-r--r--examples/redis-unstable/tests/unit/moduleapi/rdbloadsave.tcl203
1 files changed, 203 insertions, 0 deletions
diff --git a/examples/redis-unstable/tests/unit/moduleapi/rdbloadsave.tcl b/examples/redis-unstable/tests/unit/moduleapi/rdbloadsave.tcl
new file mode 100644
index 0000000..ba2cfd6
--- /dev/null
+++ b/examples/redis-unstable/tests/unit/moduleapi/rdbloadsave.tcl
@@ -0,0 +1,203 @@
1set testmodule [file normalize tests/modules/rdbloadsave.so]
2
3start_server {tags {"modules external:skip debug_defrag:skip"}} {
4 r module load $testmodule
5
6 test "Module rdbloadsave sanity" {
7 r test.sanity
8
9 # Try to load non-existing file
10 assert_error {*No such file or directory*} {r test.rdbload sanity.rdb}
11
12 r set x 1
13 assert_equal OK [r test.rdbsave sanity.rdb]
14
15 r flushdb
16 assert_equal OK [r test.rdbload sanity.rdb]
17 assert_equal 1 [r get x]
18 }
19
20 test "Module rdbloadsave test with pipelining" {
21 r config set save ""
22 r config set loading-process-events-interval-bytes 1024
23 r config set key-load-delay 50
24 r flushdb
25
26 populate 3000 a 1024
27 r set x 111
28 assert_equal [r dbsize] 3001
29
30 assert_equal OK [r test.rdbsave blabla.rdb]
31 r flushdb
32 assert_equal [r dbsize] 0
33
34 # Send commands with pipeline. First command will call RM_RdbLoad() in
35 # the command callback. While loading RDB, Redis can go to networking to
36 # reply -LOADING. By sending commands in pipeline, we verify it doesn't
37 # cause a problem.
38 # e.g. Redis won't try to process next message of the current client
39 # while it is in the command callback for that client .
40 set rd1 [redis_deferring_client]
41 $rd1 test.rdbload blabla.rdb
42
43 wait_for_condition 50 100 {
44 [s loading] eq 1
45 } else {
46 fail "Redis did not start loading or loaded RDB too fast"
47 }
48
49 $rd1 get x
50 $rd1 dbsize
51
52 assert_equal OK [$rd1 read]
53 assert_equal 111 [$rd1 read]
54 assert_equal 3001 [$rd1 read]
55 r flushdb
56 r config set key-load-delay 0
57 }
58
59 test "Module rdbloadsave with aof" {
60 r config set save ""
61
62 # Enable the AOF
63 r config set appendonly yes
64 r config set auto-aof-rewrite-percentage 0 ; # Disable auto-rewrite.
65 waitForBgrewriteaof r
66
67 r set k v1
68 assert_equal OK [r test.rdbsave aoftest.rdb]
69
70 r set k v2
71 r config set rdb-key-save-delay 10000000
72 r bgrewriteaof
73
74 # RM_RdbLoad() should kill aof fork
75 assert_equal OK [r test.rdbload aoftest.rdb]
76
77 wait_for_condition 50 100 {
78 [string match {*Killing*AOF*child*} [exec tail -20 < [srv 0 stdout]]]
79 } else {
80 fail "Can't find 'Killing AOF child' in recent log lines"
81 }
82
83 # Verify the value in the loaded rdb
84 assert_equal v1 [r get k]
85
86 # Verify aof is still enabled after RM_RdbLoad() call
87 assert_equal 1 [s aof_enabled]
88
89 r flushdb
90 r config set rdb-key-save-delay 0
91 r config set appendonly no
92 }
93
94 test "Module rdbloadsave with bgsave" {
95 r flushdb
96 r config set save ""
97
98 r set k v1
99 assert_equal OK [r test.rdbsave bgsave.rdb]
100
101 r set k v2
102 r config set rdb-key-save-delay 500000
103 r bgsave
104
105 # RM_RdbLoad() should kill RDB fork
106 assert_equal OK [r test.rdbload bgsave.rdb]
107
108 wait_for_condition 10 1000 {
109 [string match {*Background*saving*terminated*} [exec tail -20 < [srv 0 stdout]]]
110 } else {
111 fail "Can't find 'Background saving terminated' in recent log lines"
112 }
113
114 assert_equal v1 [r get k]
115 r flushall
116 waitForBgsave r
117 r config set rdb-key-save-delay 0
118 }
119
120 test "Module rdbloadsave calls rdbsave in a module fork" {
121 r flushdb
122 r config set save ""
123 r config set rdb-key-save-delay 500000
124
125 r set k v1
126
127 # Module will call RM_Fork() before calling RM_RdbSave()
128 assert_equal OK [r test.rdbsave_fork rdbfork.rdb]
129 assert_equal [s module_fork_in_progress] 1
130
131 wait_for_condition 10 1000 {
132 [status r module_fork_in_progress] == "0"
133 } else {
134 fail "Module fork didn't finish"
135 }
136
137 r set k v2
138 assert_equal OK [r test.rdbload rdbfork.rdb]
139 assert_equal v1 [r get k]
140
141 r config set rdb-key-save-delay 0
142 }
143
144 test "Unload the module - rdbloadsave" {
145 assert_equal {OK} [r module unload rdbloadsave]
146 }
147
148 tags {repl} {
149 test {Module rdbloadsave on master and replica} {
150 start_server [list overrides [list loadmodule "$testmodule"] tags {"external:skip"}] {
151 set replica [srv 0 client]
152 set replica_host [srv 0 host]
153 set replica_port [srv 0 port]
154 start_server [list overrides [list loadmodule "$testmodule"] tags {"external:skip"}] {
155 set master [srv 0 client]
156 set master_host [srv 0 host]
157 set master_port [srv 0 port]
158
159 $master set x 10000
160
161 # Start the replication process...
162 $replica replicaof $master_host $master_port
163
164 wait_for_condition 100 100 {
165 [status $master sync_full] == 1
166 } else {
167 fail "Master <-> Replica didn't start the full sync"
168 }
169
170 # RM_RdbSave() is allowed on replicas
171 assert_equal OK [$replica test.rdbsave rep.rdb]
172
173 # RM_RdbLoad() is not allowed on replicas
174 assert_error {*supported*} {$replica test.rdbload rep.rdb}
175
176 assert_equal OK [$master test.rdbsave master.rdb]
177 $master set x 20000
178
179 wait_for_condition 100 100 {
180 [$replica get x] == 20000
181 } else {
182 fail "Replica didn't get the update"
183 }
184
185 # Loading RDB on master will drop replicas
186 assert_equal OK [$master test.rdbload master.rdb]
187
188 wait_for_condition 100 100 {
189 [status $master sync_full] == 2
190 } else {
191 fail "Master <-> Replica didn't start the full sync"
192 }
193
194 wait_for_condition 100 100 {
195 [$replica get x] == 10000
196 } else {
197 fail "Replica didn't get the update"
198 }
199 }
200 }
201 }
202 }
203}