diff options
| author | Dan Engelbrecht <[email protected]> | 2024-09-10 09:33:29 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2024-09-10 09:33:29 +0200 |
| commit | 335ba71ee3582513f03f19e112c8c34a3617eff5 (patch) | |
| tree | f20e87e605dbd40c61a041390f7ebf76f5dc4d22 /src/zenstore/cache/cachedisklayer.cpp | |
| parent | fix race condition in zenserver during batched fetch (#149) (diff) | |
| download | zen-335ba71ee3582513f03f19e112c8c34a3617eff5.tar.xz zen-335ba71ee3582513f03f19e112c8c34a3617eff5.zip | |
only add mem cached items to list to fill metadata if we don't have metadata (#151)
Diffstat (limited to 'src/zenstore/cache/cachedisklayer.cpp')
| -rw-r--r-- | src/zenstore/cache/cachedisklayer.cpp | 79 |
1 files changed, 39 insertions, 40 deletions
diff --git a/src/zenstore/cache/cachedisklayer.cpp b/src/zenstore/cache/cachedisklayer.cpp index 7c9b56b1b..d103c32b0 100644 --- a/src/zenstore/cache/cachedisklayer.cpp +++ b/src/zenstore/cache/cachedisklayer.cpp @@ -1373,7 +1373,10 @@ ZenCacheDiskLayer::CacheBucket::EndGetBatch(GetBatchHandle* Batch) noexcept if (Payload.MemCached) { OutValue.Value = m_MemCachedPayloads[Payload.MemCached].Payload; - MemCachedKeyIndexes.push_back(KeyIndex); + if (FillRawHashAndRawSize[KeyIndex]) + { + MemCachedKeyIndexes.push_back(KeyIndex); + } m_MemoryHitCount++; } else @@ -1429,7 +1432,7 @@ ZenCacheDiskLayer::CacheBucket::EndGetBatch(GetBatchHandle* Batch) noexcept if (SetMetaInfo) { // See ZenCacheDiskLayer::CacheBucket::Get - it sets the memcache part first and then if it needs to it set the - // metadata sparately, check if it had time to set the metdata + // metadata separately, check if it had time to set the metdata RwLock::SharedLockScope UpdateIndexLock(m_IndexLock); if (auto UpdateIt = m_Index.find(Key); UpdateIt != m_Index.end()) { @@ -1537,57 +1540,53 @@ ZenCacheDiskLayer::CacheBucket::EndGetBatch(GetBatchHandle* Batch) noexcept { const IoHash& Key = Batch->Keys[KeyIndex]; bool SetMetaInfo = FillRawHashAndRawSize[KeyIndex]; - if (SetMetaInfo) + ZEN_ASSERT(SetMetaInfo); + ZEN_TRACE_CPU("Z$::Bucket::EndGetBatch::MetaData"); + size_t ResultIndex = Batch->ResultIndexes[KeyIndex]; + ZenCacheValue& OutValue = Batch->OutResults[ResultIndex]; { - ZEN_TRACE_CPU("Z$::Bucket::EndGetBatch::MetaData"); - size_t ResultIndex = Batch->ResultIndexes[KeyIndex]; - ZenCacheValue& OutValue = Batch->OutResults[ResultIndex]; + // See ZenCacheDiskLayer::CacheBucket::Get - it sets the memcache part first and then if it needs to it set the + // metadata separately, check if it had time to set the metdata + RwLock::SharedLockScope UpdateIndexLock(m_IndexLock); + if (auto UpdateIt = m_Index.find(Key); UpdateIt != m_Index.end()) { - // See ZenCacheDiskLayer::CacheBucket::Get - it sets the memcache part first and then if it needs to it set the - // metadata sparately, check if it had time to set the metdata - RwLock::SharedLockScope UpdateIndexLock(m_IndexLock); - if (auto UpdateIt = m_Index.find(Key); UpdateIt != m_Index.end()) + BucketPayload& Payload = m_Payloads[UpdateIt->second]; + if (Payload.MetaData) { - BucketPayload& Payload = m_Payloads[UpdateIt->second]; - if (Payload.MetaData) - { - const BucketMetaData& MetaData = m_MetaDatas[Payload.MetaData]; - OutValue.RawHash = MetaData.RawHash; - OutValue.RawSize = MetaData.RawSize; - SetMetaInfo = false; - } + const BucketMetaData& MetaData = m_MetaDatas[Payload.MetaData]; + OutValue.RawHash = MetaData.RawHash; + OutValue.RawSize = MetaData.RawSize; + SetMetaInfo = false; } } + } - if (SetMetaInfo) + if (SetMetaInfo) + { + if (OutValue.Value.GetContentType() == ZenContentType::kCompressedBinary) { - if (OutValue.Value.GetContentType() == ZenContentType::kCompressedBinary) - { - if (!CompressedBuffer::ValidateCompressedHeader(OutValue.Value, OutValue.RawHash, OutValue.RawSize)) - { - OutValue = ZenCacheValue{}; - } - } - else + if (!CompressedBuffer::ValidateCompressedHeader(OutValue.Value, OutValue.RawHash, OutValue.RawSize)) { - OutValue.RawHash = IoHash::HashBuffer(OutValue.Value); - OutValue.RawSize = OutValue.Value.GetSize(); + OutValue = ZenCacheValue{}; } + } + else + { + OutValue.RawHash = IoHash::HashBuffer(OutValue.Value); + OutValue.RawSize = OutValue.Value.GetSize(); + } + { + RwLock::ExclusiveLockScope UpdateIndexLock(m_IndexLock); { - RwLock::ExclusiveLockScope UpdateIndexLock(m_IndexLock); + if (auto UpdateIt = m_Index.find(Key); UpdateIt != m_Index.end()) { - if (auto UpdateIt = m_Index.find(Key); UpdateIt != m_Index.end()) + BucketPayload& Payload = m_Payloads[UpdateIt->second]; + + // Only update if it has not already been updated by other thread + if (!Payload.MetaData) { - BucketPayload& Payload = m_Payloads[UpdateIt->second]; - - // Only update if it has not already been updated by other thread - if (!Payload.MetaData) - { - SetMetaData(UpdateIndexLock, - Payload, - {.RawSize = OutValue.RawSize, .RawHash = OutValue.RawHash}); - } + SetMetaData(UpdateIndexLock, Payload, {.RawSize = OutValue.RawSize, .RawHash = OutValue.RawHash}); } } } |