diff options
| author | Dan Engelbrecht <[email protected]> | 2022-04-26 13:36:02 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-04-26 13:36:02 +0200 |
| commit | f7476199742256fed6f867afb6db8cecdacfe547 (patch) | |
| tree | 43cc47fdc9fea18668e7f6ce95f9a84851fa33dc | |
| parent | Compute tweaks (#78) (diff) | |
| download | zen-f7476199742256fed6f867afb6db8cecdacfe547.tar.xz zen-f7476199742256fed6f867afb6db8cecdacfe547.zip | |
Batch log removal of Cid and take proper lock when modifying m_CidMap (#80)v1.0.0.4
* Batch log removal of Cid and take proper lock when modifying m_CidMap
* variable name casing
* Don't access m_Buckets without a lock
| -rw-r--r-- | zenserver/cache/structuredcachestore.cpp | 9 | ||||
| -rw-r--r-- | zenstore/cidstore.cpp | 23 |
2 files changed, 16 insertions, 16 deletions
diff --git a/zenserver/cache/structuredcachestore.cpp b/zenserver/cache/structuredcachestore.cpp index 738e4c1fd..6bf513105 100644 --- a/zenserver/cache/structuredcachestore.cpp +++ b/zenserver/cache/structuredcachestore.cpp @@ -1255,10 +1255,10 @@ ZenCacheDiskLayer::Put(std::string_view InBucket, const IoHash& HashKey, const Z auto It = m_Buckets.try_emplace(BucketName, BucketName); Bucket = &It.first->second; - std::filesystem::path bucketPath = m_RootDir; - bucketPath /= BucketName; + std::filesystem::path BucketPath = m_RootDir; + BucketPath /= BucketName; - Bucket->OpenOrCreate(bucketPath); + Bucket->OpenOrCreate(BucketPath); } } @@ -1363,11 +1363,12 @@ void ZenCacheDiskLayer::Flush() { std::vector<CacheBucket*> Buckets; - Buckets.reserve(m_Buckets.size()); + { RwLock::SharedLockScope _(m_Lock); + Buckets.reserve(m_Buckets.size()); for (auto& Kv : m_Buckets) { Buckets.push_back(&Kv.second); diff --git a/zenstore/cidstore.cpp b/zenstore/cidstore.cpp index 509d21abe..55bec817f 100644 --- a/zenstore/cidstore.cpp +++ b/zenstore/cidstore.cpp @@ -234,23 +234,22 @@ struct CidStore::Impl void RemoveCids(CasChunkSet& CasChunks) { - RwLock::ExclusiveLockScope _(m_Lock); - - for (auto It = m_CidMap.begin(), End = m_CidMap.end(); It != End;) + std::vector<IndexEntry> RemovedEntries; + RemovedEntries.reserve(CasChunks.GetSize()); { - if (CasChunks.ContainsChunk(It->second)) - { - const IoHash& BadHash = It->first; - - // Log a tombstone record - LogMapping(BadHash, IoHash::Zero); - It = m_CidMap.erase(It); - } - else + RwLock::ExclusiveLockScope _(m_Lock); + for (auto It = m_CidMap.begin(), End = m_CidMap.end(); It != End;) { + if (CasChunks.ContainsChunk(It->second)) + { + RemovedEntries.push_back({It->first, IoHash::Zero}); + It = m_CidMap.erase(It); + continue; + } ++It; } } + m_LogFile.Append(RemovedEntries); } uint64_t m_LastScrubTime = 0; |