]> git.saurik.com Git - redis.git/blob - tests/unit/dump.tcl
Merge pull request #426 from anydot/fix-rm-vm-comments
[redis.git] / tests / unit / dump.tcl
1 start_server {tags {"dump"}} {
2 test {DUMP / RESTORE are able to serialize / unserialize a simple key} {
3 r set foo bar
4 set encoded [r dump foo]
5 r del foo
6 list [r exists foo] [r restore foo 0 $encoded] [r ttl foo] [r get foo]
7 } {0 OK -1 bar}
8
9 test {RESTORE can set an arbitrary expire to the materialized key} {
10 r set foo bar
11 set encoded [r dump foo]
12 r del foo
13 r restore foo 5000 $encoded
14 set ttl [r pttl foo]
15 assert {$ttl >= 3000 && $ttl <= 5000}
16 r get foo
17 } {bar}
18
19 test {RESTORE returns an error of the key already exists} {
20 r set foo bar
21 set e {}
22 catch {r restore foo 0 "..."} e
23 set e
24 } {*is busy*}
25
26 test {DUMP of non existing key returns nil} {
27 r dump nonexisting_key
28 } {}
29
30 test {MIGRATE is able to migrate a key between two instances} {
31 set first [srv 0 client]
32 r set key "Some Value"
33 start_server {tags {"repl"}} {
34 set second [srv 0 client]
35 set second_host [srv 0 host]
36 set second_port [srv 0 port]
37
38 assert {[$first exists key] == 1}
39 assert {[$second exists key] == 0}
40 set ret [r -1 migrate $second_host $second_port key 9 5000]
41 assert {$ret eq {OK}}
42 assert {[$first exists key] == 0}
43 assert {[$second exists key] == 1}
44 assert {[$second get key] eq {Some Value}}
45 assert {[$second ttl key] == -1}
46 }
47 }
48
49 test {MIGRATE propagates TTL correctly} {
50 set first [srv 0 client]
51 r set key "Some Value"
52 start_server {tags {"repl"}} {
53 set second [srv 0 client]
54 set second_host [srv 0 host]
55 set second_port [srv 0 port]
56
57 assert {[$first exists key] == 1}
58 assert {[$second exists key] == 0}
59 $first expire key 10
60 set ret [r -1 migrate $second_host $second_port key 9 5000]
61 assert {$ret eq {OK}}
62 assert {[$first exists key] == 0}
63 assert {[$second exists key] == 1}
64 assert {[$second get key] eq {Some Value}}
65 assert {[$second ttl key] >= 7 && [$second ttl key] <= 10}
66 }
67 }
68
69 test {MIGRATE can correctly transfer large values} {
70 set first [srv 0 client]
71 r del key
72 for {set j 0} {$j < 5000} {incr j} {
73 r rpush key 1 2 3 4 5 6 7 8 9 10
74 r rpush key "item 1" "item 2" "item 3" "item 4" "item 5" \
75 "item 6" "item 7" "item 8" "item 9" "item 10"
76 }
77 assert {[string length [r dump key]] > (1024*64)}
78 start_server {tags {"repl"}} {
79 set second [srv 0 client]
80 set second_host [srv 0 host]
81 set second_port [srv 0 port]
82
83 assert {[$first exists key] == 1}
84 assert {[$second exists key] == 0}
85 set ret [r -1 migrate $second_host $second_port key 9 10000]
86 assert {$ret eq {OK}}
87 assert {[$first exists key] == 0}
88 assert {[$second exists key] == 1}
89 assert {[$second ttl key] == -1}
90 assert {[$second llen key] == 5000*20}
91 }
92 }
93
94 test {MIGRATE timeout actually works} {
95 set first [srv 0 client]
96 r set key "Some Value"
97 start_server {tags {"repl"}} {
98 set second [srv 0 client]
99 set second_host [srv 0 host]
100 set second_port [srv 0 port]
101
102 assert {[$first exists key] == 1}
103 assert {[$second exists key] == 0}
104
105 set rd [redis_deferring_client]
106 $rd debug sleep 5.0 ; # Make second server unable to reply.
107 set e {}
108 catch {r -1 migrate $second_host $second_port key 9 1000} e
109 assert_match {IOERR*} $e
110 }
111 }
112 }