From 5716f03eac0a9255fb2e8c402735453c2f72b56a Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Fri, 24 May 2024 17:30:41 +0800 Subject: [PATCH] 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 --- .../osd_operations/client_request_common.cc | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/crimson/osd/osd_operations/client_request_common.cc b/src/crimson/osd/osd_operations/client_request_common.cc index 547b9f2db2f44..c4439d5bb35d0 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); -- 2.39.5