From 57abe887683858c2eee4892ae236ff0c7d20bd41 Mon Sep 17 00:00:00 2001 From: Igor Fedotov Date: Wed, 18 Jul 2018 00:00:42 +0300 Subject: [PATCH] os/bluestore: force multiple directories usage for bluefs no matter what amount of volumes is configured. This allows both coalescence and split for BlueFS backing volumes. Signed-off-by: Igor Fedotov --- src/os/bluestore/BlueStore.cc | 55 +++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 5521045833d28..cb9687e7c87d8 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -4998,14 +4998,11 @@ int BlueStore::_open_bluefs(bool create) bluefs->get_block_device_size(BlueFS::BDEV_WAL) - BDEV_LABEL_BLOCK_SIZE); } - kv_options["separate_wal_dir"] = "1"; bluefs_single_shared_device = false; } else { - r = -errno; - if (::lstat(bfn.c_str(), &st) == -1) { - kv_options.erase("separate_wal_dir"); - r = 0; - } else { + r = 0; + if (::lstat(bfn.c_str(), &st) != -1) { + r = -errno; derr << __func__ << " " << bfn << " symlink exists but target unusable: " << cpp_strerror(r) << dendl; goto free_bluefs; @@ -5081,6 +5078,8 @@ int BlueStore::_open_db(bool create, bool to_repair_db) dout(10) << __func__ << " do_bluefs = " << do_bluefs << dendl; map kv_options; + // force separate wal dir for all new deployments. + kv_options["separate_wal_dir"] = 1; rocksdb::Env *env = NULL; if (do_bluefs) { dout(10) << __func__ << " initializing bluefs" << dendl; @@ -5125,24 +5124,30 @@ int BlueStore::_open_db(bool create, bool to_repair_db) if (create) { env->CreateDir(fn); - if (kv_options.count("separate_wal_dir")) - env->CreateDir(fn + ".wal"); - if (kv_options.count("rocksdb_db_paths")) - env->CreateDir(fn + ".slow"); - } - } else if (create) { - int r = ::mkdir(fn.c_str(), 0755); - if (r < 0) - r = -errno; - if (r < 0 && r != -EEXIST) { - derr << __func__ << " failed to create " << fn << ": " << cpp_strerror(r) - << dendl; - return r; + env->CreateDir(fn + ".wal"); + env->CreateDir(fn + ".slow"); + } else { + std::vector res; + // check for dir presence + auto r = env->GetChildren(fn+".wal", &res); + if (r == rocksdb::Status::NotFound()) { + kv_options.erase("separate_wal_dir"); + } } + } else { + string walfn = path + "/db.wal"; + + if (create) { + int r = ::mkdir(fn.c_str(), 0755); + if (r < 0) + r = -errno; + if (r < 0 && r != -EEXIST) { + derr << __func__ << " failed to create " << fn << ": " << cpp_strerror(r) + << dendl; + return r; + } - // wal_dir, too! - if (kv_options.count("separate_wal_dir")) { - string walfn = path + "/db.wal"; + // wal_dir, too! r = ::mkdir(walfn.c_str(), 0755); if (r < 0) r = -errno; @@ -5152,6 +5157,12 @@ int BlueStore::_open_db(bool create, bool to_repair_db) << dendl; return r; } + } else { + struct stat st; + r = ::stat(walfn.c_str(), &st); + if (r < 0 && errno == ENOENT) { + kv_options.erase("separate_wal_dir"); + } } } -- 2.39.5