1start_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 {RESTORE can overwrite an existing key with REPLACE} { 27 r set foo bar1 28 set encoded1 [r dump foo] 29 r set foo bar2 30 set encoded2 [r dump foo] 31 r del foo 32 r restore foo 0 $encoded1 33 r restore foo 0 $encoded2 replace 34 r get foo 35 } {bar2} 36 37 test {RESTORE can detect a syntax error for unrecongized options} { 38 catch {r restore foo 0 "..." invalid-option} e 39 set e 40 } {*syntax*} 41 42 test {DUMP of non existing key returns nil} { 43 r dump nonexisting_key 44 } {} 45 46 test {MIGRATE is caching connections} { 47 # Note, we run this as first test so that the connection cache 48 # is empty. 49 set first [srv 0 client] 50 r set key "Some Value" 51 start_server {tags {"repl"}} { 52 set second [srv 0 client] 53 set second_host [srv 0 host] 54 set second_port [srv 0 port] 55 56 assert_match {*migrate_cached_sockets:0*} [r -1 info] 57 r -1 migrate $second_host $second_port key 9 1000 58 assert_match {*migrate_cached_sockets:1*} [r -1 info] 59 } 60 } 61 62 test {MIGRATE cached connections are released after some time} { 63 after 15000 64 assert_match {*migrate_cached_sockets:0*} [r info] 65 } 66 67 test {MIGRATE is able to migrate a key between two instances} { 68 set first [srv 0 client] 69 r set key "Some Value" 70 start_server {tags {"repl"}} { 71 set second [srv 0 client] 72 set second_host [srv 0 host] 73 set second_port [srv 0 port] 74 75 assert {[$first exists key] == 1} 76 assert {[$second exists key] == 0} 77 set ret [r -1 migrate $second_host $second_port key 9 5000] 78 assert {$ret eq {OK}} 79 assert {[$first exists key] == 0} 80 assert {[$second exists key] == 1} 81 assert {[$second get key] eq {Some Value}} 82 assert {[$second ttl key] == -1} 83 } 84 } 85 86 test {MIGRATE is able to copy a key between two instances} { 87 set first [srv 0 client] 88 r del list 89 r lpush list a b c d 90 start_server {tags {"repl"}} { 91 set second [srv 0 client] 92 set second_host [srv 0 host] 93 set second_port [srv 0 port] 94 95 assert {[$first exists list] == 1} 96 assert {[$second exists list] == 0} 97 set ret [r -1 migrate $second_host $second_port list 9 5000 copy] 98 assert {$ret eq {OK}} 99 assert {[$first exists list] == 1} 100 assert {[$second exists list] == 1} 101 assert {[$first lrange list 0 -1] eq [$second lrange list 0 -1]} 102 } 103 } 104 105 test {MIGRATE will not overwrite existing keys, unless REPLACE is used} { 106 set first [srv 0 client] 107 r del list 108 r lpush list a b c d 109 start_server {tags {"repl"}} { 110 set second [srv 0 client] 111 set second_host [srv 0 host] 112 set second_port [srv 0 port] 113 114 assert {[$first exists list] == 1} 115 assert {[$second exists list] == 0} 116 $second set list somevalue 117 catch {r -1 migrate $second_host $second_port list 9 5000 copy} e 118 assert_match {ERR*} $e 119 set res [r -1 migrate $second_host $second_port list 9 5000 copy replace] 120 assert {$ret eq {OK}} 121 assert {[$first exists list] == 1} 122 assert {[$second exists list] == 1} 123 assert {[$first lrange list 0 -1] eq [$second lrange list 0 -1]} 124 } 125 } 126 127 test {MIGRATE propagates TTL correctly} { 128 set first [srv 0 client] 129 r set key "Some Value" 130 start_server {tags {"repl"}} { 131 set second [srv 0 client] 132 set second_host [srv 0 host] 133 set second_port [srv 0 port] 134 135 assert {[$first exists key] == 1} 136 assert {[$second exists key] == 0} 137 $first expire key 10 138 set ret [r -1 migrate $second_host $second_port key 9 5000] 139 assert {$ret eq {OK}} 140 assert {[$first exists key] == 0} 141 assert {[$second exists key] == 1} 142 assert {[$second get key] eq {Some Value}} 143 assert {[$second ttl key] >= 7 && [$second ttl key] <= 10} 144 } 145 } 146 147 test {MIGRATE can correctly transfer large values} { 148 set first [srv 0 client] 149 r del key 150 for {set j 0} {$j < 5000} {incr j} { 151 r rpush key 1 2 3 4 5 6 7 8 9 10 152 r rpush key "item 1" "item 2" "item 3" "item 4" "item 5" \ 153 "item 6" "item 7" "item 8" "item 9" "item 10" 154 } 155 assert {[string length [r dump key]] > (1024*64)} 156 start_server {tags {"repl"}} { 157 set second [srv 0 client] 158 set second_host [srv 0 host] 159 set second_port [srv 0 port] 160 161 assert {[$first exists key] == 1} 162 assert {[$second exists key] == 0} 163 set ret [r -1 migrate $second_host $second_port key 9 10000] 164 assert {$ret eq {OK}} 165 assert {[$first exists key] == 0} 166 assert {[$second exists key] == 1} 167 assert {[$second ttl key] == -1} 168 assert {[$second llen key] == 5000*20} 169 } 170 } 171 172 test {MIGRATE can correctly transfer hashes} { 173 set first [srv 0 client] 174 r del key 175 r hmset key field1 "item 1" field2 "item 2" field3 "item 3" \ 176 field4 "item 4" field5 "item 5" field6 "item 6" 177 start_server {tags {"repl"}} { 178 set second [srv 0 client] 179 set second_host [srv 0 host] 180 set second_port [srv 0 port] 181 182 assert {[$first exists key] == 1} 183 assert {[$second exists key] == 0} 184 set ret [r -1 migrate $second_host $second_port key 9 10000] 185 assert {$ret eq {OK}} 186 assert {[$first exists key] == 0} 187 assert {[$second exists key] == 1} 188 assert {[$second ttl key] == -1} 189 } 190 } 191 192 test {MIGRATE timeout actually works} { 193 set first [srv 0 client] 194 r set key "Some Value" 195 start_server {tags {"repl"}} { 196 set second [srv 0 client] 197 set second_host [srv 0 host] 198 set second_port [srv 0 port] 199 200 assert {[$first exists key] == 1} 201 assert {[$second exists key] == 0} 202 203 set rd [redis_deferring_client] 204 $rd debug sleep 1.0 ; # Make second server unable to reply. 205 set e {} 206 catch {r -1 migrate $second_host $second_port key 9 500} e 207 assert_match {IOERR*} $e 208 } 209 } 210} 211