]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd/osd_operations/client_request_common: `PeeringState::needs_recovery()` 57691/head
authorXuehan Xu <xuxuehan@qianxin.com>
Fri, 24 May 2024 09:30:41 +0000 (17:30 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Tue, 18 Jun 2024 10:56:57 +0000 (18:56 +0800)
may fail if the object is under backfill

Meanwhile, set the correct version for backfill:
From Classic:
```
    if (is_degraded_or_backfilling_object(head)) {
      if (can_backoff && g_conf()->osd_backoff_on_degraded) {
        add_backoff(session, head, head);
        maybe_kick_recovery(head);
      }
```

```
void PrimaryLogPG::maybe_kick_recovery(
  const hobject_t &soid)
{
  eversion_t v;
  bool work_started = false;
  if (!recovery_state.get_missing_loc().needs_recovery(soid, &v))
    return;
```

Fixes: https://tracker.ceph.com/issues/66216
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
Signed-off-by: Matan Breizman <mbreizma@redhat.com>
src/crimson/osd/osd_operations/client_request_common.cc

index 547b9f2db2f44a0062f5693e90af29e9e4016237..c4439d5bb35d069f3036f296bfbe6063adaca42a 100644 (file)
@@ -19,20 +19,34 @@ CommonClientRequest::do_recover_missing(
   const hobject_t& soid,
   const osd_reqid_t& reqid)
 {
-  eversion_t ver;
-  assert(pg->is_primary());
   logger().debug("{} reqid {} check for recovery, {}",
                  __func__, reqid, soid);
+  assert(pg->is_primary());
+  eversion_t 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)) {
+  bool needs_recovery_or_backfill = false;
+
+  if (pg->is_unreadable_object(soid)) {
+    logger().debug("{} reqid {}, {} is unreadable",
+                   __func__, reqid, soid);
+    ceph_assert(missing_loc.needs_recovery(soid, &ver));
+    needs_recovery_or_backfill = true;
+  }
+
+  if (pg->is_degraded_or_backfilling_object(soid)) {
+    logger().debug("{} reqid {}, {} is degraded or backfilling",
+                   __func__, reqid, soid);
+    if (missing_loc.needs_recovery(soid, &ver)) {
+      needs_recovery_or_backfill = true;
+    }
+  }
+
+  if (!needs_recovery_or_backfill) {
     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);