]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: implement ECRecoveryBackend::recover_object()
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 26 Mar 2024 14:24:59 +0000 (14:24 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 27 Jan 2026 14:37:36 +0000 (14:37 +0000)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/ec_recovery_backend.cc

index a8721734fa895929080b287ba90eaee09cd976c3..33f4276a34f64a0a35099c0ae29cdeaa7a845398 100644 (file)
@@ -42,7 +42,30 @@ ECRecoveryBackend::recover_object(
   eversion_t need)
 {
   logger().debug("{}: {}, {}", __func__, soid, need);
-  return seastar::now();
+  // always add_recovering(soid) before recover_object(soid)
+  assert(is_recovering(soid));
+  return pg.obc_loader.with_obc<RWState::RWREAD>(soid,
+    [this, soid, need](auto head, auto obc) {
+    logger().debug("recover_object: loaded obc: {}", obc->obs.oi.soid);
+    auto& recovery_waiter = get_recovering(soid);
+    recovery_waiter.obc = obc;
+    recovery_waiter.obc->wait_recovery_read();
+    //logger().info("{}: starting {}", __func__, rop);
+    assert(!recovery_ops.count(soid));
+    recovery_ops[soid] =
+      ECCommon::RecoveryBackend::recover_object(soid, need, head, obc);
+    assert(soid == recovery_ops[soid].hoid);
+    RecoveryMessages m;
+    continue_recovery_op(recovery_ops[soid], &m);
+    dispatch_recovery_messages(m, 0/* FIXME: priority */);
+    return seastar::now();
+  }).handle_error_interruptible(
+    crimson::osd::PG::load_obc_ertr::all_same_way([soid](auto& code) {
+    // TODO: may need eio handling?
+    logger().error("recover_object saw error code {}, ignoring object {}",
+                   code, soid);
+    return seastar::now();
+  }));
 }
 
 void ECRecoveryBackend::commit_txn_send_replies(