From: Radosław Zarzyński Date: Wed, 20 Apr 2022 21:55:30 +0000 (+0200) Subject: crimson/osd: migrate PeeringEvent to new tracking infra, part 2 X-Git-Tag: v18.0.0~947^2~12 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=232ea2cf45e5409ef30bf77926023bb9c782a293;p=ceph.git crimson/osd: migrate PeeringEvent to new tracking infra, part 2 Signed-off-by: Radosław Zarzyński --- diff --git a/src/crimson/osd/osd_operation_external_tracking.h b/src/crimson/osd/osd_operation_external_tracking.h index b7b56a9a1474d..97794aa66b7b0 100644 --- a/src/crimson/osd/osd_operation_external_tracking.h +++ b/src/crimson/osd/osd_operation_external_tracking.h @@ -136,7 +136,14 @@ struct EventBackendRegistry { }; template <> -struct EventBackendRegistry { +struct EventBackendRegistry { + static std::tuple<> get_backends() { + return {/* no extenral backends */}; + } +}; + +template <> +struct EventBackendRegistry { static std::tuple<> get_backends() { return {/* no extenral backends */}; } diff --git a/src/crimson/osd/osd_operations/background_recovery.h b/src/crimson/osd/osd_operations/background_recovery.h index 6f811fa9bb1e1..8f726c51a6370 100644 --- a/src/crimson/osd/osd_operations/background_recovery.h +++ b/src/crimson/osd/osd_operations/background_recovery.h @@ -89,7 +89,10 @@ public: static constexpr auto type_name = "BackfillRecovery::PGPipeline::process"; } process; friend class BackfillRecovery; + template friend class PeeringEvent; + friend class LocalPeeringEvent; + friend class RemotePeeringEvent; }; template diff --git a/src/crimson/osd/osd_operations/peering_event.cc b/src/crimson/osd/osd_operations/peering_event.cc index a5893f262f2f1..4877a05cfc1be 100644 --- a/src/crimson/osd/osd_operations/peering_event.cc +++ b/src/crimson/osd/osd_operations/peering_event.cc @@ -21,7 +21,8 @@ namespace { namespace crimson::osd { -void PeeringEvent::print(std::ostream &lhs) const +template +void PeeringEvent::print(std::ostream &lhs) const { lhs << "PeeringEvent(" << "from=" << from @@ -32,7 +33,8 @@ void PeeringEvent::print(std::ostream &lhs) const << ")"; } -void PeeringEvent::dump_detail(Formatter *f) const +template +void PeeringEvent::dump_detail(Formatter *f) const { f->open_object_section("PeeringEvent"); f->dump_stream("from") << from; @@ -44,17 +46,18 @@ void PeeringEvent::dump_detail(Formatter *f) const } -PeeringEvent::PGPipeline &PeeringEvent::pp(PG &pg) +template +PGPeeringPipeline &PeeringEvent::pp(PG &pg) { return pg.peering_request_pg_pipeline; } -seastar::future<> PeeringEvent::start() +template +seastar::future<> PeeringEvent::start() { - logger().debug("{}: start", *this); - IRef ref = this; + typename T::IRef ref = static_cast(this); auto maybe_delay = seastar::now(); if (delay) { maybe_delay = seastar::sleep( @@ -69,27 +72,28 @@ seastar::future<> PeeringEvent::start() handle.exit(); return complete_rctx_no_pg(); } + using interruptor = typename T::interruptor; return interruptor::with_interruption([this, pg] { logger().debug("{}: pg present", *this); - return enter_stage( + return this->template enter_stage( pp(*pg).await_map ).then_interruptible([this, pg] { - return with_blocking_event( + return this->template with_blocking_event( [this, pg] (auto&& trigger) { return pg->osdmap_gate.wait_for_map(std::move(trigger), evt.get_epoch_sent()); }); }).then_interruptible([this, pg](auto) { - return enter_stage(pp(*pg).process); + 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 enter_stage(BackfillRecovery::bp(*pg).process); + return this->template enter_stage(BackfillRecovery::bp(*pg).process); }).then_interruptible([this, pg] { pg->do_peering_event(evt, ctx); handle.exit(); return complete_rctx(pg); - }).then_interruptible([this, pg] () -> PeeringEvent::interruptible_future<> { + }).then_interruptible([this, pg] () -> typename T::template interruptible_future<> { if (!pg->get_need_up_thru()) { return seastar::now(); } @@ -108,12 +112,15 @@ seastar::future<> PeeringEvent::start() }); } -void PeeringEvent::on_pg_absent() +template +void PeeringEvent::on_pg_absent() { logger().debug("{}: pg absent, dropping", *this); } -PeeringEvent::interruptible_future<> PeeringEvent::complete_rctx(Ref pg) +template +typename PeeringEvent::template interruptible_future<> +PeeringEvent::complete_rctx(Ref pg) { logger().debug("{}: submitting ctx", *this); return shard_services.dispatch_context( @@ -154,7 +161,7 @@ void RemotePeeringEvent::on_pg_absent() } } -PeeringEvent::interruptible_future<> RemotePeeringEvent::complete_rctx(Ref pg) +RemotePeeringEvent::interruptible_future<> RemotePeeringEvent::complete_rctx(Ref pg) { if (pg) { return PeeringEvent::complete_rctx(pg); @@ -178,25 +185,30 @@ seastar::future<> RemotePeeringEvent::complete_rctx_no_pg() seastar::future> RemotePeeringEvent::get_pg() { -#if 0 return enter_stage<>(op().await_active).then([this] { return osd.state.when_active(); }).then([this] { return enter_stage<>(cp().await_map); }).then([this] { - return with_blocking_future( - osd.osdmap_gate.wait_for_map(evt.get_epoch_sent())); + using OSDMapBlockingEvent = + OSD_OSDMapGate::OSDMapBlocker::BlockingEvent; + return with_blocking_event( + [this] (auto&& trigger) { + return osd.osdmap_gate.wait_for_map(std::move(trigger), + evt.get_epoch_sent()); + }); }).then([this](auto epoch) { logger().debug("{}: got map {}", *this, epoch); - return with_blocking_future(handle.enter(cp().get_pg)); + return enter_stage<>(cp().get_pg); }).then([this] { - return with_blocking_future( - osd.get_or_create_pg( - pgid, evt.get_epoch_sent(), std::move(evt.create_info))); + return with_blocking_event( + [this] (auto&& trigger) { + return osd.get_or_create_pg(std::move(trigger), + pgid, + evt.get_epoch_sent(), + std::move(evt.create_info)); + }); }); -#else - return seastar::make_ready_future>(nullptr); -#endif } seastar::future> LocalPeeringEvent::get_pg() { @@ -205,4 +217,7 @@ seastar::future> LocalPeeringEvent::get_pg() { LocalPeeringEvent::~LocalPeeringEvent() {} +template class PeeringEvent; +template class PeeringEvent; + } diff --git a/src/crimson/osd/osd_operations/peering_event.h b/src/crimson/osd/osd_operations/peering_event.h index 9e44dfc3a94c1..8d0aa26d4505a 100644 --- a/src/crimson/osd/osd_operations/peering_event.h +++ b/src/crimson/osd/osd_operations/peering_event.h @@ -23,24 +23,28 @@ class OSD; class ShardServices; class PG; -class PeeringEvent : public PhasedOperationT { -public: - static constexpr OperationTypeCode type = OperationTypeCode::peering_event; - - class PGPipeline { + class PGPeeringPipeline { struct AwaitMap : OrderedExclusivePhaseT { static constexpr auto type_name = "PeeringEvent::PGPipeline::await_map"; } await_map; struct Process : OrderedExclusivePhaseT { static constexpr auto type_name = "PeeringEvent::PGPipeline::process"; } process; + template friend class PeeringEvent; + friend class LocalPeeringEvent; + friend class RemotePeeringEvent; friend class PGAdvanceMap; }; +template +class PeeringEvent : public PhasedOperationT { +public: + static constexpr OperationTypeCode type = OperationTypeCode::peering_event; + protected: PipelineHandle handle; - PGPipeline &pp(PG &pg); + PGPeeringPipeline &pp(PG &pg); ShardServices &shard_services; PeeringCtx ctx; @@ -62,7 +66,10 @@ protected: } virtual void on_pg_absent(); - virtual PeeringEvent::interruptible_future<> complete_rctx(Ref); + + virtual typename PeeringEvent::template interruptible_future<> + complete_rctx(Ref); + virtual seastar::future<> complete_rctx_no_pg() { return seastar::now();} virtual seastar::future> get_pg() = 0; @@ -90,26 +97,9 @@ public: void print(std::ostream &) const final; void dump_detail(ceph::Formatter* f) const final; seastar::future<> start(); - - std::tuple< - StartEvent, - PGPipeline::AwaitMap::BlockingEvent, - PG_OSDMapGate::OSDMapBlocker::BlockingEvent, - PGPipeline::Process::BlockingEvent, - BackfillRecovery::BackfillRecoveryPipeline::Process::BlockingEvent, -#if 0 - PGPipeline::WaitForActive::BlockingEvent, - PGActivationBlocker::BlockingEvent, - PGPipeline::RecoverMissing::BlockingEvent, - PGPipeline::GetOBC::BlockingEvent, - PGPipeline::WaitRepop::BlockingEvent, - PGPipeline::SendReply::BlockingEvent, -#endif - CompletionEvent - > tracking_events; }; -class RemotePeeringEvent : public PeeringEvent { +class RemotePeeringEvent : public PeeringEvent { protected: OSD &osd; crimson::net::ConnectionRef conn; @@ -146,17 +136,38 @@ public: conn(conn) {} +#if 0 std::tuple< - OSDPipeline::AwaitActive::BlockingEvent, + > tracking_events; +#endif + + std::tuple< + StartEvent, ConnectionPipeline::AwaitMap::BlockingEvent, - ConnectionPipeline::GetPG::BlockingEvent + OSD_OSDMapGate::OSDMapBlocker::BlockingEvent, + ConnectionPipeline::GetPG::BlockingEvent, + PGMap::PGCreationBlockingEvent, + PGPeeringPipeline::AwaitMap::BlockingEvent, + PG_OSDMapGate::OSDMapBlocker::BlockingEvent, + PGPeeringPipeline::Process::BlockingEvent, + BackfillRecovery::BackfillRecoveryPipeline::Process::BlockingEvent, + OSDPipeline::AwaitActive::BlockingEvent, +#if 0 + PGPipeline::WaitForActive::BlockingEvent, + PGActivationBlocker::BlockingEvent, + PGPipeline::RecoverMissing::BlockingEvent, + PGPipeline::GetOBC::BlockingEvent, + PGPipeline::WaitRepop::BlockingEvent, + PGPipeline::SendReply::BlockingEvent, +#endif + CompletionEvent > tracking_events; private: ConnectionPipeline &cp(); OSDPipeline &op(); }; -class LocalPeeringEvent final : public PeeringEvent { +class LocalPeeringEvent final : public PeeringEvent { protected: seastar::future> get_pg() final; @@ -170,6 +181,23 @@ public: {} virtual ~LocalPeeringEvent(); + + std::tuple< + StartEvent, + PGPeeringPipeline::AwaitMap::BlockingEvent, + PG_OSDMapGate::OSDMapBlocker::BlockingEvent, + PGPeeringPipeline::Process::BlockingEvent, + BackfillRecovery::BackfillRecoveryPipeline::Process::BlockingEvent, +#if 0 + PGPipeline::WaitForActive::BlockingEvent, + PGActivationBlocker::BlockingEvent, + PGPipeline::RecoverMissing::BlockingEvent, + PGPipeline::GetOBC::BlockingEvent, + PGPipeline::WaitRepop::BlockingEvent, + PGPipeline::SendReply::BlockingEvent, +#endif + CompletionEvent + > tracking_events; }; diff --git a/src/crimson/osd/osd_operations/pg_advance_map.h b/src/crimson/osd/osd_operations/pg_advance_map.h index b925f6d369c40..1bb53f0dc8998 100644 --- a/src/crimson/osd/osd_operations/pg_advance_map.h +++ b/src/crimson/osd/osd_operations/pg_advance_map.h @@ -45,7 +45,7 @@ public: seastar::future<> start(); std::tuple< - PeeringEvent::PGPipeline::Process::BlockingEvent + PGPeeringPipeline::Process::BlockingEvent > tracking_events; }; diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index 699627da42638..b44aac4a95232 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -69,7 +69,7 @@ class PG : public boost::intrusive_ref_counter< using cached_map_t = boost::local_shared_ptr; ClientRequest::PGPipeline client_request_pg_pipeline; - PeeringEvent::PGPipeline peering_request_pg_pipeline; + PGPeeringPipeline peering_request_pg_pipeline; RepRequest::PGPipeline replicated_request_pg_pipeline; spg_t pgid; @@ -728,6 +728,7 @@ private: friend class ClientRequest; friend struct CommonClientRequest; friend class PGAdvanceMap; + template friend class PeeringEvent; friend class RepRequest; friend class BackfillRecovery;