Ensure we are responsive during storagecache clears

This commit is contained in:
John Sully 2022-04-27 17:32:40 +00:00
parent 48128dd4c7
commit cfa9ba8eb1
4 changed files with 21 additions and 6 deletions

View File

@ -31,11 +31,25 @@ StorageCache::~StorageCache()
dictRelease(m_pdict); dictRelease(m_pdict);
} }
void StorageCache::clear() void StorageCache::clear(void(callback)(void*))
{ {
std::unique_lock<fastlock> ul(m_lock); std::unique_lock<fastlock> ul(m_lock);
if (m_pdict != nullptr) if (m_pdict != nullptr)
dictEmpty(m_pdict, nullptr); dictEmpty(m_pdict, callback);
m_spstorage->clear();
m_collisionCount = 0;
}
void StorageCache::clearAsync()
{
std::unique_lock<fastlock> ul(m_lock);
if (m_pdict != nullptr) {
dict *dSav = m_pdict;
m_pdict = dictCreate(&dbStorageCacheType, nullptr);
g_pserver->asyncworkqueue->AddWorkFunction([dSav]{
dictEmpty(dSav, nullptr);
});
}
m_spstorage->clear(); m_spstorage->clear();
m_collisionCount = 0; m_collisionCount = 0;
} }

View File

@ -38,7 +38,8 @@ public:
return cache; return cache;
} }
void clear(); void clear(void(callback)(void*));
void clearAsync();
void insert(sds key, const void *data, size_t cbdata, bool fOverwrite); void insert(sds key, const void *data, size_t cbdata, bool fOverwrite);
void bulkInsert(char **rgkeys, size_t *rgcbkeys, char **rgvals, size_t *rgcbvals, size_t celem); void bulkInsert(char **rgkeys, size_t *rgcbkeys, char **rgvals, size_t *rgcbvals, size_t celem);
void retrieve(sds key, IStorage::callbackSingle fn) const; void retrieve(sds key, IStorage::callbackSingle fn) const;

View File

@ -2706,7 +2706,7 @@ void redisDbPersistentData::clear(void(callback)(void*))
delete m_setexpire; delete m_setexpire;
m_setexpire = new (MALLOC_LOCAL) expireset(); m_setexpire = new (MALLOC_LOCAL) expireset();
if (m_spstorage != nullptr) if (m_spstorage != nullptr)
m_spstorage->clear(); m_spstorage->clear(callback);
dictEmpty(m_pdictTombstone,callback); dictEmpty(m_pdictTombstone,callback);
m_pdbSnapshot = nullptr; m_pdbSnapshot = nullptr;
} }
@ -2926,7 +2926,7 @@ bool redisDbPersistentData::processChanges(bool fSnapshot)
if (m_fAllChanged) if (m_fAllChanged)
{ {
if (dictSize(m_pdict) > 0 || m_spstorage->count() > 0) { // in some cases we may have pre-sized the StorageCache's dict, and we don't want clear to ruin it if (dictSize(m_pdict) > 0 || m_spstorage->count() > 0) { // in some cases we may have pre-sized the StorageCache's dict, and we don't want clear to ruin it
m_spstorage->clear(); m_spstorage->clearAsync();
storeDatabase(); storeDatabase();
} }
m_fAllChanged = 0; m_fAllChanged = 0;

View File

@ -223,7 +223,7 @@ void redisDbPersistentData::emptyDbAsync() {
m_setexpire = new (MALLOC_LOCAL) expireset(); m_setexpire = new (MALLOC_LOCAL) expireset();
m_pdict = dictCreate(&dbDictType,this); m_pdict = dictCreate(&dbDictType,this);
if (m_spstorage != nullptr) if (m_spstorage != nullptr)
m_spstorage->clear(); m_spstorage->clearAsync();
if (m_fTrackingChanges) if (m_fTrackingChanges)
m_fAllChanged = true; m_fAllChanged = true;
atomicIncr(lazyfree_objects,dictSize(oldht1)); atomicIncr(lazyfree_objects,dictSize(oldht1));