]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd/osd_operations/client_request: retrieve the correct version
authorXuehan Xu <xxhdx1985126@gmail.com>
Mon, 15 Apr 2024 13:30:07 +0000 (21:30 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Mon, 22 Apr 2024 03:24:21 +0000 (11:24 +0800)
for objects to be recovered urgently

PG::is_unreadable_object() can't guarantee that it'll set the parameter
"v", so CommonClientRequest::do_recover_missing() has to retrieve it by
itself

Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/osd/osd_operations/client_request_common.cc

index 7865b4d7a1b60e08737a52d757990c269bce1729..62a586ef6283a7d4ee5f16f8c87e42810a0732ae 100644 (file)
@@ -73,12 +73,17 @@ CommonClientRequest::do_recover_missing(
   assert(pg->is_primary());
   logger().debug("{} reqid {} check for recovery, {}",
                  __func__, reqid, soid);
-  if (!pg->is_unreadable_object(soid, &ver) &&
+  auto &peering_state = pg->get_peering_state();
+  auto &missing_loc = peering_state.get_missing_loc();
+  bool needs_recovery = missing_loc.needs_recovery(soid, &ver);
+  if (!pg->is_unreadable_object(soid) &&
       !pg->is_degraded_or_backfilling_object(soid)) {
     logger().debug("{} reqid {} nothing to recover {}",
                    __func__, reqid, soid);
     return seastar::now();
   }
+  ceph_assert(needs_recovery);
+
   logger().debug("{} reqid {} need to wait for recovery, {} version {}",
                  __func__, reqid, soid, ver);
   if (pg->get_recovery_backend()->is_recovering(soid)) {