X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/040b0ade7dd9d30210ec89182bbe4d416416ed53..c5954c196679cbc830fd835d6b72bbd94422fe5a:/src/db.c?ds=sidebyside diff --git a/src/db.c b/src/db.c index 47994df2..26af2f21 100644 --- a/src/db.c +++ b/src/db.c @@ -516,10 +516,24 @@ void expireGenericCommand(redisClient *c, robj *key, robj *param, long offset) { addReply(c,shared.czero); return; } - if (seconds <= 0 && !server.loading) { - if (dbDelete(c->db,key)) server.dirty++; - addReply(c, shared.cone); + /* EXPIRE with negative TTL, or EXPIREAT with a timestamp into the past + * should never be executed as a DEL when load the AOF or in the context + * of a slave instance. + * + * Instead we take the other branch of the IF statement setting an expire + * (possibly in the past) and wait for an explicit DEL from the master. */ + if (seconds <= 0 && !server.loading && !server.masterhost) { + robj *aux; + + redisAssert(dbDelete(c->db,key)); + server.dirty++; + + /* Replicate/AOF this as an explicit DEL. */ + aux = createStringObject("DEL",3); + rewriteClientCommandVector(c,2,aux,key); + decrRefCount(aux); signalModifiedKey(c->db,key); + addReply(c, shared.cone); return; } else { time_t when = time(NULL)+seconds;