fs.set_volume_selector(vselector);
ASSERT_EQ(0, fs.mount());
+ std::string dir = "dir";
+ std::string file = "wal.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);
+
+ bufferlist content;
+ many_small_writes(writer, content, 100);
+ delete writer; //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);
+
+ fs.umount();
+}
+
+TEST_F(BlueFS_wal, wal_v2_repro_74765)
+{
+ ConfSaver conf(g_ceph_context->_conf);
+ conf.SetVal("bluefs_min_flush_size", "65536");
+ conf.SetVal("bluefs_wal_envelope_mode", "true");
+ conf.ApplyChanges();
+
+ 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";