diff --git a/src/db.cpp b/src/db.cpp index 9a47b415d..40e44a7c1 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -1234,7 +1234,10 @@ void setExpire(client *c, redisDb *db, robj *key, robj *subkey, long long when) if (((robj*)dictGetVal(kde))->FExpires()) { auto itr = db->setexpire->find((sds)dictGetKey(kde)); serverAssert(itr != db->setexpire->end()); - itr->update(szSubKey, when); + expireEntry eNew(std::move(*itr)); + eNew.update(szSubKey, when); + db->setexpire->erase(itr); + db->setexpire->insert(eNew); } else { diff --git a/src/expire.cpp b/src/expire.cpp index b6833db04..c10047d2c 100644 --- a/src/expire.cpp +++ b/src/expire.cpp @@ -68,7 +68,10 @@ void activeExpireCycleExpireFullKey(redisDb *db, const char *key) { * to the function to avoid too many gettimeofday() syscalls. */ void activeExpireCycleExpire(redisDb *db, expireEntry &e, long long now) { if (!e.FFat()) + { activeExpireCycleExpireFullKey(db, e.key()); + return; + } expireEntryFat *pfat = e.pfatentry(); dictEntry *de = dictFind(db->pdict, e.key());