diff options
| author | Per Larsson <[email protected]> | 2021-11-10 14:58:04 +0100 |
|---|---|---|
| committer | Per Larsson <[email protected]> | 2021-11-10 14:58:04 +0100 |
| commit | 39e064c35abd6bc8d2d32b9bb99b5805d1d1e78c (patch) | |
| tree | e7cab621b666dd2dbeabdbded116d7839a5a2c96 /zenserver/cache/structuredcache.cpp | |
| parent | Changed RPC keys to camel case. (diff) | |
| download | zen-39e064c35abd6bc8d2d32b9bb99b5805d1d1e78c.tar.xz zen-39e064c35abd6bc8d2d32b9bb99b5805d1d1e78c.zip | |
Honor cache policy.
Diffstat (limited to 'zenserver/cache/structuredcache.cpp')
| -rw-r--r-- | zenserver/cache/structuredcache.cpp | 72 |
1 files changed, 48 insertions, 24 deletions
diff --git a/zenserver/cache/structuredcache.cpp b/zenserver/cache/structuredcache.cpp index 45f626ff5..de2fcb27c 100644 --- a/zenserver/cache/structuredcache.cpp +++ b/zenserver/cache/structuredcache.cpp @@ -833,11 +833,12 @@ HttpStructuredCacheService::HandleBatchGetCacheRecords(zen::HttpServerRequest& R CacheRecordPolicy::FromCompactBinary(Params["Policy"sv].AsObjectView(), Policy); const bool SkipAttachments = (Policy.GetRecordPolicy() & CachePolicy::SkipAttachments) == CachePolicy::SkipAttachments; - const bool QueryUpstream = m_UpstreamCache && ((Policy.GetRecordPolicy() & CachePolicy::QueryRemote) == CachePolicy::QueryRemote); + const bool QueryRemote = m_UpstreamCache && ((Policy.GetRecordPolicy() & CachePolicy::QueryRemote) == CachePolicy::QueryRemote); std::vector<CacheKey> CacheKeys; std::vector<IoBuffer> CacheValues; std::vector<IoBuffer> Payloads; + std::vector<size_t> UpstreamRequests; std::vector<size_t> Missing; for (CbFieldView QueryView : Params["CacheKeys"sv]) @@ -884,6 +885,10 @@ HttpStructuredCacheService::HandleBatchGetCacheRecords(zen::HttpServerRequest& R CacheValues[KeyIndex] = CacheValue.Value; m_CacheStats.HitCount++; } + else if (QueryRemote) + { + UpstreamRequests.push_back(KeyIndex); + } else { Missing.push_back(KeyIndex); @@ -892,11 +897,11 @@ HttpStructuredCacheService::HandleBatchGetCacheRecords(zen::HttpServerRequest& R ++KeyIndex; } - if (!Missing.empty() && QueryUpstream) + if (!UpstreamRequests.empty() && m_UpstreamCache) { auto UpstreamResult = m_UpstreamCache->GetCacheRecords( CacheKeys, - Missing, + UpstreamRequests, [this, &CacheKeys, &CacheValues, &Payloads, SkipAttachments](size_t KeyIndex, IoBuffer UpstreamValue) { const CacheKey& Key = CacheKeys[KeyIndex]; CbPackage UpstreamPackage; @@ -930,7 +935,10 @@ HttpStructuredCacheService::HandleBatchGetCacheRecords(zen::HttpServerRequest& R } }); - Missing = std::move(UpstreamResult.Missing); + for (size_t MissingUpstream : UpstreamResult.Missing) + { + Missing.push_back(MissingUpstream); + } } for (size_t KeyIndex : Missing) @@ -1007,12 +1015,8 @@ HttpStructuredCacheService::HandleBatchGetCachePayloads(zen::HttpServerRequest& CbObjectView Params = BatchRequest["Params"sv].AsObjectView(); - CacheRecordPolicy Policy; - CacheRecordPolicy::FromCompactBinary(Params["Policy"sv].AsObjectView(), Policy); - - const bool QueryUpstream = m_UpstreamCache && ((Policy.GetRecordPolicy() & CachePolicy::QueryRemote) == CachePolicy::QueryRemote); - std::vector<CacheChunkRequest> ChunkRequests; + std::vector<size_t> UpstreamRequests; std::vector<size_t> Missing; for (CbFieldView ChunkView : Params["ChunkRequests"sv]) @@ -1063,31 +1067,46 @@ HttpStructuredCacheService::HandleBatchGetCachePayloads(zen::HttpServerRequest& for (size_t RequestIndex = 0; const CacheChunkRequest& ChunkRequest : ChunkRequests) { - if (IoBuffer Chunk = m_CidStore.FindChunkByCid(ChunkRequest.ChunkId)) + const bool QueryLocal = (ChunkRequest.Policy & CachePolicy::QueryLocal) == CachePolicy::QueryLocal; + const bool QueryRemote = (ChunkRequest.Policy & CachePolicy::QueryRemote) == CachePolicy::QueryRemote; + + if (QueryLocal) { - ZEN_DEBUG("HIT - '{}/{}/{}' {} '{}' ({})", - ChunkRequest.Key.Bucket, - ChunkRequest.Key.Hash, - ChunkRequest.ChunkId, - NiceBytes(Chunk.Size()), - ToString(Chunk.GetContentType()), - "LOCAL"); - - Chunks[RequestIndex] = Chunk; - m_CacheStats.HitCount++; + if (IoBuffer Chunk = m_CidStore.FindChunkByCid(ChunkRequest.ChunkId)) + { + ZEN_DEBUG("HIT - '{}/{}/{}' {} '{}' ({})", + ChunkRequest.Key.Bucket, + ChunkRequest.Key.Hash, + ChunkRequest.ChunkId, + NiceBytes(Chunk.Size()), + ToString(Chunk.GetContentType()), + "LOCAL"); + + Chunks[RequestIndex] = Chunk; + m_CacheStats.HitCount++; + } + else if (QueryRemote) + { + UpstreamRequests.push_back(RequestIndex); + } + else + { + Missing.push_back(RequestIndex); + } } else { - Missing.push_back(RequestIndex); + ZEN_DEBUG("SKIP - '{}/{}/{}'", ChunkRequest.Key.Bucket, ChunkRequest.Key.Hash, ChunkRequest.ChunkId); } + ++RequestIndex; } - if (!Missing.empty() && QueryUpstream) + if (!UpstreamRequests.empty() && m_UpstreamCache) { auto UpstreamResult = m_UpstreamCache->GetCachePayloads( ChunkRequests, - Missing, + UpstreamRequests, [this, &ChunkRequests, &Chunks](size_t ChunkIndex, IoBuffer UpstreamValue) { const CacheChunkRequest& ChunkRequest = ChunkRequests[ChunkIndex]; @@ -1105,6 +1124,8 @@ HttpStructuredCacheService::HandleBatchGetCachePayloads(zen::HttpServerRequest& "UPSTREAM"); Chunks[ChunkIndex] = Chunk; + + m_CacheStats.HitCount++; m_CacheStats.UpstreamHitCount++; } else @@ -1113,7 +1134,10 @@ HttpStructuredCacheService::HandleBatchGetCachePayloads(zen::HttpServerRequest& } }); - Missing = std::move(UpstreamResult.Missing); + for (size_t MissingUpstream : UpstreamResult.Missing) + { + Missing.push_back(MissingUpstream); + } } for (size_t RequestIndex : Missing) |