From: Aravind Ramesh Date: Mon, 10 Oct 2022 07:22:59 +0000 (+0000) Subject: crimson/zns: refactor zone operation X-Git-Tag: v18.1.0~336^2~35^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=0eb835a53e0f6e7aeff7004813f38a8e54c72b33;p=ceph.git crimson/zns: refactor zone operation Moved all zone operations into one routine. Signed-off-by: Aravind Ramesh --- diff --git a/src/crimson/os/seastore/segment_manager/zns.cc b/src/crimson/os/seastore/segment_manager/zns.cc index ac1519bbf8dbc..3ccbfecd21f1e 100644 --- a/src/crimson/os/seastore/segment_manager/zns.cc +++ b/src/crimson/os/seastore/segment_manager/zns.cc @@ -5,6 +5,7 @@ #include #include +#include #include "crimson/os/seastore/segment_manager/zns.h" #include "crimson/common/config_proxy.h" #include "crimson/os/seastore/logging.h" @@ -17,6 +18,30 @@ SET_SUBSYS(seastore_device); // limit the max padding buf size to 1MB #define MAX_PADDING_SIZE 1048576 +using z_op = crimson::os::seastore::segment_manager::zns::zone_op; +template <> struct fmt::formatter: fmt::formatter { + template + auto format(z_op s, FormatContext& ctx) { + std::string_view name = "Unknown"; + switch (s) { + using enum z_op; + case OPEN: + name = "BLKOPENZONE"; + break; + case FINISH: + name = "BLKFINISHZONE"; + break; + case CLOSE: + name = "BLKCLOSEZONE"; + break; + case RESET: + name = "BLKRESETZONE"; + break; + } + return formatter::format(name, ctx); + } +}; + namespace crimson::os::seastore::segment_manager::zns { using open_device_ret = ZNSSegmentManager::access_ertr::future< @@ -397,22 +422,47 @@ struct blk_zone_range make_range( }; } -using blk_open_zone_ertr = crimson::errorator< +using blk_zone_op_ertr = crimson::errorator< crimson::ct_error::input_output_error>; -using blk_open_zone_ret = blk_open_zone_ertr::future<>; -blk_open_zone_ret blk_open_zone(seastar::file &device, blk_zone_range &range){ +using blk_zone_op_ret = blk_zone_op_ertr::future<>; +blk_zone_op_ret blk_zone_op(seastar::file &device, + blk_zone_range &range, + zone_op op) { + LOG_PREFIX(ZNSSegmentManager::blk_zone_op); + + unsigned long ioctl_op = 0; + switch (op) { + using enum zone_op; + case OPEN: + ioctl_op = BLKOPENZONE; + break; + case FINISH: + ioctl_op = BLKFINISHZONE; + break; + case RESET: + ioctl_op = BLKRESETZONE; + break; + case CLOSE: + ioctl_op = BLKCLOSEZONE; + break; + default: + ERROR("Invalid zone operation {}", op); + ceph_assert(ioctl_op); + } + return device.ioctl( - BLKOPENZONE, + ioctl_op, &range - ).then_wrapped([=](auto f) -> blk_open_zone_ret{ + ).then_wrapped([=](auto f) -> blk_zone_op_ret { if (f.failed()) { + ERROR("{} ioctl failed", op); return crimson::ct_error::input_output_error::make(); - } - else { + } else { int ret = f.get(); if (ret == 0) { return seastar::now(); } else { + ERROR("{} ioctl failed with return code {}", op, ret); return crimson::ct_error::input_output_error::make(); } } @@ -430,9 +480,10 @@ ZNSSegmentManager::open_ertr::future ZNSSegmentManager::open( id, metadata.segment_size, metadata.first_segment_offset); - return blk_open_zone( + return blk_zone_op( device, - range + range, + zone_op::OPEN ); } ).safe_then([=, this] { @@ -444,85 +495,6 @@ ZNSSegmentManager::open_ertr::future ZNSSegmentManager::open( }); } -using blk_finish_zone_ertr = crimson::errorator< - crimson::ct_error::input_output_error>; -using blk_finish_zone_ret = blk_finish_zone_ertr::future<>; -static blk_finish_zone_ret blk_finish_zone( - seastar::file &device, - blk_zone_range &range) -{ - LOG_PREFIX(ZNSSegmentManager::blk_finish_zone); - return device.ioctl( - BLKFINISHZONE, - &range - ).then_wrapped([=](auto f) -> blk_finish_zone_ret { - if (f.failed()) { - DEBUG("BLKFINISHZONE ioctl failed"); - return crimson::ct_error::input_output_error::make(); - } else { - int ret = f.get(); - if (ret == 0) { - return seastar::now(); - } else { - DEBUG("BLKFINISHZONE ioctl failed with return code {}", ret); - return crimson::ct_error::input_output_error::make(); - } - } - }); -} - -using blk_close_zone_ertr = crimson::errorator< - crimson::ct_error::input_output_error>; -using blk_close_zone_ret = blk_close_zone_ertr::future<>; -blk_close_zone_ret blk_close_zone( - seastar::file &device, - blk_zone_range &range) -{ - return device.ioctl( - BLKCLOSEZONE, - &range - ).then_wrapped([=](auto f) -> blk_open_zone_ret { - if (f.failed()) { - return crimson::ct_error::input_output_error::make(); - } - else { - int ret = f.get(); - if (ret == 0) { - return seastar::now(); - } else { - return crimson::ct_error::input_output_error::make(); - } - } - }); -} - -using blk_reset_zone_ertr = crimson::errorator< - crimson::ct_error::input_output_error>; -using blk_reset_zone_ret = blk_reset_zone_ertr::future<>; -blk_reset_zone_ret blk_reset_zone( - seastar::file &device, - blk_zone_range &range) -{ - LOG_PREFIX(ZNSSegmentManager::blk_reset_zone); - return device.ioctl( - BLKRESETZONE, - &range - ).then_wrapped([=](auto f) -> blk_reset_zone_ret { - if (f.failed()) { - DEBUG("BLKRESETZONE ioctl failed"); - return crimson::ct_error::input_output_error::make(); - } else { - int ret = f.get(); - if (ret == 0) { - return seastar::now(); - } else { - DEBUG("BLKRESETZONE ioctl failed with return code {}", ret); - return crimson::ct_error::input_output_error::make(); - } - } - }); -} - ZNSSegmentManager::release_ertr::future<> ZNSSegmentManager::release( segment_id_t id) { @@ -535,9 +507,10 @@ ZNSSegmentManager::release_ertr::future<> ZNSSegmentManager::release( id, metadata.segment_size, metadata.first_segment_offset); - return blk_reset_zone( + return blk_zone_op( device, - range + range, + zone_op::RESET ); } ).safe_then([=] { @@ -583,9 +556,10 @@ Segment::close_ertr::future<> ZNSSegmentManager::segment_close( id, metadata.segment_size, metadata.first_segment_offset); - return blk_finish_zone( + return blk_zone_op( device, - range + range, + zone_op::FINISH ); } ).safe_then([=] { diff --git a/src/crimson/os/seastore/segment_manager/zns.h b/src/crimson/os/seastore/segment_manager/zns.h index 62caf8f893c39..a1f10d14080e2 100644 --- a/src/crimson/os/seastore/segment_manager/zns.h +++ b/src/crimson/os/seastore/segment_manager/zns.h @@ -72,6 +72,13 @@ namespace crimson::os::seastore::segment_manager::zns { using write_ertr = crimson::errorator; using read_ertr = crimson::errorator; + enum class zone_op { + OPEN, + FINISH, + CLOSE, + RESET, + }; + class ZNSSegmentManager; class ZNSSegment final : public Segment {