diff --git a/redis.c b/redis.c index 302a2b419f75b3f6a8ee89780023fb3a8e92480b..a69fcb42977534e0b877a4e8ccea124d6ea81ebe 100644 --- a/redis.c +++ b/redis.c @@ -5742,6 +5742,18 @@ fmterr: static void debugCommand(redisClient *c) { if (!strcasecmp(c->argv[1]->ptr,"segfault")) { *((char*)-1) = 'x'; + } else if (!strcasecmp(c->argv[1]->ptr,"reload")) { + if (rdbSave(server.dbfilename) != REDIS_OK) { + addReply(c,shared.err); + return; + } + emptyDb(); + if (rdbLoad(server.dbfilename) != REDIS_OK) { + addReply(c,shared.err); + return; + } + redisLog(REDIS_WARNING,"DB reloaded by DEBUG RELOAD"); + addReply(c,shared.ok); } else if (!strcasecmp(c->argv[1]->ptr,"object") && c->argc == 3) { dictEntry *de = dictFind(c->db->dict,c->argv[2]); robj *key, *val; @@ -5757,7 +5769,7 @@ static void debugCommand(redisClient *c) { key, key->refcount, val, val->refcount, val->encoding)); } else { addReplySds(c,sdsnew( - "-ERR Syntax error, try DEBUG [SEGFAULT|OBJECT ]\r\n")); + "-ERR Syntax error, try DEBUG [SEGFAULT|OBJECT |RELOAD]\r\n")); } } diff --git a/test-redis.tcl b/test-redis.tcl index a4c3c618a2d72f99527b24af4fb3b8f91bf36f38..a7acf641f6b528e7641470602154303da3827aaa 100644 --- a/test-redis.tcl +++ b/test-redis.tcl @@ -235,6 +235,19 @@ proc main {server port} { format $ok } {2000} + test {Check if the list is still ok after a DEBUG RELOAD} { + $r debug reload + set ok 0 + for {set i 0} {$i < 1000} {incr i} { + set rint [expr int(rand()*1000)] + if {[$r lindex mylist $rint] eq $rint} {incr ok} + if {[$r lindex mylist [expr (-$rint)-1]] eq [expr 999-$rint]} { + incr ok + } + } + format $ok + } {2000} + test {LLEN against non-list value error} { $r del mylist $r set mylist foobar @@ -551,6 +564,12 @@ proc main {server port} { lsort [$r smembers setres] } {995 996 997 998 999} + test {SINTERSTORE with two sets, after a DEBUG RELOAD} { + $r debug reload + $r sinterstore setres set1 set2 + lsort [$r smembers setres] + } {995 996 997 998 999} + test {SUNIONSTORE with two sets} { $r sunionstore setres set1 set2 lsort [$r smembers setres] @@ -906,6 +925,25 @@ proc main {server port} { set _ $err } {} + test {ZSCORE after a DEBUG RELOAD} { + set aux {} + set err {} + $r del zscoretest + for {set i 0} {$i < 1000} {incr i} { + set score [expr rand()] + lappend aux $score + $r zadd zscoretest $score $i + } + $r debug reload + for {set i 0} {$i < 1000} {incr i} { + if {[$r zscore zscoretest $i] != [lindex $aux $i]} { + set err "Expected score was [lindex $aux $i] but got [$r zscore zscoretest $i] for element $i" + break + } + } + set _ $err + } {} + test {ZRANGE and ZREVRANGE} { list [$r zrange ztmp 0 -1] [$r zrevrange ztmp 0 -1] } {{y x z} {z x y}}