Merge the expire datastructs on endsnapshot
Former-commit-id: 968681ac37d1505a7b38628425f60e08b2cd41c4
This commit is contained in:
parent
7e55564409
commit
d44dc77ca2
@ -183,30 +183,36 @@ void redisDbPersistentData::endSnapshot(const redisDbPersistentDataSnapshot *psn
|
|||||||
di = dictGetIterator(m_pdict);
|
di = dictGetIterator(m_pdict);
|
||||||
while ((de = dictNext(di)) != NULL)
|
while ((de = dictNext(di)) != NULL)
|
||||||
{
|
{
|
||||||
|
robj *o = (robj*)dictGetVal(de);
|
||||||
dictEntry *deExisting = dictFind(m_spdbSnapshotHOLDER->m_pdict, (const char*)dictGetKey(de));
|
dictEntry *deExisting = dictFind(m_spdbSnapshotHOLDER->m_pdict, (const char*)dictGetKey(de));
|
||||||
if (deExisting != nullptr)
|
if (deExisting != nullptr)
|
||||||
{
|
{
|
||||||
if (dictGetVal(deExisting) != nullptr)
|
if (dictGetVal(deExisting) != nullptr)
|
||||||
decrRefCount((robj*)dictGetVal(deExisting));
|
decrRefCount((robj*)dictGetVal(deExisting));
|
||||||
dictSetVal(m_spdbSnapshotHOLDER->m_pdict, deExisting, dictGetVal(de));
|
dictSetVal(m_spdbSnapshotHOLDER->m_pdict, deExisting, o);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dictAdd(m_spdbSnapshotHOLDER->m_pdict, sdsdup((sds)dictGetKey(de)), dictGetVal(de));
|
dictAdd(m_spdbSnapshotHOLDER->m_pdict, sdsdup((sds)dictGetKey(de)), o);
|
||||||
}
|
}
|
||||||
if (dictGetVal(de) != nullptr)
|
if (dictGetVal(de) != nullptr)
|
||||||
incrRefCount((robj*)dictGetVal(de));
|
incrRefCount((robj*)dictGetVal(de));
|
||||||
|
|
||||||
|
if (o->FExpires() || o == nullptr)
|
||||||
|
{
|
||||||
|
auto itr = m_setexpire->find((const char*)dictGetKey(de));
|
||||||
|
serverAssert(o == nullptr || itr != m_setexpire->end());
|
||||||
|
if (itr != m_setexpire->end())
|
||||||
|
m_spdbSnapshotHOLDER->m_setexpire->insert(*itr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dictReleaseIterator(di);
|
dictReleaseIterator(di);
|
||||||
|
|
||||||
// Stage 3 swap the databases with the snapshot
|
// Stage 3 swap the databases with the snapshot
|
||||||
std::swap(m_pdict, m_spdbSnapshotHOLDER->m_pdict);
|
std::swap(m_pdict, m_spdbSnapshotHOLDER->m_pdict);
|
||||||
|
std::swap(m_setexpire, m_spdbSnapshotHOLDER->m_setexpire);
|
||||||
if (m_spdbSnapshotHOLDER->m_pdbSnapshot != nullptr)
|
if (m_spdbSnapshotHOLDER->m_pdbSnapshot != nullptr)
|
||||||
std::swap(m_pdictTombstone, m_spdbSnapshotHOLDER->m_pdictTombstone);
|
std::swap(m_pdictTombstone, m_spdbSnapshotHOLDER->m_pdictTombstone);
|
||||||
|
|
||||||
// Stage 4 merge all expires
|
|
||||||
// TODO
|
|
||||||
std::swap(m_setexpire, m_spdbSnapshotHOLDER->m_setexpire);
|
|
||||||
|
|
||||||
// Finally free the snapshot
|
// Finally free the snapshot
|
||||||
if (m_pdbSnapshot != nullptr && m_spdbSnapshotHOLDER->m_pdbSnapshot != nullptr)
|
if (m_pdbSnapshot != nullptr && m_spdbSnapshotHOLDER->m_pdbSnapshot != nullptr)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user