From: myoungwon oh Date: Fri, 21 Feb 2025 11:59:07 +0000 (+0000) Subject: crimson/os/seastore/rbm: create a device file if it doesn't exist X-Git-Tag: v20.3.0~403^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=d8eed1200446658c4d1c0979e9556ef373f1fdcd;p=ceph.git crimson/os/seastore/rbm: create a device file if it doesn't exist Signed-off-by: Myoungwon Oh --- diff --git a/src/crimson/os/seastore/device.cc b/src/crimson/os/seastore/device.cc index cc83eb54826a6..8940afb3590a2 100644 --- a/src/crimson/os/seastore/device.cc +++ b/src/crimson/os/seastore/device.cc @@ -7,6 +7,8 @@ #include "random_block_manager.h" #include "random_block_manager/rbm_device.h" +SET_SUBSYS(seastore); + namespace crimson::os::seastore { std::ostream& operator<<(std::ostream& out, const device_spec_t& ds) @@ -48,4 +50,54 @@ Device::make_device(const std::string& device, device_type_t dtype) }); } +check_create_device_ret check_create_device( + const std::string path, + size_t size) +{ + LOG_PREFIX(block_check_create_device); + INFO("path={}, size=0x{:x}", path, size); + return seastar::open_file_dma( + path, + seastar::open_flags::exclusive | + seastar::open_flags::rw | + seastar::open_flags::create + ).then([size, FNAME, path](auto file) { + return seastar::do_with( + file, + [size, FNAME, path](auto &f) -> seastar::future<> + { + DEBUG("path={} created, truncating to 0x{:x}", path, size); + ceph_assert(f); + return f.truncate( + size + ).then([&f, size] { + return f.allocate(0, size); + }).finally([&f] { + return f.close(); + }); + }); + }).then_wrapped([path, FNAME](auto f) -> check_create_device_ret { + if (f.failed()) { + try { + f.get(); + return seastar::now(); + } catch (const std::system_error &e) { + if (e.code().value() == EEXIST) { + ERROR("path={} exists", path); + return seastar::now(); + } else { + ERROR("path={} creation error -- {}", path, e); + return crimson::ct_error::input_output_error::make(); + } + } catch (...) { + ERROR("path={} creation error", path); + return crimson::ct_error::input_output_error::make(); + } + } + + DEBUG("path={} complete", path); + std::ignore = f.discard_result(); + return seastar::now(); + }); +} } diff --git a/src/crimson/os/seastore/device.h b/src/crimson/os/seastore/device.h index 56d0c889b7b52..3040d86296bf0 100644 --- a/src/crimson/os/seastore/device.h +++ b/src/crimson/os/seastore/device.h @@ -168,6 +168,11 @@ public: } }; +using check_create_device_ertr = Device::access_ertr; +using check_create_device_ret = check_create_device_ertr::future<>; +check_create_device_ret check_create_device( + const std::string path, + size_t size); } WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::device_spec_t) diff --git a/src/crimson/os/seastore/random_block_manager/rbm_device.cc b/src/crimson/os/seastore/random_block_manager/rbm_device.cc index cd0675f220dc9..bc592d12bcbad 100644 --- a/src/crimson/os/seastore/random_block_manager/rbm_device.cc +++ b/src/crimson/os/seastore/random_block_manager/rbm_device.cc @@ -21,52 +21,61 @@ SET_SUBSYS(seastore_device); RBMDevice::mkfs_ret RBMDevice::do_primary_mkfs(device_config_t config, int shard_num, size_t journal_size) { LOG_PREFIX(RBMDevice::do_primary_mkfs); - return stat_device( - ).handle_error( - mkfs_ertr::pass_further{}, - crimson::ct_error::assert_all{ - "Invalid error stat_device in RBMDevice::do_primary_mkfs"} - ).safe_then( - [this, FNAME, config=std::move(config), shard_num, journal_size](auto st) { - super.block_size = st.block_size; - super.size = st.size; - super.config = std::move(config); - super.journal_size = journal_size; - ceph_assert_always(super.journal_size > 0); - ceph_assert_always(super.size >= super.journal_size); - ceph_assert_always(shard_num > 0); - - std::vector shard_infos(shard_num); - for (int i = 0; i < shard_num; i++) { - uint64_t aligned_size = - (super.size / shard_num) - - ((super.size / shard_num) % super.block_size); - shard_infos[i].size = aligned_size; - shard_infos[i].start_offset = i * aligned_size; - assert(shard_infos[i].size > super.journal_size); - } - super.shard_infos = shard_infos; - super.shard_num = shard_num; - shard_info = shard_infos[seastar::this_shard_id()]; - DEBUG("super {} ", super); - - // write super block - return open(get_device_path(), - seastar::open_flags::rw | seastar::open_flags::dsync + check_create_device_ret maybe_create = check_create_device_ertr::now(); + using crimson::common::get_conf; + if (get_conf("seastore_block_create") && !get_device_path().empty()) { + auto size = get_conf("seastore_device_size"); + maybe_create = check_create_device(get_device_path(), size); + } + return maybe_create.safe_then([this, FNAME, config=std::move(config), + shard_num, journal_size] { + return stat_device( ).handle_error( mkfs_ertr::pass_further{}, crimson::ct_error::assert_all{ - "Invalid error open in RBMDevice::do_primary_mkfs"} - ).safe_then([this] { - return initialize_nvme_features( + "Invalid error stat_device in RBMDevice::do_primary_mkfs"} + ).safe_then( + [this, FNAME, config=std::move(config), shard_num, journal_size](auto st) { + super.block_size = st.block_size; + super.size = st.size; + super.config = std::move(config); + super.journal_size = journal_size; + ceph_assert_always(super.journal_size > 0); + ceph_assert_always(super.size >= super.journal_size); + ceph_assert_always(shard_num > 0); + + std::vector shard_infos(shard_num); + for (int i = 0; i < shard_num; i++) { + uint64_t aligned_size = + (super.size / shard_num) - + ((super.size / shard_num) % super.block_size); + shard_infos[i].size = aligned_size; + shard_infos[i].start_offset = i * aligned_size; + assert(shard_infos[i].size > super.journal_size); + } + super.shard_infos = shard_infos; + super.shard_num = shard_num; + shard_info = shard_infos[seastar::this_shard_id()]; + DEBUG("super {} ", super); + + // write super block + return open(get_device_path(), + seastar::open_flags::rw | seastar::open_flags::dsync + ).handle_error( + mkfs_ertr::pass_further{}, + crimson::ct_error::assert_all{ + "Invalid error open in RBMDevice::do_primary_mkfs"} ).safe_then([this] { - return write_rbm_superblock( + return initialize_nvme_features( ).safe_then([this] { - return close(); - }).handle_error( - mkfs_ertr::pass_further{}, - crimson::ct_error::assert_all{ - "Invalid error write_rbm_superblock in RBMDevice::do_primary_mkfs" + return write_rbm_superblock( + ).safe_then([this] { + return close(); + }).handle_error( + mkfs_ertr::pass_further{}, + crimson::ct_error::assert_all{ + "Invalid error write_rbm_superblock in RBMDevice::do_primary_mkfs" + }); }); }); }); diff --git a/src/crimson/os/seastore/segment_manager/block.cc b/src/crimson/os/seastore/segment_manager/block.cc index 7077aad740706..98a3d1bb9282d 100644 --- a/src/crimson/os/seastore/segment_manager/block.cc +++ b/src/crimson/os/seastore/segment_manager/block.cc @@ -248,59 +248,6 @@ block_sm_superblock_t make_superblock( }; } -using check_create_device_ertr = BlockSegmentManager::access_ertr; -using check_create_device_ret = check_create_device_ertr::future<>; -static check_create_device_ret check_create_device( - const std::string &path, - size_t size) -{ - LOG_PREFIX(block_check_create_device); - INFO("path={}, size=0x{:x}", path, size); - return seastar::open_file_dma( - path, - seastar::open_flags::exclusive | - seastar::open_flags::rw | - seastar::open_flags::create - ).then([size, FNAME, &path](auto file) { - return seastar::do_with( - file, - [size, FNAME, &path](auto &f) -> seastar::future<> - { - DEBUG("path={} created, truncating to 0x{:x}", path, size); - ceph_assert(f); - return f.truncate( - size - ).then([&f, size] { - return f.allocate(0, size); - }).finally([&f] { - return f.close(); - }); - }); - }).then_wrapped([&path, FNAME](auto f) -> check_create_device_ret { - if (f.failed()) { - try { - f.get(); - return seastar::now(); - } catch (const std::system_error &e) { - if (e.code().value() == EEXIST) { - ERROR("path={} exists", path); - return seastar::now(); - } else { - ERROR("path={} creation error -- {}", path, e); - return crimson::ct_error::input_output_error::make(); - } - } catch (...) { - ERROR("path={} creation error", path); - return crimson::ct_error::input_output_error::make(); - } - } - - DEBUG("path={} complete", path); - std::ignore = f.discard_result(); - return seastar::now(); - }); -} - using open_device_ret = BlockSegmentManager::access_ertr::future< std::pair