diff options
| author | Dan Engelbrecht <[email protected]> | 2025-11-20 12:24:50 +0100 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2025-11-20 12:24:50 +0100 |
| commit | ce00ecc90972d43ba06571c425fac5f81349d73d (patch) | |
| tree | 7a6c9605b3069ae501b7b249c9be8b8c6af50de2 /src/zenstore/blockstore.cpp | |
| parent | Merge pull request #653 from ue-foundation/lm/service-install-permissions (diff) | |
| download | zen-ce00ecc90972d43ba06571c425fac5f81349d73d.tar.xz zen-ce00ecc90972d43ba06571c425fac5f81349d73d.zip | |
fix block store file appender (#658)
* fix bug where we write buffered data instead of provided data in BlockStoreFileAppender
Diffstat (limited to 'src/zenstore/blockstore.cpp')
| -rw-r--r-- | src/zenstore/blockstore.cpp | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/src/zenstore/blockstore.cpp b/src/zenstore/blockstore.cpp index d94643fa7..6c5b50f58 100644 --- a/src/zenstore/blockstore.cpp +++ b/src/zenstore/blockstore.cpp @@ -249,8 +249,8 @@ public: { Flush(); + m_BlockFile.Write(Data, Size, m_WritePos); const uint64_t WrittenPos = m_WritePos; - m_BlockFile.Write(m_Buffer, Size, m_BufferStart); m_WritePos += Size; m_BufferStart = m_WritePos; return WrittenPos; @@ -265,9 +265,9 @@ public: } ZEN_ASSERT((m_WritePos - m_BufferStart) + Size <= m_BufferSize); - - const uint64_t WrittenPos = m_WritePos; + ZEN_ASSERT_SLOW(RoundUp(m_WritePos, Alignment) == m_WritePos); memmove(&m_Buffer[m_WritePos - m_BufferStart], Data, Size); + const uint64_t WrittenPos = m_WritePos; m_WritePos += Size; return WrittenPos; } @@ -2374,6 +2374,46 @@ TEST_CASE("blockstore.compact.blocks") } } +TEST_CASE("blockstore.BlockStoreFileAppender") +{ + const uint64_t kMaxChunkSize = 32u * 1024u; + const size_t kBlobCount = 753u; + const size_t kAlignment = 32u; + + ScopedTemporaryDirectory Tmp; + BlockStoreFile Block(Tmp.Path() / "block.0"); + Block.Create(kMaxChunkSize * kBlobCount); + + std::vector<IoHash> BlobHashes; + std::vector<std::pair<uint64_t, uint64_t>> BlobOffsetAndSize; + BlobHashes.reserve(kBlobCount); + BlobOffsetAndSize.reserve(kBlobCount); + { + BlockStoreFileAppender Appender(Block, 16u * 1024u); + + FastRandom Random; + for (size_t Index = 0; Index < kBlobCount; Index++) + { + IoBuffer Blob = CreateRandomBlob(Random, Random.Next() % 32u * 1024u + 64u); + IoHash BlobHash = IoHash::HashBuffer(Blob); + BlobHashes.push_back(BlobHash); + uint64_t Offset = Appender.Append(Blob.GetData(), Blob.GetSize(), kAlignment); + BlobOffsetAndSize.push_back({Offset, Blob.GetSize()}); + } + } + + for (size_t Index = 0; Index < kBlobCount; Index++) + { + const IoHash& BlobHash = BlobHashes[Index]; + uint64_t Offset = BlobOffsetAndSize[Index].first; + uint64_t Size = BlobOffsetAndSize[Index].second; + IoBuffer Blob = Block.GetChunk(Offset, Size); + IoHash VerifyBlobHash = IoHash::HashBuffer(Blob); + CHECK(BlobHash == VerifyBlobHash); + BlobOffsetAndSize.push_back({Offset, Blob.GetSize()}); + } +} + #endif void |