From 1534d6eb280f2e19c36956737a26edc5607470f2 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Wed, 12 May 2021 14:29:25 +0000 Subject: [PATCH] crimson/osd: share do_recover_missing() between {Internal,}ClientRequest. Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/CMakeLists.txt | 1 + src/crimson/osd/osd_operation.h | 9 +++-- .../osd/osd_operations/client_request.cc | 20 ----------- .../osd/osd_operations/client_request.h | 5 +-- .../osd_operations/client_request_common.cc | 36 +++++++++++++++++++ .../osd_operations/client_request_common.h | 16 +++++++++ .../osd_operations/internal_client_request.cc | 8 ----- .../osd_operations/internal_client_request.h | 5 +-- src/crimson/osd/pg.h | 1 + 9 files changed, 66 insertions(+), 35 deletions(-) create mode 100644 src/crimson/osd/osd_operations/client_request_common.cc create mode 100644 src/crimson/osd/osd_operations/client_request_common.h diff --git a/src/crimson/osd/CMakeLists.txt b/src/crimson/osd/CMakeLists.txt index 0b8e5ac3a79..934f96f3cd3 100644 --- a/src/crimson/osd/CMakeLists.txt +++ b/src/crimson/osd/CMakeLists.txt @@ -14,6 +14,7 @@ add_executable(crimson-osd ops_executer.cc osd_operation.cc osd_operations/client_request.cc + osd_operations/client_request_common.cc osd_operations/compound_peering_request.cc osd_operations/internal_client_request.cc osd_operations/peering_event.cc diff --git a/src/crimson/osd/osd_operation.h b/src/crimson/osd/osd_operation.h index d3772ad0f61..f099a06e7df 100644 --- a/src/crimson/osd/osd_operation.h +++ b/src/crimson/osd/osd_operation.h @@ -39,9 +39,7 @@ static_assert( (sizeof(OP_NAMES)/sizeof(OP_NAMES[0])) == static_cast(OperationTypeCode::last_op)); -template -class OperationT : public Operation { -public: +struct InterruptibleOperation : Operation { template using interruptible_future = ::crimson::interruptible::interruptible_future< @@ -49,6 +47,11 @@ public: using interruptor = ::crimson::interruptible::interruptor< ::crimson::osd::IOInterruptCondition>; +}; + +template +class OperationT : public InterruptibleOperation { +public: static constexpr const char *type_name = OP_NAMES[static_cast(T::type)]; using IRef = boost::intrusive_ptr; diff --git a/src/crimson/osd/osd_operations/client_request.cc b/src/crimson/osd/osd_operations/client_request.cc index 4c6d616923f..426b7bbdf14 100644 --- a/src/crimson/osd/osd_operations/client_request.cc +++ b/src/crimson/osd/osd_operations/client_request.cc @@ -201,26 +201,6 @@ ClientRequest::process_op(Ref &pg) })); } -ClientRequest::interruptible_future<> -ClientRequest::do_recover_missing(Ref& pg, const hobject_t& soid) -{ - eversion_t ver; - logger().debug("{} check for recovery, {}", *this, soid); - if (!pg->is_unreadable_object(soid, &ver) && - !pg->is_degraded_or_backfilling_object(soid)) { - return seastar::now(); - } - logger().debug("{} need to wait for recovery, {}", *this, soid); - if (pg->get_recovery_backend()->is_recovering(soid)) { - return pg->get_recovery_backend()->get_recovering(soid).wait_for_recovered(); - } else { - auto [op, fut] = - pg->get_shard_services().start_operation( - soid, ver, pg, pg->get_shard_services(), pg->get_osdmap_epoch()); - return std::move(fut); - } -} - ClientRequest::interruptible_future<> ClientRequest::do_process(Ref& pg, crimson::osd::ObjectContextRef obc) { diff --git a/src/crimson/osd/osd_operations/client_request.h b/src/crimson/osd/osd_operations/client_request.h index 42bd36f86e6..d346dca87fa 100644 --- a/src/crimson/osd/osd_operations/client_request.h +++ b/src/crimson/osd/osd_operations/client_request.h @@ -7,6 +7,7 @@ #include "crimson/net/Connection.h" #include "crimson/osd/object_context.h" #include "crimson/osd/osd_operation.h" +#include "crimson/osd/osd_operations/client_request_common.h" #include "crimson/osd/osd_operations/common/pg_pipeline.h" #include "crimson/common/type_helpers.h" #include "messages/MOSDOp.h" @@ -15,7 +16,8 @@ namespace crimson::osd { class PG; class OSD; -class ClientRequest final : public OperationT { +class ClientRequest final : public OperationT, + private CommonClientRequest { OSD &osd; crimson::net::ConnectionRef conn; Ref m; @@ -51,7 +53,6 @@ public: seastar::future<> start(); private: - interruptible_future<> do_recover_missing(Ref& pgref, const hobject_t& soid); interruptible_future<> do_process( Ref& pg, crimson::osd::ObjectContextRef obc); diff --git a/src/crimson/osd/osd_operations/client_request_common.cc b/src/crimson/osd/osd_operations/client_request_common.cc new file mode 100644 index 00000000000..b39b2465a2d --- /dev/null +++ b/src/crimson/osd/osd_operations/client_request_common.cc @@ -0,0 +1,36 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:nil -*- +// vim: ts=8 sw=2 smarttab expandtab + +#include "crimson/osd/osd_operations/client_request_common.h" +#include "crimson/osd/pg.h" + +namespace { + seastar::logger& logger() { + return crimson::get_logger(ceph_subsys_osd); + } +} + +namespace crimson::osd { + +typename InterruptibleOperation::template interruptible_future<> +CommonClientRequest::do_recover_missing( + Ref& pg, const hobject_t& soid) +{ + eversion_t ver; + logger().debug("{} check for recovery, {}", __func__, soid); + if (!pg->is_unreadable_object(soid, &ver) && + !pg->is_degraded_or_backfilling_object(soid)) { + return seastar::now(); + } + logger().debug("{} need to wait for recovery, {}", __func__, soid); + if (pg->get_recovery_backend()->is_recovering(soid)) { + return pg->get_recovery_backend()->get_recovering(soid).wait_for_recovered(); + } else { + auto [op, fut] = + pg->get_shard_services().start_operation( + soid, ver, pg, pg->get_shard_services(), pg->get_osdmap_epoch()); + return std::move(fut); + } +} + +} // namespace crimson::osd diff --git a/src/crimson/osd/osd_operations/client_request_common.h b/src/crimson/osd/osd_operations/client_request_common.h new file mode 100644 index 00000000000..bf826d847f7 --- /dev/null +++ b/src/crimson/osd/osd_operations/client_request_common.h @@ -0,0 +1,16 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#pragma once + +#include "crimson/common/type_helpers.h" +#include "crimson/osd/osd_operation.h" + +namespace crimson::osd { + +struct CommonClientRequest { + static InterruptibleOperation::template interruptible_future<> + do_recover_missing(Ref& pg, const hobject_t& soid); +}; + +} // namespace crimson::osd diff --git a/src/crimson/osd/osd_operations/internal_client_request.cc b/src/crimson/osd/osd_operations/internal_client_request.cc index 71ebc12acfe..c2942fb505c 100644 --- a/src/crimson/osd/osd_operations/internal_client_request.cc +++ b/src/crimson/osd/osd_operations/internal_client_request.cc @@ -122,13 +122,5 @@ seastar::future<> InternalClientRequest::start() }); } -InternalClientRequest::interruptible_future<> -InternalClientRequest::do_recover_missing( - Ref& pgref, const hobject_t& soid) -{ - // TODO: share this with ClientRequest - return seastar::now(); -} - } // namespace crimson::osd diff --git a/src/crimson/osd/osd_operations/internal_client_request.h b/src/crimson/osd/osd_operations/internal_client_request.h index 57ee32cf219..b468b3d15cf 100644 --- a/src/crimson/osd/osd_operations/internal_client_request.h +++ b/src/crimson/osd/osd_operations/internal_client_request.h @@ -5,11 +5,13 @@ #include "crimson/common/type_helpers.h" #include "crimson/osd/osd_operation.h" +#include "crimson/osd/osd_operations/client_request_common.h" #include "crimson/osd/pg.h" namespace crimson::osd { -class InternalClientRequest : public OperationT { +class InternalClientRequest : public OperationT, + private CommonClientRequest { public: explicit InternalClientRequest(Ref pg); ~InternalClientRequest(); @@ -37,7 +39,6 @@ private: CommonPGPipeline& pp(); - interruptible_future<> do_recover_missing(Ref& pgref, const hobject_t& soid); seastar::future<> do_process(); Ref pg; diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index b3d24eb5487..45958c4b8e2 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -729,6 +729,7 @@ private: friend std::ostream& operator<<(std::ostream&, const PG& pg); friend class ClientRequest; + friend struct CommonClientRequest; friend class PGAdvanceMap; friend class PeeringEvent; friend class RepRequest; -- 2.47.3