diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/zenserver/projectstore/projectstore.cpp | 60 |
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(); |