]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/.../client_request_common: simplify recover_missings
authorSamuel Just <sjust@redhat.com>
Thu, 14 Dec 2023 06:41:00 +0000 (22:41 -0800)
committerSamuel Just <sjust@redhat.com>
Sat, 16 Dec 2023 00:29:56 +0000 (16:29 -0800)
- Modify ClientRequest::snaps_need_to_recover() to return all
  relevant snaps including the operation target.
- Update ClientRequest::snaps_need_to_recover() and
  CommonClientRequest::recover_missings to use set::set
  for snaps.
- Remove special handling for soid from
  CommonClientRequest::recover_missings
- Simplify CommonClientRequest::recover_missings.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/osd/osd_operations/client_request.h
src/crimson/osd/osd_operations/client_request_common.cc
src/crimson/osd/osd_operations/client_request_common.h

index 43535e156c5b92f4cb7ad4b011cbb0be79c606f2..27d0c0ef65dd3494a2ef8f13dfd1eb3baf2451fe 100644 (file)
@@ -160,11 +160,15 @@ public:
   }
   auto get_instance_handle() { return instance_handle; }
 
-  std::vector<snapid_t> snaps_need_to_recover() {
-    std::vector<snapid_t> ret;
+  std::set<snapid_t> snaps_need_to_recover() {
+    std::set<snapid_t> ret;
+    auto target = m->get_hobj();
+    if (!target.is_head()) {
+      ret.insert(target.snap);
+    }
     for (auto &op : m->ops) {
       if (op.op.op == CEPH_OSD_OP_ROLLBACK) {
-       ret.emplace_back((snapid_t)op.op.snap.snapid);
+       ret.insert((snapid_t)op.op.snap.snapid);
       }
     }
     return ret;
index 903da59a3dcec2eaa53efe555b044dcedcea3b45..c406a6c8330b2a9823fdb77d9c6dd83e3e61651d 100644 (file)
@@ -19,44 +19,37 @@ InterruptibleOperation::template interruptible_future<>
 CommonClientRequest::recover_missings(
   Ref<PG> &pg,
   const hobject_t& soid,
-  std::vector<snapid_t> &&snaps)
+  std::set<snapid_t> &&snaps)
 {
-  using interruptor = InterruptibleOperation::interruptor;
   LOG_PREFIX(CommonClientRequest::recover_missings);
-  auto fut = interruptor::now();
   if (!pg->is_primary()) {
-    DEBUGI("process_op: Skipping do_recover_missing on non primary pg");
-    return fut;
-  }
-  if (!soid.is_head()) {
-    fut = do_recover_missing(pg, soid.get_head());
+    DEBUGDPP(
+      "Skipping recover_missings on non primary pg for soid {}", *pg, soid);
+    return seastar::now();
   }
-  return seastar::do_with(
-    std::move(snaps),
-    [pg, soid, fut=std::move(fut)](auto &snaps) mutable {
-    return fut.then_interruptible([&snaps, pg, soid]() mutable {
-      return pg->obc_loader.with_obc<RWState::RWREAD>(
-        soid.get_head(),
-        [&snaps, pg, soid](auto head, auto) mutable {
-        auto oid = resolve_oid(head->get_head_ss(), soid);
-        assert(oid);
-        return do_recover_missing(pg, *oid
-        ).then_interruptible([&snaps, pg, soid, head]() mutable {
-          return InterruptibleOperation::interruptor::do_for_each(
-            snaps,
-            [pg, soid, head](auto &snap) mutable {
-            auto coid = head->obs.oi.soid;
-            coid.snap = snap;
-            auto oid = resolve_oid(head->get_head_ss(), coid);
-            assert(oid);
-            return do_recover_missing(pg, *oid);
-          });
-        });
+  return do_recover_missing(
+    pg, soid.get_head()
+  ).then_interruptible([snaps=std::move(snaps), pg, soid]() mutable {
+    return pg->obc_loader.with_obc<RWState::RWREAD>(
+      soid.get_head(),
+      [snaps=std::move(snaps), pg, soid](auto head, auto) mutable {
+      return seastar::do_with(
+       std::move(snaps),
+       [pg, soid, head](auto &snaps) mutable {
+       return InterruptibleOperation::interruptor::do_for_each(
+         snaps,
+         [pg, soid, head](auto &snap) mutable {
+         auto coid = head->obs.oi.soid;
+         coid.snap = snap;
+         auto oid = resolve_oid(head->get_head_ss(), coid);
+         assert(oid);
+         return do_recover_missing(pg, *oid);
+       });
       });
-    }).handle_error_interruptible(
-      crimson::ct_error::assert_all("unexpected error")
-    );
-  });
+    });
+  }).handle_error_interruptible(
+    crimson::ct_error::assert_all("unexpected error")
+  );
 }
 
 typename InterruptibleOperation::template interruptible_future<>
index 46aa038e3432b867f51a5324f11080d845787dc5..98ee1ef123bd570dcdb1f9db99987cea736fa4ed 100644 (file)
@@ -15,7 +15,7 @@ struct CommonClientRequest {
   recover_missings(
     Ref<PG> &pg,
     const hobject_t& soid,
-    std::vector<snapid_t> &&snaps);
+    std::set<snapid_t> &&snaps);
 
   static InterruptibleOperation::template interruptible_future<>
   do_recover_missing(Ref<PG>& pg, const hobject_t& soid);