aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/zenserver/projectstore/projectstore.cpp60
1 files changed, 47 insertions, 13 deletions
diff --git a/src/zenserver/projectstore/projectstore.cpp b/src/zenserver/projectstore/projectstore.cpp
index 7e03432d6..5d9d7aa24 100644
--- a/src/zenserver/projectstore/projectstore.cpp
+++ b/src/zenserver/projectstore/projectstore.cpp
@@ -4513,25 +4513,59 @@ ProjectStore::Rpc(HttpServerRequest& HttpReq,
ZEN_TRACE_CPU("Store::Rpc::getchunks");
CbPackage ResponsePackage;
{
- CbArrayView ChunksArray = Cb["chunks"sv].AsArrayView();
- CbObjectWriter ResponseWriter;
- ResponseWriter.BeginArray("chunks"sv);
+ CbArrayView ChunksArray = Cb["chunks"sv].AsArrayView();
+ std::vector<IoHash> ChunkHashes;
+ ChunkHashes.reserve(ChunksArray.Num());
for (CbFieldView FieldView : ChunksArray)
{
- IoHash RawHash = FieldView.AsHash();
- IoBuffer ChunkBuffer = m_CidStore.FindChunkByCid(RawHash);
- if (ChunkBuffer)
- {
- CompressedBuffer Compressed = CompressedBuffer::FromCompressedNoValidate(std::move(ChunkBuffer));
- if (Compressed)
+ ChunkHashes.push_back(FieldView.AsHash());
+ }
+
+ std::vector<CompressedBuffer> CompressedBuffers;
+ CompressedBuffers.resize(ChunksArray.Num());
+ (void)m_CidStore.IterateChunks(
+ ChunkHashes,
+ [&](size_t Index, const IoBuffer& Payload) {
+ try
{
- ResponseWriter.AddHash(RawHash);
- ResponsePackage.AddAttachment(CbAttachment(std::move(Compressed), RawHash));
+ IoHash RawHash;
+ uint64_t RawSize;
+ CompressedBuffer Compressed = CompressedBuffer::FromCompressed(SharedBuffer(Payload), RawHash, RawSize);
+ if (Compressed && ChunkHashes[Index] == RawHash)
+ {
+ CompressedBuffers[Index] = Compressed.MakeOwned();
+ }
+ else
+ {
+ ZEN_WARN("oplog '{}/{}': invalid compressed binary in cas store for {}",
+ ProjectId,
+ OplogId,
+ ChunkHashes[Index]);
+ }
+ return true;
}
- else
+ catch (const std::exception& Ex)
{
- ZEN_WARN("oplog '{}/{}': invalid compressed binary in cas store for {}", ProjectId, OplogId, RawHash);
+ ZEN_WARN("oplog '{}/{}': failed getting chunk in batch request for chunk {}. Reason: '{}'",
+ ProjectId,
+ OplogId,
+ ChunkHashes[Index],
+ Ex.what());
}
+ return true;
+ },
+ &GetSmallWorkerPool(EWorkloadType::Burst));
+
+ CbObjectWriter ResponseWriter;
+ ResponseWriter.BeginArray("chunks"sv);
+ for (size_t Index = 0; Index < ChunkHashes.size(); Index++)
+ {
+ CompressedBuffer& Compressed = CompressedBuffers[Index];
+ if (Compressed)
+ {
+ const IoHash& RawHash = ChunkHashes[Index];
+ ResponseWriter.AddHash(RawHash);
+ ResponsePackage.AddAttachment(CbAttachment(std::move(Compressed), RawHash));
}
}
ResponseWriter.EndArray();