From a6c0facba83398d74e1f6d1b04a3641731af73b0 Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Thu, 5 Oct 2023 11:30:52 +0200 Subject: reduce lock in disklayer (#447) * Don't block all write access to all buckets when doing GatherReferences/CollectGarbage --- src/zenserver/cache/cachedisklayer.cpp | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) (limited to 'src/zenserver/cache/cachedisklayer.cpp') diff --git a/src/zenserver/cache/cachedisklayer.cpp b/src/zenserver/cache/cachedisklayer.cpp index 7ce713de9..fafc6bbee 100644 --- a/src/zenserver/cache/cachedisklayer.cpp +++ b/src/zenserver/cache/cachedisklayer.cpp @@ -1805,12 +1805,18 @@ ZenCacheDiskLayer::CollectGarbage(GcContext& GcCtx) { ZEN_TRACE_CPU("Z$::Disk::CollectGarbage"); - RwLock::SharedLockScope _(m_Lock); - - for (auto& Kv : m_Buckets) + std::vector Buckets; + { + RwLock::SharedLockScope _(m_Lock); + Buckets.reserve(m_Buckets.size()); + for (auto& Kv : m_Buckets) + { + Buckets.push_back(Kv.second.get()); + } + } + for (CacheBucket* Bucket : Buckets) { - CacheBucket& Bucket = *Kv.second; - Bucket.CollectGarbage(GcCtx); + Bucket->CollectGarbage(GcCtx); } } @@ -2261,12 +2267,18 @@ ZenCacheDiskLayer::GatherReferences(GcContext& GcCtx) { ZEN_TRACE_CPU("Z$::Disk::GatherReferences"); - RwLock::SharedLockScope _(m_Lock); - - for (auto& Kv : m_Buckets) + std::vector Buckets; + { + RwLock::SharedLockScope _(m_Lock); + Buckets.reserve(m_Buckets.size()); + for (auto& Kv : m_Buckets) + { + Buckets.push_back(Kv.second.get()); + } + } + for (CacheBucket* Bucket : Buckets) { - CacheBucket& Bucket = *Kv.second; - Bucket.GatherReferences(GcCtx); + Bucket->GatherReferences(GcCtx); } } -- cgit v1.2.3