From fb3a1bd5d361d011e1f6df141c089bc72690b107 Mon Sep 17 00:00:00 2001 From: myoungwon oh Date: Sat, 15 Oct 2022 15:57:53 +0900 Subject: [PATCH] crimson/os/seastore/rbm: add stat to get device info. at mkfs time Signed-off-by: Myoungwon Oh --- .../random_block_manager/nvme_block_device.cc | 33 +++++++++++-------- .../random_block_manager/nvme_block_device.h | 13 +++++++- .../random_block_manager/rbm_device.h | 14 +++++++- .../seastore/nvmedevice/test_nvmedevice.cc | 2 +- 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/crimson/os/seastore/random_block_manager/nvme_block_device.cc b/src/crimson/os/seastore/random_block_manager/nvme_block_device.cc index 06775ec7e2393..f060e1688c232 100644 --- a/src/crimson/os/seastore/random_block_manager/nvme_block_device.cc +++ b/src/crimson/os/seastore/random_block_manager/nvme_block_device.cc @@ -26,22 +26,27 @@ SET_SUBSYS(seastore_device); RBMDevice::mkfs_ret RBMDevice::mkfs(device_config_t config) { LOG_PREFIX(RBMDevice::mkfs); - super.start = 0; - // TODO: improve mkfs() based on a file descriptor - super.block_size = get_block_size(); - super.size = get_available_size(); - - super.feature |= RBM_BITMAP_BLOCK_CRC; - super.config = std::move(config); - DEBUG("super {} ", super); - // write super block - return write_rbm_header( - ).safe_then([] { - return mkfs_ertr::now(); - }).handle_error( + return stat_device( + ).handle_error( mkfs_ertr::pass_further{}, crimson::ct_error::assert_all{ - "Invalid error write_rbm_header in RBMDevice::mkfs" + "Invalid error stat_device in RBMDevice::mkfs"} + ).safe_then([this, FNAME, config=std::move(config)](auto st) { + super.block_size = st.block_size; + super.size = st.size; + + super.feature |= RBM_BITMAP_BLOCK_CRC; + super.config = std::move(config); + DEBUG("super {} ", super); + // write super block + return write_rbm_header( + ).safe_then([] { + return mkfs_ertr::now(); + }).handle_error( + mkfs_ertr::pass_further{}, + crimson::ct_error::assert_all{ + "Invalid error write_rbm_header in RBMDevice::mkfs" + }); }); } diff --git a/src/crimson/os/seastore/random_block_manager/nvme_block_device.h b/src/crimson/os/seastore/random_block_manager/nvme_block_device.h index 8441712993417..118d6fe14cbb4 100644 --- a/src/crimson/os/seastore/random_block_manager/nvme_block_device.h +++ b/src/crimson/os/seastore/random_block_manager/nvme_block_device.h @@ -184,7 +184,7 @@ public: * atomic_write_unit does not require fsync(). */ - NVMeBlockDevice() {} + NVMeBlockDevice(std::string device_path) : device_path(device_path) {} ~NVMeBlockDevice() = default; open_ertr::future<> open( @@ -216,6 +216,16 @@ public: ceph::bufferlist bl, uint16_t stream = 0) final; + stat_device_ret stat_device() final { + return seastar::file_stat(device_path, seastar::follow_symlink::yes + ).then([](auto stat) { + return stat_device_ret( + read_ertr::ready_future_marker{}, + stat + ); + }); + } + uint64_t get_preffered_write_granularity() const { return write_granularity; } uint64_t get_preffered_write_alignment() const { return write_alignment; } uint64_t get_atomic_write_unit() const { return atomic_write_unit; } @@ -292,6 +302,7 @@ private: uint32_t atomic_write_unit = 4096; bool data_protection_enabled = false; + std::string device_path; }; } diff --git a/src/crimson/os/seastore/random_block_manager/rbm_device.h b/src/crimson/os/seastore/random_block_manager/rbm_device.h index 4a94805199e6c..c0dd0c8f0ddde 100644 --- a/src/crimson/os/seastore/random_block_manager/rbm_device.h +++ b/src/crimson/os/seastore/random_block_manager/rbm_device.h @@ -159,8 +159,11 @@ public: write_ertr::future<> write_rbm_header(); read_ertr::future read_rbm_header(rbm_abs_addr addr); -}; + using stat_device_ret = + read_ertr::future; + virtual stat_device_ret stat_device() = 0; +}; class TestMemory : public RBMDevice { public: @@ -213,6 +216,15 @@ public: ceph::bufferlist bl, uint16_t stream = 0) final; + stat_device_ret stat_device() final { + seastar::stat_data stat; + stat.block_size = block_size; + stat.size = size; + return stat_device_ret( + read_ertr::ready_future_marker{}, + stat + ); + } char *buf; }; } diff --git a/src/test/crimson/seastore/nvmedevice/test_nvmedevice.cc b/src/test/crimson/seastore/nvmedevice/test_nvmedevice.cc index 76d960213a735..faa7cfa140b3b 100644 --- a/src/test/crimson/seastore/nvmedevice/test_nvmedevice.cc +++ b/src/test/crimson/seastore/nvmedevice/test_nvmedevice.cc @@ -55,7 +55,7 @@ WRITE_CLASS_DENC_BOUNDED( TEST_F(nvdev_test_t, write_and_verify_test) { run_async([this] { - device = RBMDevice::create(); + device.reset(new random_block_device::nvme::NVMeBlockDevice("")); device->open(dev_path, seastar::open_flags::rw).unsafe_get(); nvdev_test_block_t original_data; std::minstd_rand0 generator; -- 2.39.5