From 02c630d5b2a9c648f0a6b296e95ee2465ddf88d4 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Fri, 10 Feb 2023 15:36:07 +0800 Subject: [PATCH] crimson/osd/pg: synchronize processing of peering events and backfill events All peering events and backfill events for the same pg has to be processed sequentially, so use a single pipeline phase to synchronize them. Signed-off-by: Xuehan Xu --- .../osd/osd_operations/background_recovery.cc | 4 ++-- .../osd/osd_operations/background_recovery.h | 16 ++++------------ .../osd/osd_operations/client_request_common.cc | 1 + src/crimson/osd/osd_operations/peering_event.cc | 5 ----- src/crimson/osd/osd_operations/peering_event.h | 5 ++--- src/crimson/osd/pg.cc | 1 + src/crimson/osd/pg.h | 4 +--- src/crimson/osd/pg_recovery.h | 5 +++++ src/crimson/osd/recovery_backend.cc | 1 + 9 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/crimson/osd/osd_operations/background_recovery.cc b/src/crimson/osd/osd_operations/background_recovery.cc index 116a9010d1c27..41ad87a32bf24 100644 --- a/src/crimson/osd/osd_operations/background_recovery.cc +++ b/src/crimson/osd/osd_operations/background_recovery.cc @@ -172,9 +172,9 @@ PglogBasedRecovery::do_recovery() }); } -BackfillRecovery::BackfillRecoveryPipeline &BackfillRecovery::bp(PG &pg) +PGPeeringPipeline &BackfillRecovery::bp(PG &pg) { - return pg.backfill_pipeline; + return pg.peering_request_pg_pipeline; } BackfillRecovery::interruptible_future diff --git a/src/crimson/osd/osd_operations/background_recovery.h b/src/crimson/osd/osd_operations/background_recovery.h index dbccfd22e126a..4a1ea1900c65f 100644 --- a/src/crimson/osd/osd_operations/background_recovery.h +++ b/src/crimson/osd/osd_operations/background_recovery.h @@ -9,6 +9,8 @@ #include "crimson/osd/osd_operation.h" #include "crimson/osd/recovery_backend.h" #include "crimson/common/type_helpers.h" +#include "crimson/osd/osd_operations/peering_event.h" +#include "crimson/osd/pg.h" namespace crimson::osd { class PG; @@ -95,16 +97,6 @@ private: class BackfillRecovery final : public BackgroundRecoveryT { public: - class BackfillRecoveryPipeline { - struct Process : OrderedExclusivePhaseT { - static constexpr auto type_name = "BackfillRecovery::PGPipeline::process"; - } process; - friend class BackfillRecovery; - template - friend class PeeringEvent; - friend class LocalPeeringEvent; - friend class RemotePeeringEvent; - }; template BackfillRecovery( @@ -113,18 +105,18 @@ public: epoch_t epoch_started, const EventT& evt); - static BackfillRecoveryPipeline &bp(PG &pg); PipelineHandle& get_handle() { return handle; } std::tuple< OperationThrottler::BlockingEvent, - BackfillRecoveryPipeline::Process::BlockingEvent + PGPeeringPipeline::Process::BlockingEvent > tracking_events; private: boost::intrusive_ptr evt; PipelineHandle handle; + static PGPeeringPipeline &bp(PG &pg); interruptible_future do_recovery() override; }; diff --git a/src/crimson/osd/osd_operations/client_request_common.cc b/src/crimson/osd/osd_operations/client_request_common.cc index 90916e4235990..e383d24e03b0d 100644 --- a/src/crimson/osd/osd_operations/client_request_common.cc +++ b/src/crimson/osd/osd_operations/client_request_common.cc @@ -3,6 +3,7 @@ #include "crimson/osd/osd_operations/client_request_common.h" #include "crimson/osd/pg.h" +#include "crimson/osd/osd_operations/background_recovery.h" namespace { seastar::logger& logger() { diff --git a/src/crimson/osd/osd_operations/peering_event.cc b/src/crimson/osd/osd_operations/peering_event.cc index 219cfcb453fb3..b323b4a817bf2 100644 --- a/src/crimson/osd/osd_operations/peering_event.cc +++ b/src/crimson/osd/osd_operations/peering_event.cc @@ -83,11 +83,6 @@ seastar::future<> PeeringEvent::with_pg( }); }).then_interruptible([this, pg](auto) { return this->template enter_stage(pp(*pg).process); - }).then_interruptible([this, pg] { - // TODO: likely we should synchronize also with the pg log-based - // recovery. - return this->template enter_stage( - BackfillRecovery::bp(*pg).process); }).then_interruptible([this, pg, &shard_services] { return pg->do_peering_event(evt, ctx ).then_interruptible([this, pg, &shard_services] { diff --git a/src/crimson/osd/osd_operations/peering_event.h b/src/crimson/osd/osd_operations/peering_event.h index f403f1fbbe4c7..44442cc01eede 100644 --- a/src/crimson/osd/osd_operations/peering_event.h +++ b/src/crimson/osd/osd_operations/peering_event.h @@ -8,7 +8,6 @@ #include "crimson/osd/osdmap_gate.h" #include "crimson/osd/osd_operation.h" -#include "crimson/osd/osd_operations/background_recovery.h" #include "osd/osd_types.h" #include "osd/PGPeeringEvent.h" #include "osd/PeeringState.h" @@ -22,6 +21,7 @@ namespace crimson::osd { class OSD; class ShardServices; class PG; +class BackfillRecovery; class PGPeeringPipeline { struct AwaitMap : OrderedExclusivePhaseT { @@ -35,6 +35,7 @@ class PG; friend class LocalPeeringEvent; friend class RemotePeeringEvent; friend class PGAdvanceMap; + friend class BackfillRecovery; }; template @@ -143,7 +144,6 @@ public: PGPeeringPipeline::AwaitMap::BlockingEvent, PG_OSDMapGate::OSDMapBlocker::BlockingEvent, PGPeeringPipeline::Process::BlockingEvent, - BackfillRecovery::BackfillRecoveryPipeline::Process::BlockingEvent, OSDPipeline::AwaitActive::BlockingEvent, CompletionEvent > tracking_events; @@ -180,7 +180,6 @@ public: PGPeeringPipeline::AwaitMap::BlockingEvent, PG_OSDMapGate::OSDMapBlocker::BlockingEvent, PGPeeringPipeline::Process::BlockingEvent, - BackfillRecovery::BackfillRecoveryPipeline::Process::BlockingEvent, CompletionEvent > tracking_events; }; diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index d4d76d1787eca..a9ca03d5987fc 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -37,6 +37,7 @@ #include "crimson/osd/ops_executer.h" #include "crimson/osd/osd_operations/osdop_params.h" #include "crimson/osd/osd_operations/peering_event.h" +#include "crimson/osd/osd_operations/background_recovery.h" #include "crimson/osd/pg_recovery.h" #include "crimson/osd/replicated_recovery_backend.h" diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index a1b0a70ccd1ab..14c68440be711 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -29,7 +29,6 @@ #include "crimson/osd/osd_operations/logmissing_request_reply.h" #include "crimson/osd/osd_operations/peering_event.h" #include "crimson/osd/osd_operations/replicated_request.h" -#include "crimson/osd/osd_operations/background_recovery.h" #include "crimson/osd/shard_services.h" #include "crimson/osd/osdmap_gate.h" #include "crimson/osd/pg_activation_blocker.h" @@ -58,6 +57,7 @@ namespace crimson::os { namespace crimson::osd { class OpsExecuter; +class BackfillRecovery; class PG : public boost::intrusive_ref_counter< PG, @@ -748,8 +748,6 @@ private: } private: - BackfillRecovery::BackfillRecoveryPipeline backfill_pipeline; - friend class IOInterruptCondition; struct log_update_t { std::set waiting_on; diff --git a/src/crimson/osd/pg_recovery.h b/src/crimson/osd/pg_recovery.h index 5d6acffa4ce2b..719d0ad2d34c8 100644 --- a/src/crimson/osd/pg_recovery.h +++ b/src/crimson/osd/pg_recovery.h @@ -11,9 +11,14 @@ #include "crimson/osd/pg_recovery_listener.h" #include "crimson/osd/scheduler/scheduler.h" #include "crimson/osd/shard_services.h" +#include "crimson/osd/recovery_backend.h" #include "osd/object_state.h" +namespace crimson::osd { +class UrgentRecovery; +} + class MOSDPGBackfillRemove; class PGBackend; diff --git a/src/crimson/osd/recovery_backend.cc b/src/crimson/osd/recovery_backend.cc index ca595a6ffaf5b..dd56cd6205e93 100644 --- a/src/crimson/osd/recovery_backend.cc +++ b/src/crimson/osd/recovery_backend.cc @@ -7,6 +7,7 @@ #include "crimson/osd/recovery_backend.h" #include "crimson/osd/pg.h" #include "crimson/osd/pg_backend.h" +#include "crimson/osd/osd_operations/background_recovery.h" #include "messages/MOSDFastDispatchOp.h" #include "osd/osd_types.h" -- 2.39.5