diff options
| author | Dan Engelbrecht <[email protected]> | 2023-11-10 16:12:59 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-11-10 16:12:59 +0100 |
| commit | fa7c53b1dec7254bf793e7c0df82eb486a7490a5 (patch) | |
| tree | 4eb9e8885231eb8364a7ec22d75b2f5a9626dca0 /src/zenserver/cache/cachedisklayer.cpp | |
| parent | reduce memory footprint for bucket indexes (#526) (diff) | |
| download | zen-fa7c53b1dec7254bf793e7c0df82eb486a7490a5.tar.xz zen-fa7c53b1dec7254bf793e7c0df82eb486a7490a5.zip | |
fix bad access to unlocked state (#527)
* don't touch non-locked data when creating manifest
* safety assert for test dir
Diffstat (limited to 'src/zenserver/cache/cachedisklayer.cpp')
| -rw-r--r-- | src/zenserver/cache/cachedisklayer.cpp | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/src/zenserver/cache/cachedisklayer.cpp b/src/zenserver/cache/cachedisklayer.cpp index 2d28c4875..4289c96f9 100644 --- a/src/zenserver/cache/cachedisklayer.cpp +++ b/src/zenserver/cache/cachedisklayer.cpp @@ -972,9 +972,10 @@ ZenCacheDiskLayer::CacheBucket::Flush() m_BlockStore.Flush(/*ForceNewBlock*/ false); m_SlogFile.Flush(); - std::vector<AccessTime> AccessTimes; - std::vector<BucketPayload> Payloads; - IndexMap Index; + std::vector<AccessTime> AccessTimes; + std::vector<BucketPayload> Payloads; + std::vector<BucketMetaData> MetaDatas; + IndexMap Index; { RwLock::SharedLockScope IndexLock(m_IndexLock); @@ -982,8 +983,9 @@ ZenCacheDiskLayer::CacheBucket::Flush() Index = m_Index; Payloads = m_Payloads; AccessTimes = m_AccessTimes; + MetaDatas = m_MetaDatas; } - SaveManifest(MakeManifest(std::move(Index), std::move(AccessTimes), Payloads)); + SaveManifest(MakeManifest(std::move(Index), std::move(AccessTimes), Payloads, MetaDatas)); } catch (std::exception& Ex) { @@ -1026,15 +1028,16 @@ ZenCacheDiskLayer::CacheBucket::SaveManifest(CbObject&& Manifest, const std::fun } CbObject -ZenCacheDiskLayer::CacheBucket::MakeManifest(IndexMap&& Index, - std::vector<AccessTime>&& AccessTimes, - const std::vector<BucketPayload>& Payloads) +ZenCacheDiskLayer::CacheBucket::MakeManifest(IndexMap&& Index, + std::vector<AccessTime>&& AccessTimes, + const std::vector<BucketPayload>& Payloads, + const std::vector<BucketMetaData>& MetaDatas) { using namespace std::literals; ZEN_TRACE_CPU("Z$::Disk::Bucket::MakeManifest"); - size_t ItemCount = m_Index.size(); + size_t ItemCount = Index.size(); // This tends to overestimate a little bit but it is still way more accurate than what we get with exponential growth // And we don't need to reallocate theunderying buffer in almost every case @@ -1045,7 +1048,7 @@ ZenCacheDiskLayer::CacheBucket::MakeManifest(IndexMap&& Index, Writer << "BucketId"sv << m_BucketId; Writer << "Version"sv << CurrentDiskBucketVersion; - if (!m_Index.empty()) + if (!Index.empty()) { Writer.AddInteger("Count"sv, gsl::narrow<std::uint64_t>(Index.size())); Writer.BeginArray("Keys"sv); @@ -1064,7 +1067,7 @@ ZenCacheDiskLayer::CacheBucket::MakeManifest(IndexMap&& Index, } Writer.EndArray(); - if (!m_MetaDatas.empty()) + if (!MetaDatas.empty()) { Writer.BeginArray("RawHash"sv); for (auto& Kv : Index) @@ -1072,7 +1075,7 @@ ZenCacheDiskLayer::CacheBucket::MakeManifest(IndexMap&& Index, const BucketPayload& Payload = Payloads[Kv.second]; if (Payload.MetaData) { - Writer.AddHash(m_MetaDatas[Payload.MetaData].RawHash); + Writer.AddHash(MetaDatas[Payload.MetaData].RawHash); } else { @@ -1087,7 +1090,7 @@ ZenCacheDiskLayer::CacheBucket::MakeManifest(IndexMap&& Index, const BucketPayload& Payload = Payloads[Kv.second]; if (Payload.MetaData) { - Writer.AddInteger(m_MetaDatas[Payload.MetaData].RawSize); + Writer.AddInteger(MetaDatas[Payload.MetaData].RawSize); } else { @@ -1671,17 +1674,20 @@ ZenCacheDiskLayer::CacheBucket::CollectGarbage(GcContext& GcCtx) try { - std::vector<AccessTime> AccessTimes; - std::vector<BucketPayload> Payloads; - IndexMap Index; + std::vector<AccessTime> AccessTimes; + std::vector<BucketPayload> Payloads; + std::vector<BucketMetaData> MetaDatas; + IndexMap Index; { RwLock::SharedLockScope IndexLock(m_IndexLock); MakeIndexSnapshot([&]() { return GcCtx.ClaimGCReserve(); }); Index = m_Index; Payloads = m_Payloads; AccessTimes = m_AccessTimes; + MetaDatas = m_MetaDatas; } - SaveManifest(MakeManifest(std::move(Index), std::move(AccessTimes), Payloads), [&]() { return GcCtx.ClaimGCReserve(); }); + SaveManifest(MakeManifest(std::move(Index), std::move(AccessTimes), Payloads, MetaDatas), + [&]() { return GcCtx.ClaimGCReserve(); }); } catch (std::exception& Ex) { |