]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd/recovery_backend: _handle_pull_response to use obc_manager
authorMatan Breizman <mbreizma@redhat.com>
Sun, 2 Feb 2025 13:23:20 +0000 (13:23 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Mon, 10 Mar 2025 12:48:11 +0000 (12:48 +0000)
Signed-off-by: Matan Breizman <mbreizma@redhat.com>
src/crimson/osd/replicated_recovery_backend.cc

index 3eeff2314ee7357a3a75b6ef220746b1c2cd44e7..3583212fbccdb3e295bef85be5256bf4bcad7508 100644 (file)
@@ -837,39 +837,42 @@ ReplicatedRecoveryBackend::_handle_pull_response(
     pull_info.recovery_info.version = push_op.version;
 
   if (pull_info.recovery_progress.first) {
-    auto fut = pg.obc_loader.with_obc<RWState::RWNONE>(
-      pull_info.recovery_info.soid,
-      [FNAME, this, &pull_info, &recovery_waiter, &push_op](auto, auto obc) {
-        pull_info.obc = obc;
-        recovery_waiter.obc = obc;
-        obc->obs.oi.decode_no_oid(push_op.attrset.at(OI_ATTR),
-                                  push_op.soid);
-        auto ss_attr_iter = push_op.attrset.find(SS_ATTR);
-        if (ss_attr_iter != push_op.attrset.end()) {
-          if (!obc->ssc) {
-            obc->ssc = new crimson::osd::SnapSetContext(
-              push_op.soid.get_snapdir());
-          }
-          try {
-            obc->ssc->snapset = SnapSet(ss_attr_iter->second);
-            obc->ssc->exists = true;
-          } catch (const buffer::error&) {
-            WARNDPP("unable to decode SnapSet", pg);
-            throw crimson::osd::invalid_argument();
-          }
-          assert(!pull_info.obc->ssc->exists ||
-                 obc->ssc->snapset.seq == pull_info.obc->ssc->snapset.seq);
-        }
-        pull_info.recovery_info.oi = obc->obs.oi;
-        if (pull_info.recovery_info.soid.snap &&
-            pull_info.recovery_info.soid.snap < CEPH_NOSNAP) {
-            recalc_subsets(pull_info.recovery_info,
-                           pull_info.obc->ssc);
-        }
-        return crimson::osd::PG::load_obc_ertr::now();
-      }, false).handle_error_interruptible(crimson::ct_error::assert_all{});
-    co_await std::move(fut);
-  };
+    auto obc_manager = pg.obc_loader.get_obc_manager(pull_info.recovery_info.soid);
+    co_await pg.obc_loader.load_and_lock(
+      obc_manager, RWState::RWNONE
+    ).handle_error_interruptible(
+      crimson::ct_error::assert_all("unexpected error")
+    );
+
+    auto obc = obc_manager.get_obc();
+    pull_info.obc = obc;
+    recovery_waiter.obc = obc;
+    // TODO: move to ObjectContextLoader once constructing obc from attrset is supported
+    obc->obs.oi.decode_no_oid(push_op.attrset.at(OI_ATTR),
+                              push_op.soid);
+    auto ss_attr_iter = push_op.attrset.find(SS_ATTR);
+    if (ss_attr_iter != push_op.attrset.end()) {
+      if (!obc->ssc) {
+        obc->ssc = new crimson::osd::SnapSetContext(
+          push_op.soid.get_snapdir());
+      }
+      try {
+        obc->ssc->snapset = SnapSet(ss_attr_iter->second);
+        obc->ssc->exists = true;
+      } catch (const buffer::error&) {
+        WARNDPP("unable to decode SnapSet", pg);
+        throw crimson::osd::invalid_argument();
+      }
+      assert(!pull_info.obc->ssc->exists ||
+             obc->ssc->snapset.seq == pull_info.obc->ssc->snapset.seq);
+    }
+    pull_info.recovery_info.oi = obc->obs.oi;
+    if (pull_info.recovery_info.soid.snap &&
+        pull_info.recovery_info.soid.snap < CEPH_NOSNAP) {
+        recalc_subsets(pull_info.recovery_info,
+                       pull_info.obc->ssc);
+    }
+  }
 
   const bool first = pull_info.recovery_progress.first;
   pull_info.recovery_progress = push_op.after_progress;