diff options
| author | Dan Engelbrecht <[email protected]> | 2024-05-17 09:56:10 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2024-05-17 09:56:10 +0200 |
| commit | d8d8378e83ef88780349157d8cb1d428bf015f10 (patch) | |
| tree | 7bcd9eaaaad6c434f890e68cc671a7b7eb35e40c /src | |
| parent | 5.5.2-pre2 (diff) | |
| download | zen-d8d8378e83ef88780349157d8cb1d428bf015f10.tar.xz zen-d8d8378e83ef88780349157d8cb1d428bf015f10.zip | |
safer partial requests (#82)
* fix partial cache miss logging
* Handle zero size partial requests safer
Diffstat (limited to 'src')
| -rw-r--r-- | src/zencore/compress.cpp | 80 | ||||
| -rw-r--r-- | src/zenstore/cache/cacherpc.cpp | 5 |
2 files changed, 48 insertions, 37 deletions
diff --git a/src/zencore/compress.cpp b/src/zencore/compress.cpp index 143317e65..29c1d9256 100644 --- a/src/zencore/compress.cpp +++ b/src/zencore/compress.cpp @@ -705,10 +705,13 @@ BlockDecoder::DecompressToComposite(DecoderContext& Context, const uint64_t RawOffset, const uint64_t RawSize) const { - UniqueBuffer Buffer = UniqueBuffer::Alloc(RawSize); - if (TryDecompressTo(Context, Source, Header, HeaderView, RawOffset, Buffer)) + if (RawSize > 0) { - return CompositeBuffer(Buffer.MoveToShared()); + UniqueBuffer Buffer = UniqueBuffer::Alloc(RawSize); + if (TryDecompressTo(Context, Source, Header, HeaderView, RawOffset, Buffer)) + { + return CompositeBuffer(Buffer.MoveToShared()); + } } return CompositeBuffer(); } @@ -1442,13 +1445,16 @@ CompressedBuffer::DecodeRawHash() const CompressedBuffer CompressedBuffer::CopyRange(uint64_t RawOffset, uint64_t RawSize) const { - CompressedBuffer Range; - detail::BufferHeader Header; - UniqueBuffer RawHeaderData; - if (ReadHeader(CompressedData, Header, &RawHeaderData)) + CompressedBuffer Range; + if (RawSize > 0) { - const uint64_t TotalRawSize = RawSize < ~uint64_t(0) ? RawSize : Header.TotalRawSize - RawOffset; - Range.CompressedData = CopyCompressedRange(Header, RawHeaderData.GetView(), CompressedData, RawOffset, TotalRawSize); + detail::BufferHeader Header; + UniqueBuffer RawHeaderData; + if (ReadHeader(CompressedData, Header, &RawHeaderData)) + { + const uint64_t TotalRawSize = RawSize < ~uint64_t(0) ? RawSize : Header.TotalRawSize - RawOffset; + Range.CompressedData = CopyCompressedRange(Header, RawHeaderData.GetView(), CompressedData, RawOffset, TotalRawSize); + } } return Range; } @@ -1456,13 +1462,16 @@ CompressedBuffer::CopyRange(uint64_t RawOffset, uint64_t RawSize) const CompressedBuffer CompressedBuffer::GetRange(uint64_t RawOffset, uint64_t RawSize) const { - CompressedBuffer Range; - detail::BufferHeader Header; - UniqueBuffer RawHeaderData; - if (ReadHeader(CompressedData, Header, &RawHeaderData)) + CompressedBuffer Range; + if (RawSize > 0) { - const uint64_t TotalRawSize = RawSize < ~uint64_t(0) ? RawSize : Header.TotalRawSize - RawOffset; - Range.CompressedData = GetCompressedRange(Header, RawHeaderData.GetView(), CompressedData, RawOffset, TotalRawSize); + detail::BufferHeader Header; + UniqueBuffer RawHeaderData; + if (ReadHeader(CompressedData, Header, &RawHeaderData)) + { + const uint64_t TotalRawSize = RawSize < ~uint64_t(0) ? RawSize : Header.TotalRawSize - RawOffset; + Range.CompressedData = GetCompressedRange(Header, RawHeaderData.GetView(), CompressedData, RawOffset, TotalRawSize); + } } return Range; } @@ -1471,7 +1480,7 @@ bool CompressedBuffer::TryDecompressTo(MutableMemoryView RawView, uint64_t RawOffset) const { using namespace detail; - if (CompressedData) + if (CompressedData && RawView.GetSize() > 0) { const BufferHeader Header = BufferHeader::Read(CompressedData); if (Header.Magic == BufferHeader::ExpectedMagic) @@ -1695,28 +1704,31 @@ CompressedBufferReader::TryDecompressTo(const MutableMemoryView RawView, const u SharedBuffer CompressedBufferReader::Decompress(const uint64_t RawOffset, const uint64_t RawSize) { - using namespace detail; - BufferHeader Header; - MemoryView HeaderView; - if (TryReadHeader(Header, HeaderView)) + if (RawSize > 0) { - const uint64_t TotalRawSize = Header.TotalRawSize; - const uint64_t RawSizeToCopy = RawSize == MAX_uint64 ? TotalRawSize - RawOffset : RawSize; - if (RawOffset <= TotalRawSize && RawSizeToCopy <= TotalRawSize - RawOffset) + using namespace detail; + BufferHeader Header; + MemoryView HeaderView; + if (TryReadHeader(Header, HeaderView)) { - if (const BaseDecoder* const Decoder = GetDecoder(Header.Method)) + const uint64_t TotalRawSize = Header.TotalRawSize; + const uint64_t RawSizeToCopy = RawSize == MAX_uint64 ? TotalRawSize - RawOffset : RawSize; + if (RawOffset <= TotalRawSize && RawSizeToCopy <= TotalRawSize - RawOffset) { - UniqueBuffer RawData = UniqueBuffer::Alloc(RawSizeToCopy); - if (Decoder->TryDecompressTo( - Context, - SourceArchive ? static_cast<const DecoderSource&>(ArchiveDecoderSource(*SourceArchive, Context.HeaderOffset)) - : static_cast<const DecoderSource&>(BufferDecoderSource(SourceBuffer->GetCompressed())), - Header, - HeaderView, - RawOffset, - RawData)) + if (const BaseDecoder* const Decoder = GetDecoder(Header.Method)) { - return RawData.MoveToShared(); + UniqueBuffer RawData = UniqueBuffer::Alloc(RawSizeToCopy); + if (Decoder->TryDecompressTo( + Context, + SourceArchive ? static_cast<const DecoderSource&>(ArchiveDecoderSource(*SourceArchive, Context.HeaderOffset)) + : static_cast<const DecoderSource&>(BufferDecoderSource(SourceBuffer->GetCompressed())), + Header, + HeaderView, + RawOffset, + RawData)) + { + return RawData.MoveToShared(); + } } } } diff --git a/src/zenstore/cache/cacherpc.cpp b/src/zenstore/cache/cacherpc.cpp index f12cee923..d56ceb98e 100644 --- a/src/zenstore/cache/cacherpc.cpp +++ b/src/zenstore/cache/cacherpc.cpp @@ -1662,8 +1662,7 @@ CacheRpcHandler::WriteGetCacheChunksResponse([[maybe_unused]] const CacheRequest } } - CompressedBuffer PartialValue = - Request.Value.GetRange(Request.RequestedOffset, Request.RequestedSize == 0 ? 1u : Request.RequestedSize); + CompressedBuffer PartialValue = Request.Value.GetRange(Request.RequestedOffset, Request.RequestedSize); if (PartialValue) { @@ -1684,10 +1683,10 @@ CacheRpcHandler::WriteGetCacheChunksResponse([[maybe_unused]] const CacheRequest else { ZEN_WARN("GETCACHECHUNKS MISS (rawsize: {}, offset: {}, size: {}) - '{}/{}/{}/{}' in {}", - Namespace, Request.Value.DecodeRawSize(), Request.RequestedOffset, Request.RequestedSize, + Namespace, Request.Key->Key.Bucket, Request.Key->Key.Hash, Request.Key->ValueId, |