From: Xuehan Xu Date: Fri, 24 May 2024 09:30:41 +0000 (+0800) Subject: crimson/osd/osd_operations/client_request_common: `PeeringState::needs_recovery()` X-Git-Tag: testing/wip-xiubli-testing-20240802.055215-squid~46^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=93343286d7299ba45b3116361d63c39d69c18fbd;p=ceph-ci.git crimson/osd/osd_operations/client_request_common: `PeeringState::needs_recovery()` 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 Signed-off-by: Matan Breizman (cherry picked from commit 5716f03eac0a9255fb2e8c402735453c2f72b56a) --- diff --git a/src/crimson/osd/osd_operations/client_request_common.cc b/src/crimson/osd/osd_operations/client_request_common.cc index 547b9f2db2f..c4439d5bb35 100644 --- a/src/crimson/osd/osd_operations/client_request_common.cc +++ b/src/crimson/osd/osd_operations/client_request_common.cc @@ -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);