]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/zns: refactor zone operation 48422/head
authorAravind Ramesh <Aravind.Ramesh@wdc.com>
Mon, 10 Oct 2022 07:22:59 +0000 (07:22 +0000)
committerAravind Ramesh <Aravind.Ramesh@wdc.com>
Fri, 14 Oct 2022 06:33:59 +0000 (06:33 +0000)
Moved all zone operations into one routine.

Signed-off-by: Aravind Ramesh <Aravind.Ramesh@wdc.com>
src/crimson/os/seastore/segment_manager/zns.cc
src/crimson/os/seastore/segment_manager/zns.h

index ac1519bbf8dbc10f021ce3da00a88f68111c8b61..3ccbfecd21f1e907056c0590dc8f8feffeaf6571 100644 (file)
@@ -5,6 +5,7 @@
 #include <string.h>
 #include <linux/blkzoned.h>
 
+#include <fmt/format.h>
 #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<z_op>: fmt::formatter<std::string_view> {
+  template <typename FormatContext>
+  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<string_view>::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<SegmentRef> 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<SegmentRef> 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([=] {
index 62caf8f893c39374215f8a57617f1da1b162c8a2..a1f10d14080e2f55d0abf7038b8beb1aef5a4981 100644 (file)
@@ -72,6 +72,13 @@ namespace crimson::os::seastore::segment_manager::zns {
   using write_ertr = crimson::errorator<crimson::ct_error::input_output_error>;
   using read_ertr = crimson::errorator<crimson::ct_error::input_output_error>;
 
+  enum class zone_op {
+    OPEN,
+    FINISH,
+    CLOSE,
+    RESET,
+  };
+
   class ZNSSegmentManager;
 
   class ZNSSegment final : public Segment {