From: Xuehan Xu Date: Fri, 10 Feb 2023 07:36:07 +0000 (+0800) Subject: crimson/osd/pg: synchronize processing of peering events and backfill X-Git-Tag: v18.1.0~387^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=02c630d5b2a9c648f0a6b296e95ee2465ddf88d4;p=ceph-ci.git 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 --- diff --git a/src/crimson/osd/osd_operations/background_recovery.cc b/src/crimson/osd/osd_operations/background_recovery.cc index 116a9010d1c..41ad87a32bf 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 dbccfd22e12..4a1ea1900c6 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 90916e42359..e383d24e03b 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 219cfcb453f..b323b4a817b 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 f403f1fbbe4..44442cc01ee 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 d4d76d1787e..a9ca03d5987 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 a1b0a70ccd1..14c68440be7 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 5d6acffa4ce..719d0ad2d34 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 ca595a6ffaf..dd56cd6205e 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"