From 80878ea02e53b9f1b2638b85b493170ea9d133ff Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Mon, 22 Apr 2024 14:31:18 +0800 Subject: [PATCH] crimson/osd/osd_operations/client_request: cleanup, drop CommonClientRequest::recover_missings Signed-off-by: Yingxin Cheng (cherry picked from commit 5c1595d8441b61bd9d0ea4eb72c6079b395b0d1c) --- .../osd/osd_operations/client_request.cc | 39 +++++++++++++- .../osd_operations/client_request_common.cc | 53 ------------------- .../osd_operations/client_request_common.h | 7 --- 3 files changed, 37 insertions(+), 62 deletions(-) diff --git a/src/crimson/osd/osd_operations/client_request.cc b/src/crimson/osd/osd_operations/client_request.cc index 0d79c4f132c26..8f31284dab4b6 100644 --- a/src/crimson/osd/osd_operations/client_request.cc +++ b/src/crimson/osd/osd_operations/client_request.cc @@ -260,8 +260,43 @@ ClientRequest::process_op( co_await ihref.enter_stage( client_pp(*pg).recover_missing, *this ); - co_await recover_missings(pg, m->get_hobj(), - snaps_need_to_recover(), m->get_reqid()); + if (!pg->is_primary()) { + DEBUGDPP( + "Skipping recover_missings on non primary pg for soid {}", + *pg, m->get_hobj()); + } else { + co_await do_recover_missing(pg, m->get_hobj().get_head(), m->get_reqid()); + std::set snaps = snaps_need_to_recover(); + if (!snaps.empty()) { + auto with_obc = pg->obc_loader.with_obc( + m->get_hobj().get_head(), + [&snaps, pg, this](auto head, auto) { + return InterruptibleOperation::interruptor::do_for_each( + snaps, + [head, pg, this](auto &snap) + -> InterruptibleOperation::template interruptible_future<> { + auto coid = head->obs.oi.soid; + coid.snap = snap; + auto oid = resolve_oid(head->get_head_ss(), coid); + /* Rollback targets may legitimately not exist if, for instance, + * the object is an rbd block which happened to be sparse and + * therefore non-existent at the time of the specified snapshot. + * In such a case, rollback will simply delete the object. Here, + * we skip the oid as there is no corresponding clone to recover. + * See https://tracker.ceph.com/issues/63821 */ + if (oid) { + return do_recover_missing(pg, *oid, m->get_reqid()); + } else { + return seastar::now(); + } + }); + }).handle_error_interruptible( + crimson::ct_error::assert_all("unexpected error") + ); + // see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98401 + co_await std::move(with_obc); + } + } DEBUGDPP("{}.{}: checking already_complete", *pg, *this, this_instance_id); diff --git a/src/crimson/osd/osd_operations/client_request_common.cc b/src/crimson/osd/osd_operations/client_request_common.cc index 657bdf7bd60bb..547b9f2db2f44 100644 --- a/src/crimson/osd/osd_operations/client_request_common.cc +++ b/src/crimson/osd/osd_operations/client_request_common.cc @@ -11,61 +11,8 @@ namespace { } } -SET_SUBSYS(osd); - namespace crimson::osd { -InterruptibleOperation::template interruptible_future<> -CommonClientRequest::recover_missings( - Ref pg, - const hobject_t& soid, - std::set &&snaps, - const osd_reqid_t& reqid) -{ - LOG_PREFIX(CommonClientRequest::recover_missings); - if (!pg->is_primary()) { - DEBUGDPP( - "Skipping recover_missings on non primary pg for soid {}", *pg, soid); - return seastar::now(); - } - return do_recover_missing( - pg, soid.get_head(), reqid - ).then_interruptible([snaps=std::move(snaps), pg, soid, reqid]() mutable { - if (snaps.empty()) { - return InterruptibleOperation::interruptor::now(); - } - return seastar::do_with( - std::move(snaps), - [pg, soid, reqid](auto& snaps) { - return pg->obc_loader.with_obc( - soid.get_head(), - [&snaps, pg, soid, reqid](auto head, auto) { - return InterruptibleOperation::interruptor::do_for_each( - snaps, - [pg, soid, head, reqid](auto &snap) - -> InterruptibleOperation::template interruptible_future<> { - auto coid = head->obs.oi.soid; - coid.snap = snap; - auto oid = resolve_oid(head->get_head_ss(), coid); - /* Rollback targets may legitimately not exist if, for instance, - * the object is an rbd block which happened to be sparse and - * therefore non-existent at the time of the specified snapshot. - * In such a case, rollback will simply delete the object. Here, - * we skip the oid as there is no corresponding clone to recover. - * See https://tracker.ceph.com/issues/63821 */ - if (oid) { - return do_recover_missing(pg, *oid, reqid); - } else { - return seastar::now(); - } - }); - }).handle_error_interruptible( - crimson::ct_error::assert_all("unexpected error") - ); - }); - }); -} - typename InterruptibleOperation::template interruptible_future<> CommonClientRequest::do_recover_missing( Ref pg, diff --git a/src/crimson/osd/osd_operations/client_request_common.h b/src/crimson/osd/osd_operations/client_request_common.h index 906ce53b50a95..85f118d64c16f 100644 --- a/src/crimson/osd/osd_operations/client_request_common.h +++ b/src/crimson/osd/osd_operations/client_request_common.h @@ -11,13 +11,6 @@ namespace crimson::osd { struct CommonClientRequest { - static InterruptibleOperation::template interruptible_future<> - recover_missings( - Ref pg, - const hobject_t& soid, - std::set &&snaps, - const osd_reqid_t& reqid); - static InterruptibleOperation::template interruptible_future<> do_recover_missing( Ref pg, -- 2.39.5