diff --git a/src/dict.cpp b/src/dict.cpp index 184e01ca8..86a29db4a 100644 --- a/src/dict.cpp +++ b/src/dict.cpp @@ -613,7 +613,7 @@ void dictRelease(dict *d) zfree(d); } -dictEntry *dictFindWithPrev(dict *d, const void *key, uint64_t h, dictEntry ***dePrevPtr, dictht **pht) +dictEntry *dictFindWithPrev(dict *d, const void *key, uint64_t h, dictEntry ***dePrevPtr, dictht **pht, bool fShallowCompare) { dictEntry *he; uint64_t idx, table; @@ -626,7 +626,7 @@ dictEntry *dictFindWithPrev(dict *d, const void *key, uint64_t h, dictEntry ***d he = d->ht[table].table[idx]; *dePrevPtr = &d->ht[table].table[idx]; while(he) { - if (key==he->key || dictCompareKeys(d, key, he->key)) { + if (key==he->key || (!fShallowCompare && dictCompareKeys(d, key, he->key))) { return he; } *dePrevPtr = &he->next; diff --git a/src/dict.h b/src/dict.h index 77ab832db..13f9d2aaa 100644 --- a/src/dict.h +++ b/src/dict.h @@ -167,7 +167,7 @@ dictEntry *dictUnlink(dict *ht, const void *key); void dictFreeUnlinkedEntry(dict *d, dictEntry *he); void dictRelease(dict *d); dictEntry * dictFind(dict *d, const void *key); -dictEntry * dictFindWithPrev(dict *d, const void *key, uint64_t h, dictEntry ***dePrevPtr, dictht **ht); +dictEntry * dictFindWithPrev(dict *d, const void *key, uint64_t h, dictEntry ***dePrevPtr, dictht **ht, bool fShallowCompare = false); void *dictFetchValue(dict *d, const void *key); int dictResize(dict *d); dictIterator *dictGetIterator(dict *d); diff --git a/src/snapshot.cpp b/src/snapshot.cpp index bd476be26..1eb8547ba 100644 --- a/src/snapshot.cpp +++ b/src/snapshot.cpp @@ -246,8 +246,11 @@ void redisDbPersistentDataSnapshot::freeTombstoneObjects(int depth) dictEntry *de; while ((de = dictNext(di)) != nullptr) { - dictEntry *deObj = dictFind(m_pdbSnapshot->m_pdict, dictGetKey(de)); - if (deObj != nullptr && dictGetVal(deObj) != nullptr) + dictEntry **dePrev = nullptr; + dictht *ht = nullptr; + sds key = (sds)dictGetKey(de); + dictEntry *deObj = dictFindWithPrev(m_pdbSnapshot->m_pdict, key, (uint64_t)dictGetVal(de), &dePrev, &ht, !!sdsisshared(key)); + if (deObj != nullptr) { decrRefCount((robj*)dictGetVal(deObj)); void *ptrSet = nullptr; @@ -309,7 +312,7 @@ void redisDbPersistentData::endSnapshot(const redisDbPersistentDataSnapshot *psn { dictEntry **dePrev; dictht *ht; - dictEntry *deSnapshot = dictFindWithPrev(m_spdbSnapshotHOLDER->m_pdict, dictGetKey(de), (uint64_t)dictGetVal(de), &dePrev, &ht); + dictEntry *deSnapshot = dictFindWithPrev(m_spdbSnapshotHOLDER->m_pdict, dictGetKey(de), (uint64_t)dictGetVal(de), &dePrev, &ht, !!sdsisshared((sds)dictGetKey(de))); if (deSnapshot == nullptr && m_spdbSnapshotHOLDER->m_pdbSnapshot) { // The tombstone is for a grand child, propogate it (or possibly in the storage provider - but an extra tombstone won't hurt)