diff options
Diffstat (limited to 'examples/redis-unstable/tests/unit/moduleapi/rdbloadsave.tcl')
| -rw-r--r-- | examples/redis-unstable/tests/unit/moduleapi/rdbloadsave.tcl | 203 |
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 @@ | |||
| 1 | set testmodule [file normalize tests/modules/rdbloadsave.so] | ||
| 2 | |||
| 3 | start_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 | } | ||
