Fix crash where tombstone is evicted
Former-commit-id: 1f6ff7cc0fc0173610d77a69076eeaf478c3b701
This commit is contained in:
parent
6a9b345f56
commit
a80b8c1b11
@ -283,13 +283,18 @@ void redisDbPersistentData::endSnapshot(const redisDbPersistentDataSnapshot *psn
|
|||||||
while ((de = dictNext(di)) != NULL)
|
while ((de = dictNext(di)) != NULL)
|
||||||
{
|
{
|
||||||
dictEntry *deSnapshot = dictFind(m_spdbSnapshotHOLDER->m_pdict, dictGetKey(de));
|
dictEntry *deSnapshot = dictFind(m_spdbSnapshotHOLDER->m_pdict, dictGetKey(de));
|
||||||
if (deSnapshot == nullptr)
|
if (deSnapshot == nullptr && m_spdbSnapshotHOLDER->m_pdbSnapshot)
|
||||||
{
|
{
|
||||||
// The tombstone is for a grand child, propogate it
|
// The tombstone is for a grand child, propogate it (or possibly in the storage provider - but an extra tombstone won't hurt)
|
||||||
serverAssert(m_spdbSnapshotHOLDER->m_pdbSnapshot->find_cached_threadsafe((const char*)dictGetKey(de)) != nullptr);
|
serverAssert(m_spdbSnapshotHOLDER->m_pdbSnapshot->find_cached_threadsafe((const char*)dictGetKey(de)) != nullptr);
|
||||||
dictAdd(m_spdbSnapshotHOLDER->m_pdictTombstone, sdsdupshared((sds)dictGetKey(de)), nullptr);
|
dictAdd(m_spdbSnapshotHOLDER->m_pdictTombstone, sdsdupshared((sds)dictGetKey(de)), nullptr);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
else if (deSnapshot == nullptr)
|
||||||
|
{
|
||||||
|
serverAssert(m_spdbSnapshotHOLDER->m_spstorage != nullptr); // the only case where we can have a tombstone without a snapshot child is if a storage engine is set
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
const char *key = (const char*)dictGetKey(deSnapshot);
|
const char *key = (const char*)dictGetKey(deSnapshot);
|
||||||
dictDelete(m_spdbSnapshotHOLDER->m_pdict, key);
|
dictDelete(m_spdbSnapshotHOLDER->m_pdict, key);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user