aboutsummaryrefslogtreecommitdiff
path: root/zenserver/cache/structuredcache.cpp
diff options
context:
space:
mode:
authorPer Larsson <[email protected]>2021-11-10 14:58:04 +0100
committerPer Larsson <[email protected]>2021-11-10 14:58:04 +0100
commit39e064c35abd6bc8d2d32b9bb99b5805d1d1e78c (patch)
treee7cab621b666dd2dbeabdbded116d7839a5a2c96 /zenserver/cache/structuredcache.cpp
parentChanged RPC keys to camel case. (diff)
downloadzen-39e064c35abd6bc8d2d32b9bb99b5805d1d1e78c.tar.xz
zen-39e064c35abd6bc8d2d32b9bb99b5805d1d1e78c.zip
Honor cache policy.
Diffstat (limited to 'zenserver/cache/structuredcache.cpp')
-rw-r--r--zenserver/cache/structuredcache.cpp72
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)