Fix deadlock in storage cache

Former-commit-id: e74711e8131cd29a1e0294fbb28e1737ee98afce
This commit is contained in:
John Sully 2021-06-14 06:32:58 +00:00
parent df19692fd8
commit bdc29a935e

View File

@ -130,9 +130,10 @@ void StorageCache::retrieve(sds key, IStorage::callbackSingle fn) const
size_t StorageCache::count() const size_t StorageCache::count() const
{ {
std::unique_lock<fastlock> ul(m_lock); std::unique_lock<fastlock> ul(m_lock, std::defer_lock);
bool fLocked = ul.try_lock();
size_t count = m_spstorage->count(); size_t count = m_spstorage->count();
if (m_pdict != nullptr) { if (m_pdict != nullptr && fLocked) {
serverAssert(bulkInsertsInProgress.load(std::memory_order_seq_cst) || count == (dictSize(m_pdict) + m_collisionCount)); serverAssert(bulkInsertsInProgress.load(std::memory_order_seq_cst) || count == (dictSize(m_pdict) + m_collisionCount));
} }
return count; return count;
@ -140,6 +141,5 @@ size_t StorageCache::count() const
void StorageCache::beginWriteBatch() { void StorageCache::beginWriteBatch() {
serverAssert(GlobalLocksAcquired()); // Otherwise we deadlock serverAssert(GlobalLocksAcquired()); // Otherwise we deadlock
m_lock.lock();
m_spstorage->beginWriteBatch(); m_spstorage->beginWriteBatch();
} }