]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
test/bluefs: introduce FileWriter UT 66439/head
authorIgor Fedotov <igor.fedotov@croit.io>
Thu, 4 Dec 2025 02:27:44 +0000 (05:27 +0300)
committerAdam Kupczyk <akupczyk@ibm.com>
Fri, 22 May 2026 11:26:57 +0000 (11:26 +0000)
Signed-off-by: Igor Fedotov <igor.fedotov@croit.io>
(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

src/os/bluestore/BlueFS.h
src/test/objectstore/test_bluefs.cc

index a36e115841f0d5ee245a283d3fd56f5aa3e2b4c1..d062ee583d5b90b8919d08706232d89d5881de64 100644 (file)
@@ -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];
       }
index c19b6c5f5d7d1077c3714100a2ee2c3b53c5a031..f8bbc6335137604f1f6d46a226b399673aa0f10b 100644 (file)
@@ -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::File>();
+  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;
   {