aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-05-17 09:56:10 +0200
committerGitHub Enterprise <[email protected]>2024-05-17 09:56:10 +0200
commitd8d8378e83ef88780349157d8cb1d428bf015f10 (patch)
tree7bcd9eaaaad6c434f890e68cc671a7b7eb35e40c /src
parent5.5.2-pre2 (diff)
downloadzen-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.cpp80
-rw-r--r--src/zenstore/cache/cacherpc.cpp5
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,