From: Igor Fedotov Date: Thu, 4 Dec 2025 02:27:44 +0000 (+0300) Subject: test/bluefs: introduce FileWriter UT X-Git-Tag: v21.0.1~113^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=873f12407754a36d1e2be337a1107aa7435201b0;p=ceph.git test/bluefs: introduce FileWriter UT Signed-off-by: Igor Fedotov (cherry picked from commit 92ea6a0122127325b549119c45ad8ca5a63b8498) Contributed in: https://github.com/ceph/ceph/pull/66503 Modified: 1) Removed FileWriter special constructor for UT 2) Adapted naming of calls in UT --- diff --git a/src/os/bluestore/BlueFS.h b/src/os/bluestore/BlueFS.h index a36e115841f..d062ee583d5 100644 --- a/src/os/bluestore/BlueFS.h +++ b/src/os/bluestore/BlueFS.h @@ -466,7 +466,9 @@ public: } // NOTE: caller must call BlueFS::close_writer() ~FileWriter() { - --file->num_writers; + if (file) { + --file->num_writers; + } for (unsigned i = 0; i < MAX_BDEV; ++i) { delete iocv[i]; } diff --git a/src/test/objectstore/test_bluefs.cc b/src/test/objectstore/test_bluefs.cc index c19b6c5f5d7..f8bbc633513 100644 --- a/src/test/objectstore/test_bluefs.cc +++ b/src/test/objectstore/test_bluefs.cc @@ -2511,6 +2511,156 @@ TEST(BlueFS, test_69481_truncate_asserts) { fs.umount(); } +TEST(FileWriter, get_flush_buffer) { + size_t block_size = 32; + BlueFS::FileRef file = ceph::make_ref(); + BlueFS::FileWriter fw(file, block_size); + + bufferlist bl; + + ASSERT_EQ(fw.get_flush_offset(), 0); + ASSERT_EQ(fw.get_pos(), 0); + ASSERT_EQ(fw.get_buffer_length(), 0); + + // append and flush full page + bufferlist bl1; + bl1.append(std::string(block_size, 'a')); + bl = bl1; + fw.append(bl1); + ASSERT_EQ(fw.get_flush_buffer(g_ceph_context, block_size), bl); + + ASSERT_EQ(fw.get_flush_offset(), block_size); + ASSERT_EQ(fw.get_pos(), block_size); + ASSERT_EQ(fw.get_buffer_length(), 0); + + // append and flush full page once again + bufferlist bl2; + bl2.append(std::string(block_size, 'b')); + bl = bl2; + fw.append(bl2); + ASSERT_EQ(fw.get_flush_buffer(g_ceph_context, block_size * 2), bl); + + ASSERT_EQ(fw.get_flush_offset(), block_size * 2); + ASSERT_EQ(fw.get_pos(), block_size * 2); + ASSERT_EQ(fw.get_buffer_length(), 0); + + // append full page and flush it in two pieces + bufferlist bl3; + bl3.append(std::string(block_size, 'c')); + bl = bl3; + + fw.append(bl3); + ASSERT_EQ(fw.get_flush_buffer(g_ceph_context, block_size * 2 + 1), bl); + + ASSERT_EQ(fw.get_flush_offset(), block_size * 3); // ????? + ASSERT_EQ(fw.get_pos(), block_size * 2 + 1); + ASSERT_EQ(fw.get_buffer_length(), block_size - 1); + + bl.clear(); + ASSERT_EQ(fw.get_flush_buffer(g_ceph_context, block_size * 3), bl); + + ASSERT_EQ(fw.get_flush_offset(), block_size * 3); + ASSERT_EQ(fw.get_pos(), block_size * 3); + ASSERT_EQ(fw.get_buffer_length(), 0); + + // append half page, flush 1 byte, + // append the remaining half and flush till the end + bufferlist bl4; + bl4.append(std::string(block_size / 2, 'd')); + bl = bl4; + bl.append_zero(block_size / 2); + + fw.append(bl4); + ASSERT_EQ(fw.get_flush_buffer(g_ceph_context, block_size * 3 + 1), bl); + + ASSERT_EQ(fw.get_flush_offset(), block_size * 3); + ASSERT_EQ(fw.get_pos(), block_size * 3 + 1); + ASSERT_EQ(fw.get_buffer_length(), block_size /2 - 1); + + bl4.append(std::string(block_size / 2, 'd')); + bl.clear(); + bl.append(std::string(block_size, 'd')); + + fw.append(bl4); + ASSERT_EQ(fw.get_flush_buffer(g_ceph_context, block_size * 4), bl); + + ASSERT_EQ(fw.get_flush_offset(), block_size * 4); + ASSERT_EQ(fw.get_pos(), block_size * 4); + ASSERT_EQ(fw.get_buffer_length(), 0); + + // append 10 bytes, flush 2 bytes, + // append 12 bytes, flush 2 bytes, + // flush 18 bytes + // append 12 bytes, flush 9 bytes + // flush 2 bytes + // flush 1 bytes + + bufferlist bl5; + bl5.append(std::string(10, 'e')); + bl = bl5; + bl.append_zero(block_size - bl5.length()); + + fw.append(bl5); + ASSERT_EQ(fw.get_flush_buffer(g_ceph_context, block_size * 4 + 2), bl); + + ASSERT_EQ(fw.get_flush_offset(), block_size * 4); + ASSERT_EQ(fw.get_pos(), block_size * 4 + 2); + ASSERT_EQ(fw.get_buffer_length(), 8); + + bl5.append(std::string(12, 'f')); + bl.clear(); + bl.append(std::string(10, 'e')); + bl.append(std::string(12, 'f')); + bl.append_zero(block_size - bl.length()); + + fw.append(bl5); + ASSERT_EQ(fw.get_flush_buffer(g_ceph_context, block_size * 4 + 4), bl); + + ASSERT_EQ(fw.get_flush_offset(), block_size * 4); + ASSERT_EQ(fw.get_pos(), block_size * 4 + 4); + ASSERT_EQ(fw.get_buffer_length(), 18); + + bl.clear(); + bl.append(std::string(10, 'e')); + bl.append(std::string(12, 'f')); + bl.append_zero(block_size - bl.length()); + ASSERT_EQ(fw.get_flush_buffer(g_ceph_context, block_size * 4 + 22), bl); + + ASSERT_EQ(fw.get_flush_offset(), block_size * 4); + ASSERT_EQ(fw.get_pos(), block_size * 4 + 22); + ASSERT_EQ(fw.get_buffer_length(), 0); + + bl5.append(std::string(12, 'g')); + fw.append(bl5); + + bl.clear(); + bl.append(std::string(10, 'e')); + bl.append(std::string(12, 'f')); + bl.append(std::string(10, 'g')); + + ASSERT_EQ(fw.get_flush_buffer(g_ceph_context, block_size * 5 - 1), bl); + + ASSERT_EQ(fw.get_flush_offset(), block_size * 5); + ASSERT_EQ(fw.get_pos(), block_size * 5 - 1); + ASSERT_EQ(fw.get_buffer_length(), 3); + + bl.clear(); + bl.append(std::string(2, 'g')); + bl.append_zero(block_size - 2); + + ASSERT_EQ(fw.get_flush_buffer(g_ceph_context, block_size * 5 + 1), bl); + + ASSERT_EQ(fw.get_flush_offset(), block_size * 5); + ASSERT_EQ(fw.get_pos(), block_size * 5 + 1); + ASSERT_EQ(fw.get_buffer_length(), 1); + + ASSERT_EQ(fw.get_flush_buffer(g_ceph_context, block_size * 5 + 2), bl); + + ASSERT_EQ(fw.get_flush_offset(), block_size * 5); + ASSERT_EQ(fw.get_pos(), block_size * 5 + 2); + ASSERT_EQ(fw.get_buffer_length(), 0); +} + TEST(bluefs_locked_extents_t, basics) { const uint64_t M = 1 << 20; {