diff options
| -rw-r--r-- | CHANGELOG.md | 1 | ||||
| -rw-r--r-- | VERSION.txt | 2 | ||||
| -rw-r--r-- | src/zenserver/cache/cachedisklayer.cpp | 32 |
3 files changed, 24 insertions, 11 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 1badacf21..1ce5c9dc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ - Garbage collect references to currently writing block but keep the block as new data may be added - Fix BlockStore::Prune used disk space calculation - Don't materialize data in filecas when we just need the size + - Don't lock entire disk cache layer when doing GatherReferences/CollectGarbage - Improvement: Catch Out Of Memory and Out Of Disk exceptions and report back to requester without reporting an error to Sentry - Improvement: If creating bucket fails when storing an item in the structured cache, log a warning and propagate error to requester without reporting an error to Sentry - Improvement: Make an explicit flush of the active block written to in blockstore flush diff --git a/VERSION.txt b/VERSION.txt index fe1dba026..e7980dd97 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -0.2.26-pre2
\ No newline at end of file +0.2.26-pre3
\ No newline at end of file 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<CacheBucket*> 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<CacheBucket*> 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); } } |