diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 67867ab51a4db0..632b576824beeb 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -4846,6 +4846,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; @@ -4963,12 +4965,10 @@ int BlueStore::_open_db(bool create, bool to_repair_db) 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 { derr << __func__ << " " << bfn << " symlink exists but target unusable: " @@ -5019,24 +5019,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; @@ -5046,6 +5052,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"); + } } }