aboutsummaryrefslogtreecommitdiff
path: root/src/zenstore/blockstore.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2025-11-20 12:24:50 +0100
committerGitHub Enterprise <[email protected]>2025-11-20 12:24:50 +0100
commitce00ecc90972d43ba06571c425fac5f81349d73d (patch)
tree7a6c9605b3069ae501b7b249c9be8b8c6af50de2 /src/zenstore/blockstore.cpp
parentMerge pull request #653 from ue-foundation/lm/service-install-permissions (diff)
downloadzen-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.cpp46
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