diff options
| -rw-r--r-- | CHANGELOG.md | 1 | ||||
| -rw-r--r-- | src/zencore/compress.cpp | 24 |
2 files changed, 15 insertions, 10 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 7eeb91b53..2f08b6e6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Improvement: Eliminated redundant file flushing on log files. Now only flushes if something was actually written - Bugfix: If oplog container save fails the error code is now propagated out as a return code for the command - Bugfix: GetCacheChunk range requests now follows UE DDC rules for ranges outside of chunk size +- Bugfix: Stream decompression of none-encoded data on disk would read wrong data if chunk did not start at beginning of file ## 5.7.12 - Bugfix: Block store GC would write the wrong chunk data for chunks larger than 256KB diff --git a/src/zencore/compress.cpp b/src/zencore/compress.cpp index 84af83119..0c53a8000 100644 --- a/src/zencore/compress.cpp +++ b/src/zencore/compress.cpp @@ -342,14 +342,18 @@ public: { ZEN_ASSERT(FileRef.FileHandle != nullptr); uint64_t CallbackOffset = 0; - ScanFile(FileRef.FileHandle, sizeof(BufferHeader) + RawOffset, RawSize, 512u * 1024u, [&](const void* Data, size_t Size) { - if (Result) - { - CompositeBuffer Tmp(SharedBuffer::MakeView(Data, Size)); - Result = Callback(sizeof(BufferHeader) + RawOffset + CallbackOffset, Size, CallbackOffset, Tmp); - } - CallbackOffset += Size; - }); + ScanFile(FileRef.FileHandle, + FileRef.FileChunkOffset + sizeof(BufferHeader) + RawOffset, + RawSize, + 512u * 1024u, + [&](const void* Data, size_t Size) { + if (Result) + { + CompositeBuffer Tmp(SharedBuffer::MakeView(Data, Size)); + Result = Callback(sizeof(BufferHeader) + RawOffset + CallbackOffset, Size, CallbackOffset, Tmp); + } + CallbackOffset += Size; + }); return Result; } else @@ -892,7 +896,7 @@ BlockDecoder::DecompressToStream( Source.Detach(); return false; } - if (!Callback(FileRef.FileChunkOffset + CompressedOffset, + if (!Callback(CompressedOffset, CompressedBlockSize, BlockIndex * BlockSize + OffsetInFirstBlock, CompositeBuffer(IoBuffer(IoBuffer::Wrap, RawDataBuffer.GetData(), BytesToUncompress)))) @@ -904,7 +908,7 @@ BlockDecoder::DecompressToStream( else { if (!Callback( - FileRef.FileChunkOffset + CompressedOffset, + CompressedOffset, BytesToUncompress, BlockIndex * BlockSize + OffsetInFirstBlock, CompositeBuffer( |