summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2015-09-14 12:28:22 +0200
committerantirez <antirez@gmail.com>2015-09-14 12:37:49 +0200
commit37843be92f3d503d8dea190c2fd3795aeec096be (patch)
tree74a99e416faefa13e1109f6ec4250f6a4243998f
parent54b368bb81a878f7bb5276dd299a32fe18837c13 (diff)
downloadredis-37843be92f3d503d8dea190c2fd3795aeec096be.tar.gz
MOVE now can move TTL metadata as well.
MOVE was not able to move the TTL: when a key was moved into a different database number, it became persistent like if PERSIST was used. In some incredible way (I guess almost nobody uses Redis MOVE) this bug remained unnoticed inside Redis internals for many years. Finally Andy Grunwald discovered it and opened an issue. This commit fixes the bug and adds a regression test. Close #2765.
-rw-r--r--src/db.c4
-rw-r--r--tests/unit/basic.tcl13
2 files changed, 16 insertions, 1 deletions
diff --git a/src/db.c b/src/db.c
index dfec71942..eed9f55b6 100644
--- a/src/db.c
+++ b/src/db.c
@@ -700,7 +700,7 @@ void moveCommand(redisClient *c) {
robj *o;
redisDb *src, *dst;
int srcid;
- long long dbid;
+ long long dbid, expire;
/* Obtain source and target DB pointers */
src = c->db;
@@ -729,6 +729,7 @@ void moveCommand(redisClient *c) {
addReply(c,shared.czero);
return;
}
+ expire = getExpire(c->db,c->argv[1]);
/* Return zero if the key already exists in the target DB */
if (lookupKeyWrite(dst,c->argv[1]) != NULL) {
@@ -736,6 +737,7 @@ void moveCommand(redisClient *c) {
return;
}
dbAdd(dst,c->argv[1],o);
+ if (expire) setExpire(dst,c->argv[1],expire);
incrRefCount(o);
/* OK! key moved, free the entry in the source DB */
diff --git a/tests/unit/basic.tcl b/tests/unit/basic.tcl
index 6f725d299..489272f5d 100644
--- a/tests/unit/basic.tcl
+++ b/tests/unit/basic.tcl
@@ -410,6 +410,19 @@ start_server {tags {"basic"}} {
set e
} {*ERR*index out of range}
+ test {MOVE can move key expire metadata as well} {
+ r select 10
+ r flushdb
+ r select 9
+ r set mykey foo ex 100
+ r move mykey 10
+ assert {[r ttl mykey] == -2}
+ r select 10
+ assert {[r ttl mykey] > 0 && [r ttl mykey] <= 100}
+ assert {[r get mykey] eq "foo"}
+ r select 9
+ }
+
test {SET/GET keys in different DBs} {
r set a hello
r set b world