]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
test/test_bluefs: reproduce volume selector inconsistency after
authorIgor Fedotov <igor.fedotov@croit.io>
Wed, 11 Feb 2026 16:36:20 +0000 (19:36 +0300)
committerIgor Fedotov <igor.fedotov@croit.io>
Wed, 11 Feb 2026 16:36:20 +0000 (19:36 +0300)
recovering WAL in envelope mode.

Reproduces: https://tracker.ceph.com/issues/74765

Exact bug reproduction (which occurs on file removal) requires
'bluefs_check_volume_selector_on_mount' to be set manually to false
in 'wal_v2_simulate_crash' test case.
That's not the case for the default implementation which fails volume selector
validation at earlier stage during BlueFS mount.
This seems a general approach which provides better test coverage.

Signed-off-by: Igor Fedotov <igor.fedotov@croit.io>
src/test/objectstore/test_bluefs.cc

index a83367334e7c008e164d445c27a3dda69940e231..93a7c1e7e2a7557386451c3d7cbc769d997c6268 100644 (file)
@@ -1253,25 +1253,72 @@ TEST_F(BlueFS_wal, wal_v2_simulate_crash)
   ConfSaver conf(g_ceph_context->_conf);
   conf.SetVal("bluefs_min_flush_size", "65536");
   conf.SetVal("bluefs_wal_envelope_mode", "true");
+  conf.SetVal("bluefs_check_volume_selector_on_mount", "true");
   conf.ApplyChanges();
 
-  Create(1048576 * 256, 1048576 * 128, 1048576 * 64);
+  uint64_t wal_size = 1048576 * 64;
+  uint64_t db_size = 1048576 * 128;
+  uint64_t slow_size = 1048576 * 256;
+  Create(slow_size, db_size, wal_size);
+
+  auto new_vselector = [&]() {
+    return
+      new RocksDBBlueFSVolumeSelector(
+        wal_size * 95 / 100,
+        db_size * 95 / 100,
+        slow_size * 95 / 100,
+        16777216 * 64, //rocks_opts.write_buffer_size * rocks_opts.max_write_buffer_number
+        1073741824,    //rocks_opts.max_bytes_for_level_base,
+        8,             //rocks_opts.max_bytes_for_level_multiplier,
+        true /*use some extra*/);
+    };
+
+  BlueFSVolumeSelector *vselector = new_vselector();
+  fs.set_volume_selector(vselector);
   ASSERT_EQ(0, fs.mount());
+
   std::string dir = "dir";
   std::string file = "wal.log";
+  std::string file2 = "wal2.log";
   int r = fs.mkdir(dir);
   ASSERT_TRUE(r == 0 || r == -EEXIST);
   BlueFS::FileWriter *writer;
   ASSERT_EQ(0, fs.open_for_write(dir, file, &writer, false));
   ASSERT_NE(nullptr, writer);
+
+  BlueFS::FileWriter* writer2;
+  ASSERT_EQ(0, fs.open_for_write(dir, file2, &writer2, false));
+  ASSERT_NE(nullptr, writer2);
+
   bufferlist content;
   many_small_writes(writer, content, 100);
   delete writer; //close without orderly shutdown, simulate failure
+  bufferlist content2;
+  many_small_writes(writer2, content2, 100);
+  delete writer2; //close without orderly shutdown, simulate failure
+
   fs.umount();
+
+  vselector = new_vselector();
+  fs.set_volume_selector(vselector);
   fs.mount();
+
   bufferlist read_content;
   many_small_reads(dir, file, read_content, 100);
   ASSERT_EQ(content, read_content);
+
+  bufferlist read_content2;
+  many_small_reads(dir, file2, read_content2, 100);
+  ASSERT_EQ(content2, read_content2);
+
+  ASSERT_EQ(0, fs.unlink(dir, file));
+
+  fs.umount();
+
+  vselector = new_vselector();
+  fs.set_volume_selector(vselector);
+  fs.mount();
+  ASSERT_EQ(0, fs.unlink(dir, file2));
   fs.umount();
 }