Fix assert caused by freeTombstoneObjects and null check in consolidate_children

Former-commit-id: 8565a02b331cd2bba2a1c7c6693dfb3f6e61c845
This commit is contained in:
John Sully 2020-08-10 05:01:36 +00:00
parent 848057ff19
commit 4037ee98a4

View File

@ -238,15 +238,14 @@ void redisDbPersistentDataSnapshot::freeTombstoneObjects(int depth)
dictIterator *di = dictGetIterator(m_pdictTombstone); dictIterator *di = dictGetIterator(m_pdictTombstone);
dictEntry *de; dictEntry *de;
size_t freed = 0;
while ((de = dictNext(di)) != nullptr) while ((de = dictNext(di)) != nullptr)
{ {
dictEntry *deObj = dictFind(m_pdbSnapshot->m_pdict, dictGetKey(de)); dictEntry *deObj = dictFind(m_pdbSnapshot->m_pdict, dictGetKey(de));
if (deObj != nullptr && dictGetVal(deObj) != nullptr) if (deObj != nullptr && dictGetVal(deObj) != nullptr)
{ {
decrRefCount((robj*)dictGetVal(deObj)); decrRefCount((robj*)dictGetVal(deObj));
deObj->v.val = nullptr; void *ptrSet = nullptr;
++freed; __atomic_store(&deObj->v.val, &ptrSet, __ATOMIC_RELAXED);
} }
} }
dictReleaseIterator(di); dictReleaseIterator(di);
@ -465,7 +464,7 @@ bool redisDbPersistentDataSnapshot::iterate_threadsafe(std::function<bool(const
// Take the size so we can ensure we visited every element exactly once // Take the size so we can ensure we visited every element exactly once
// use volatile to ensure it's not checked too late. This makes it more // use volatile to ensure it's not checked too late. This makes it more
// likely we'll detect races (but it won't gurantee it) // likely we'll detect races (but it won't gurantee it)
volatile size_t celem = size(); volatile ssize_t celem = (ssize_t)size();
dictEntry *de = nullptr; dictEntry *de = nullptr;
bool fResult = true; bool fResult = true;
@ -570,9 +569,11 @@ void redisDbPersistentDataSnapshot::consolidate_children(redisDbPersistentData *
volatile size_t skipped = 0; volatile size_t skipped = 0;
m_pdbSnapshot->iterate_threadsafe([&](const char *key, robj_roptr o) { m_pdbSnapshot->iterate_threadsafe([&](const char *key, robj_roptr o) {
if (o != nullptr) { if (o != nullptr || !m_spstorage) {
dictAdd(spdb->m_pdict, sdsdupshared(key), o.unsafe_robjcast()); dictAdd(spdb->m_pdict, sdsdupshared(key), o.unsafe_robjcast());
if (o != nullptr) {
incrRefCount(o); incrRefCount(o);
}
} else { } else {
++skipped; ++skipped;
} }