diff options
| author | Dan Engelbrecht <[email protected]> | 2022-12-07 11:21:41 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-12-07 02:21:41 -0800 |
| commit | 100c8f966b1c5b2fb190748f0177600562d1c5fe (patch) | |
| tree | fc85e350dea47330149a1d42eb7a6c7ae0a06111 /zenserver/projectstore.cpp | |
| parent | Cache request record/replay (#198) (diff) | |
| download | zen-100c8f966b1c5b2fb190748f0177600562d1c5fe.tar.xz zen-100c8f966b1c5b2fb190748f0177600562d1c5fe.zip | |
optimizations (#200)
* Use direct file read and direct buffer allocation for small IoBuffer materalization
* Reduce range of materialized data in CompositeBuffer reading
CompressedBuffer header reading often only need a small part and not the whole file
* reduce lock contention in IoBuffer::Materialize
* Reduce parsing of compressed headers
Validate header type at decompression
* faster CreateDirectories - start from leaf going up and recurse back
* optimized BufferHeader::IsValid
* Add ValidateCompressedHeader to use when we don't need the actual compressed data
Validate that we always get compressed data in CidStore::AddChunk
* changelog
Diffstat (limited to 'zenserver/projectstore.cpp')
| -rw-r--r-- | zenserver/projectstore.cpp | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/zenserver/projectstore.cpp b/zenserver/projectstore.cpp index 3a65feb0f..2c44beaee 100644 --- a/zenserver/projectstore.cpp +++ b/zenserver/projectstore.cpp @@ -643,8 +643,8 @@ ProjectStore::Oplog::AppendNewOplogEntry(CbPackage OpPackage) ZEN_ASSERT(Attach.IsCompressedBinary()); CompressedBuffer AttachmentData = Attach.AsCompressedBinary(); - const uint64_t AttachmentSize = AttachmentData.GetRawSize(); - CidStore::InsertResult InsertResult = m_CidStore.AddChunk(AttachmentData); + const uint64_t AttachmentSize = AttachmentData.DecodeRawSize(); + CidStore::InsertResult InsertResult = m_CidStore.AddChunk(AttachmentData.GetCompressed().Flatten().AsIoBuffer(), Attach.GetHash()); if (InsertResult.New) { @@ -1410,9 +1410,11 @@ ProjectStore::GetChunkInfo(const std::string_view ProjectId, uint64_t ChunkSize = Chunk.GetSize(); if (Chunk.GetContentType() == HttpContentType::kCompressedBinary) { - CompressedBuffer Compressed = CompressedBuffer::FromCompressed(SharedBuffer(Chunk)); - ZEN_ASSERT(!Compressed.IsNull()); - ChunkSize = Compressed.GetRawSize(); + IoHash RawHash; + uint64_t RawSize; + bool IsCompressed = CompressedBuffer::ValidateCompressedHeader(Chunk, RawHash, RawSize); + ZEN_ASSERT(IsCompressed); + ChunkSize = RawSize; } CbObjectWriter Response; @@ -1467,12 +1469,13 @@ ProjectStore::GetChunk(const std::string_view ProjectId, if (Chunk.GetContentType() == HttpContentType::kCompressedBinary) { - CompressedBuffer Compressed = CompressedBuffer::FromCompressed(SharedBuffer(Chunk)); + IoHash RawHash; + uint64_t RawSize; + CompressedBuffer Compressed = CompressedBuffer::FromCompressed(SharedBuffer(Chunk), RawHash, RawSize); ZEN_ASSERT(!Compressed.IsNull()); if (IsOffset) { - uint64_t RawSize = Compressed.GetRawSize(); if ((Offset + Size) > RawSize) { Size = RawSize - Offset; @@ -1542,7 +1545,7 @@ ProjectStore::GetChunk(const std::string_view Cid, ZenContentType AcceptType, Io if (AcceptType == HttpContentType::kBinary) { - CompressedBuffer Compressed = CompressedBuffer::FromCompressed(SharedBuffer(OutChunk)); + CompressedBuffer Compressed = CompressedBuffer::FromCompressedNoValidate(std::move(OutChunk)); OutChunk = Compressed.Decompress().AsIoBuffer(); OutChunk.SetContentType(HttpContentType::kBinary); } @@ -1824,7 +1827,7 @@ HttpProjectService::HttpProjectService(CidStore& Store, ProjectStore* Projects) if (AcceptType == HttpContentType::kBinary) { - CompressedBuffer Compressed = CompressedBuffer::FromCompressed(SharedBuffer(Value)); + CompressedBuffer Compressed = CompressedBuffer::FromCompressedNoValidate(std::move(Value)); Value = Compressed.Decompress().AsIoBuffer(); ContentType = HttpContentType::kBinary; } @@ -2069,7 +2072,7 @@ HttpProjectService::HttpProjectService(CidStore& Store, ProjectStore* Projects) break; case ZenContentType::kCompressedBinary: - if (CompressedBuffer Compressed = CompressedBuffer::FromCompressed(SharedBuffer(Payload))) + if (CompressedBuffer Compressed = CompressedBuffer::FromCompressedNoValidate(std::move(Payload))) { Package.AddAttachment(CbAttachment(Compressed, AttachmentHash)); } @@ -2202,7 +2205,8 @@ HttpProjectService::HttpProjectService(CidStore& Store, ProjectStore* Projects) { ZEN_INFO("Importing oplog '{}/{}'", ProjectId, OplogId); IoBuffer CompressedPayload = HttpReq.ReadPayload(); - IoBuffer Payload = CompressedBuffer::FromCompressed(SharedBuffer(CompressedPayload)).Decompress().AsIoBuffer(); + IoBuffer Payload = + CompressedBuffer::FromCompressedNoValidate(std::move(CompressedPayload)).Decompress().AsIoBuffer(); CbPackage RequestPackage = ParsePackageMessage(Payload); CbObject Request = RequestPackage.GetObject(); @@ -2278,7 +2282,9 @@ HttpProjectService::HttpProjectService(CidStore& Store, ProjectStore* Projects) try { CompressedBuffer AttachmentBody = Attachment.AsCompressedBinary(); - m_CidStore.AddChunk(AttachmentBody, CidStore::InsertMode::kCopyOnly); + m_CidStore.AddChunk(AttachmentBody.GetCompressed().Flatten().AsIoBuffer(), + Attachment.GetHash(), + CidStore::InsertMode::kCopyOnly); } catch (std::exception& e) { @@ -2572,7 +2578,7 @@ namespace testutils { Object.BeginArray("bulkdata"); for (const auto& Attachment : Attachments) { - CbAttachment Attach(Attachment.second, IoHash::FromBLAKE3(Attachment.second.GetRawHash())); + CbAttachment Attach(Attachment.second, IoHash::FromBLAKE3(Attachment.second.DecodeRawHash())); Object.BeginObject(); Object << "id"sv << Attachment.first; Object << "type"sv @@ -2828,11 +2834,13 @@ TEST_CASE("project.store.partial.read") } { IoBuffer Chunk; - CHECK(ProjectStore.GetChunk(IoHash::FromBLAKE3(Attachments[OpIds[1]][0].second.GetRawHash()).ToHexString(), + CHECK(ProjectStore.GetChunk(IoHash::FromBLAKE3(Attachments[OpIds[1]][0].second.DecodeRawHash()).ToHexString(), HttpContentType::kCompressedBinary, Chunk) == HttpResponseCode::OK); - CompressedBuffer Attachment = CompressedBuffer::FromCompressed(SharedBuffer(Chunk)); - CHECK(Attachment.GetRawSize() == Attachments[OpIds[1]][0].second.GetRawSize()); + IoHash RawHash; + uint64_t RawSize; + CompressedBuffer Attachment = CompressedBuffer::FromCompressed(SharedBuffer(Chunk), RawHash, RawSize); + CHECK(RawSize == Attachments[OpIds[1]][0].second.DecodeRawSize()); } IoBuffer ChunkResult; @@ -2844,7 +2852,8 @@ TEST_CASE("project.store.partial.read") HttpContentType::kCompressedBinary, ChunkResult) == HttpResponseCode::OK); CHECK(ChunkResult); - CHECK(CompressedBuffer::FromCompressed(SharedBuffer(ChunkResult)).GetRawSize() == Attachments[OpIds[2]][1].second.GetRawSize()); + CHECK(CompressedBuffer::FromCompressedNoValidate(std::move(ChunkResult)).DecodeRawSize() == + Attachments[OpIds[2]][1].second.DecodeRawSize()); IoBuffer PartialChunkResult; CHECK(ProjectStore.GetChunk("proj1"sv, @@ -2855,8 +2864,11 @@ TEST_CASE("project.store.partial.read") HttpContentType::kCompressedBinary, PartialChunkResult) == HttpResponseCode::OK); CHECK(PartialChunkResult); - CompressedBuffer PartialCompressedResult = CompressedBuffer::FromCompressed(SharedBuffer(PartialChunkResult)); - CHECK(PartialCompressedResult.GetRawSize() >= 1773); + IoHash PartialRawHash; + uint64_t PartialRawSize; + CompressedBuffer PartialCompressedResult = + CompressedBuffer::FromCompressed(SharedBuffer(PartialChunkResult), PartialRawHash, PartialRawSize); + CHECK(PartialRawSize >= 1773); uint64_t RawOffsetInPartialCompressed = GetCompressedOffset(PartialCompressedResult, 5); SharedBuffer PartialDecompressed = PartialCompressedResult.Decompress(RawOffsetInPartialCompressed); |