Skip to content

Commit 5716f03

Browse files
committed
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 <[email protected]> Signed-off-by: Matan Breizman <[email protected]>
1 parent 9637ffe commit 5716f03

File tree

1 file changed

+20
-6
lines changed

1 file changed

+20
-6
lines changed

src/crimson/osd/osd_operations/client_request_common.cc

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,34 @@ CommonClientRequest::do_recover_missing(
1919
const hobject_t& soid,
2020
const osd_reqid_t& reqid)
2121
{
22-
eversion_t ver;
23-
assert(pg->is_primary());
2422
logger().debug("{} reqid {} check for recovery, {}",
2523
__func__, reqid, soid);
24+
assert(pg->is_primary());
25+
eversion_t ver;
2626
auto &peering_state = pg->get_peering_state();
2727
auto &missing_loc = peering_state.get_missing_loc();
28-
bool needs_recovery = missing_loc.needs_recovery(soid, &ver);
29-
if (!pg->is_unreadable_object(soid) &&
30-
!pg->is_degraded_or_backfilling_object(soid)) {
28+
bool needs_recovery_or_backfill = false;
29+
30+
if (pg->is_unreadable_object(soid)) {
31+
logger().debug("{} reqid {}, {} is unreadable",
32+
__func__, reqid, soid);
33+
ceph_assert(missing_loc.needs_recovery(soid, &ver));
34+
needs_recovery_or_backfill = true;
35+
}
36+
37+
if (pg->is_degraded_or_backfilling_object(soid)) {
38+
logger().debug("{} reqid {}, {} is degraded or backfilling",
39+
__func__, reqid, soid);
40+
if (missing_loc.needs_recovery(soid, &ver)) {
41+
needs_recovery_or_backfill = true;
42+
}
43+
}
44+
45+
if (!needs_recovery_or_backfill) {
3146
logger().debug("{} reqid {} nothing to recover {}",
3247
__func__, reqid, soid);
3348
return seastar::now();
3449
}
35-
ceph_assert(needs_recovery);
3650

3751
logger().debug("{} reqid {} need to wait for recovery, {} version {}",
3852
__func__, reqid, soid, ver);

0 commit comments

Comments
 (0)