From e85d1f759c3345d2982140786357e3e67679da0c Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Mon, 8 Feb 2021 13:11:37 +0800 Subject: [PATCH] crimson/osd: refactor ClientRequest::do_process() instead of using a local lambda which tries to have a single point for handling both the happy path and failure path, it'd be simpler to just early return if we fail to handle a request, Signed-off-by: Kefu Chai --- .../osd/osd_operations/client_request.cc | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/src/crimson/osd/osd_operations/client_request.cc b/src/crimson/osd/osd_operations/client_request.cc index 6729ad735e1..cab167374d7 100644 --- a/src/crimson/osd/osd_operations/client_request.cc +++ b/src/crimson/osd/osd_operations/client_request.cc @@ -161,30 +161,22 @@ seastar::future<> ClientRequest::do_recover_missing(Ref& pg) seastar::future<> ClientRequest::do_process(Ref& pg, crimson::osd::ObjectContextRef obc) { - using do_ops_return_t = - crimson::errorator::future>; - return [&pg, obc]() -> do_ops_return_t { - if (!pg->is_primary()) { - // primary can handle both normal ops and balanced reads - if (is_misdirected(*pg)) { - logger().trace("process_op: dropping misdirected op"); - return seastar::make_ready_future>(); - } else if (const hobject_t& hoid = m->get_hobj(); - !pg->get_peering_state().can_serve_replica_read(hoid)) { - auto reply = make_message( - m.get(), -EAGAIN, pg->get_osdmap_epoch(), - m->get_flags() & (CEPH_OSD_FLAG_ACK|CEPH_OSD_FLAG_ONDISK), - !m->has_flag(CEPH_OSD_FLAG_RETURNVEC)); - return seastar::make_ready_future>(std::move(reply)); - } - } - return pg->do_osd_ops(m, obc, op_info); - }().safe_then([this](Ref reply) { - if (reply) { - return conn->send(std::move(reply)); - } else { + if (!pg->is_primary()) { + // primary can handle both normal ops and balanced reads + if (is_misdirected(*pg)) { + logger().trace("process_op: dropping misdirected op"); return seastar::now(); + } else if (const hobject_t& hoid = m->get_hobj(); + !pg->get_peering_state().can_serve_replica_read(hoid)) { + auto reply = make_message( + m.get(), -EAGAIN, pg->get_osdmap_epoch(), + m->get_flags() & (CEPH_OSD_FLAG_ACK|CEPH_OSD_FLAG_ONDISK), + !m->has_flag(CEPH_OSD_FLAG_RETURNVEC)); + return conn->send(std::move(reply)); } + } + return pg->do_osd_ops(m, obc, op_info).safe_then([this](Ref reply) { + return conn->send(std::move(reply)); }, crimson::ct_error::eagain::handle([this, &pg] { return process_op(pg); })); -- 2.39.5