From 4037ee98a4f5a27599aab2b7375b33da0e34fab6 Mon Sep 17 00:00:00 2001 From: John Sully Date: Mon, 10 Aug 2020 05:01:36 +0000 Subject: [PATCH] Fix assert caused by freeTombstoneObjects and null check in consolidate_children Former-commit-id: 8565a02b331cd2bba2a1c7c6693dfb3f6e61c845 --- src/snapshot.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/snapshot.cpp b/src/snapshot.cpp index e436a608d..0ad1b5282 100644 --- a/src/snapshot.cpp +++ b/src/snapshot.cpp @@ -238,15 +238,14 @@ void redisDbPersistentDataSnapshot::freeTombstoneObjects(int depth) dictIterator *di = dictGetIterator(m_pdictTombstone); dictEntry *de; - size_t freed = 0; while ((de = dictNext(di)) != nullptr) { dictEntry *deObj = dictFind(m_pdbSnapshot->m_pdict, dictGetKey(de)); if (deObj != nullptr && dictGetVal(deObj) != nullptr) { decrRefCount((robj*)dictGetVal(deObj)); - deObj->v.val = nullptr; - ++freed; + void *ptrSet = nullptr; + __atomic_store(&deObj->v.val, &ptrSet, __ATOMIC_RELAXED); } } dictReleaseIterator(di); @@ -465,7 +464,7 @@ bool redisDbPersistentDataSnapshot::iterate_threadsafe(std::functioniterate_threadsafe([&](const char *key, robj_roptr o) { - if (o != nullptr) { + if (o != nullptr || !m_spstorage) { dictAdd(spdb->m_pdict, sdsdupshared(key), o.unsafe_robjcast()); - incrRefCount(o); + if (o != nullptr) { + incrRefCount(o); + } } else { ++skipped; }