]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: add CEPH_OSD_OP_LIST_SNAPS
authorSamuel Just <sjust@redhat.com>
Thu, 6 Oct 2022 21:10:57 +0000 (21:10 +0000)
committerSamuel Just <sjust@redhat.com>
Wed, 12 Oct 2022 14:58:28 +0000 (07:58 -0700)
Fixes: https://tracker.ceph.com/issues/57789
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/ops_executer.h

index 1685cdf8a296fd1a2c2218ac68cba283c0e4cd90..a032bf19b93b9f10fae1564b64df160107a1f0c5 100644 (file)
@@ -484,6 +484,75 @@ OpsExecuter::call_errorator::future<> OpsExecuter::do_assert_ver(
   return seastar::now();
 }
 
+OpsExecuter::list_snaps_iertr::future<> OpsExecuter::do_list_snaps(
+  OSDOp& osd_op,
+  const ObjectState& os,
+  const SnapSet& ss)
+{
+  obj_list_snap_response_t resp;
+  resp.clones.reserve(ss.clones.size() + 1);
+  for (auto &clone: ss.clones) {
+    clone_info ci;
+    ci.cloneid = clone;
+
+    {
+      auto p = ss.clone_snaps.find(clone);
+      if (p == ss.clone_snaps.end()) {
+       logger().error(
+         "OpsExecutor::do_list_snaps: {} has inconsistent "
+         "clone_overlap, missing clone {}",
+         os.oi.soid,
+         clone);
+       return crimson::ct_error::invarg::make();
+      }
+      ci.snaps.reserve(p->second.size());
+      ci.snaps.insert(ci.snaps.end(), p->second.rbegin(), p->second.rend());
+    }
+
+    {
+      auto p = ss.clone_overlap.find(clone);
+      if (p == ss.clone_overlap.end()) {
+       logger().error(
+         "OpsExecutor::do_list_snaps: {} has inconsistent "
+         "clone_overlap, missing clone {}",
+         os.oi.soid,
+         clone);
+       return crimson::ct_error::invarg::make();
+      }
+      ci.overlap.reserve(p->second.num_intervals());
+      ci.overlap.insert(ci.overlap.end(), p->second.begin(), p->second.end());
+    }
+
+    {
+      auto p = ss.clone_size.find(clone);
+      if (p == ss.clone_size.end()) {
+       logger().error(
+         "OpsExecutor::do_list_snaps: {} has inconsistent "
+         "clone_size, missing clone {}",
+         os.oi.soid,
+         clone);
+       return crimson::ct_error::invarg::make();
+      }
+      ci.size = p->second;
+    }
+    resp.clones.push_back(std::move(ci));
+  }
+
+  if (!os.oi.is_whiteout()) {
+    clone_info ci;
+    ci.cloneid = CEPH_NOSNAP;
+    ci.size = os.oi.size;
+    resp.clones.push_back(std::move(ci));
+  }
+  resp.seq = ss.seq;
+  logger().error(
+    "OpsExecutor::do_list_snaps: {}, resp.clones.size(): {}",
+    os.oi.soid,
+    resp.clones.size());
+  resp.encode(osd_op.outdata);
+  return read_ierrorator::now();
+}
+
 OpsExecuter::interruptible_errorated_future<OpsExecuter::osd_op_errorator>
 OpsExecuter::execute_op(OSDOp& osd_op)
 {
@@ -706,6 +775,10 @@ OpsExecuter::do_execute_op(OSDOp& osd_op)
     return do_read_op([this, &osd_op](auto&, const auto& os) {
       return do_assert_ver(osd_op, os);
     });
+  case CEPH_OSD_OP_LIST_SNAPS:
+    return do_snapset_op([this, &osd_op](const auto &os, const auto &ss) {
+      return do_list_snaps(osd_op, os, ss);
+    });
 
   default:
     logger().warn("unknown op {}", ceph_osd_op_name(op.op));
index 7f668ba19795f6e16a1117be41c2b321b22d9ea1..a9288ccbd3cb3c0d4d64641f56f68f9d3bd6ad07 100644 (file)
@@ -225,6 +225,16 @@ private:
     OSDOp& osd_op,
     const ObjectState& os);
 
+  using list_snaps_ertr = read_errorator::extend<
+    crimson::ct_error::invarg>;
+  using list_snaps_iertr = ::crimson::interruptible::interruptible_errorator<
+    ::crimson::osd::IOInterruptCondition,
+    list_snaps_ertr>;
+  list_snaps_iertr::future<> do_list_snaps(
+    OSDOp& osd_op,
+    const ObjectState& os,
+    const SnapSet& ss);
+
   template <class Func>
   auto do_const_op(Func&& f);
 
@@ -235,6 +245,15 @@ private:
     return do_const_op(std::forward<Func>(f));
   }
 
+  template <class Func>
+  auto do_snapset_op(Func&& f) {
+    ++num_read;
+    return std::invoke(
+      std::forward<Func>(f),
+      std::as_const(obc->obs),
+      std::as_const(obc->ssc->snapset));
+  }
+
   enum class modified_by {
     user,
     sys,