We can't set FExpire() on shared objects, issue #66

Former-commit-id: 2794cfced4fdb18c0860e966dde0b46b9584c4dc
This commit is contained in:
John Sully 2019-07-23 23:39:47 -04:00
parent 8c46a1fba2
commit a0d7eb5a19

View File

@ -231,17 +231,24 @@ void dbOverwriteCore(redisDb *db, dictEntry *de, robj *key, robj *val, bool fUpd
robj *old = (robj*)dictGetVal(de); robj *old = (robj*)dictGetVal(de);
if (old->FExpires()) { if (old->FExpires()) {
if (fRemoveExpire) if (fRemoveExpire) {
removeExpire(db, key); removeExpire(db, key);
else }
else {
if (val->getrefcount(std::memory_order_relaxed) == OBJ_SHARED_REFCOUNT)
val = dupStringObject(val);
updateExpire(db, (sds)dictGetKey(de), old, val); updateExpire(db, (sds)dictGetKey(de), old, val);
}
} }
if (g_pserver->maxmemory_policy & MAXMEMORY_FLAG_LFU) { if (g_pserver->maxmemory_policy & MAXMEMORY_FLAG_LFU) {
val->lru = old->lru; val->lru = old->lru;
} }
if (fUpdateMvcc) if (fUpdateMvcc) {
if (val->getrefcount(std::memory_order_relaxed) == OBJ_SHARED_REFCOUNT)
val = dupStringObject(val);
val->mvcc_tstamp = getMvccTstamp(); val->mvcc_tstamp = getMvccTstamp();
}
dictSetVal(db->pdict, de, val); dictSetVal(db->pdict, de, val);