summaryrefslogtreecommitdiff
path: root/src/cluster.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cluster.c')
-rw-r--r--src/cluster.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/src/cluster.c b/src/cluster.c
index e7a32a9a2..88b810d13 100644
--- a/src/cluster.c
+++ b/src/cluster.c
@@ -4988,7 +4988,8 @@ void restoreCommand(client *c) {
}
/* Make sure this key does not already exist here... */
- if (!replace && lookupKeyWrite(c->db,c->argv[1]) != NULL) {
+ robj *key = c->argv[1];
+ if (!replace && lookupKeyWrite(c->db,key) != NULL) {
addReply(c,shared.busykeyerr);
return;
}
@@ -5010,24 +5011,37 @@ void restoreCommand(client *c) {
rioInitWithBuffer(&payload,c->argv[3]->ptr);
if (((type = rdbLoadObjectType(&payload)) == -1) ||
- ((obj = rdbLoadObject(type,&payload,c->argv[1]->ptr)) == NULL))
+ ((obj = rdbLoadObject(type,&payload,key->ptr)) == NULL))
{
addReplyError(c,"Bad data format");
return;
}
/* Remove the old key if needed. */
- if (replace) dbDelete(c->db,c->argv[1]);
+ int deleted = 0;
+ if (replace)
+ deleted = dbDelete(c->db,key);
+
+ if (ttl && !absttl) ttl+=mstime();
+ if (ttl && checkAlreadyExpired(ttl)) {
+ if (deleted) {
+ rewriteClientCommandVector(c,2,shared.del,key);
+ signalModifiedKey(c,c->db,key);
+ notifyKeyspaceEvent(NOTIFY_GENERIC,"del",key,c->db->id);
+ server.dirty++;
+ }
+ addReply(c, shared.ok);
+ return;
+ }
/* Create the key and set the TTL if any */
- dbAdd(c->db,c->argv[1],obj);
+ dbAdd(c->db,key,obj);
if (ttl) {
- if (!absttl) ttl+=mstime();
- setExpire(c,c->db,c->argv[1],ttl);
+ setExpire(c,c->db,key,ttl);
}
objectSetLRUOrLFU(obj,lfu_freq,lru_idle,lru_clock,1000);
- signalModifiedKey(c,c->db,c->argv[1]);
- notifyKeyspaceEvent(NOTIFY_GENERIC,"restore",c->argv[1],c->db->id);
+ signalModifiedKey(c,c->db,key);
+ notifyKeyspaceEvent(NOTIFY_GENERIC,"restore",key,c->db->id);
addReply(c,shared.ok);
server.dirty++;
}