From: Radoslaw Zarzynski Date: Tue, 12 May 2020 20:57:26 +0000 (+0200) Subject: crimson/osd: implement BackfillRecoveryPipeline. X-Git-Tag: v16.1.0~1720^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=aeae8c10cc77c77f421443e9e1f92498f9d980de;p=ceph.git crimson/osd: implement BackfillRecoveryPipeline. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/osd/osd_operations/background_recovery.cc b/src/crimson/osd/osd_operations/background_recovery.cc index f473e5a6ea5f..ae7f5c4258b3 100644 --- a/src/crimson/osd/osd_operations/background_recovery.cc +++ b/src/crimson/osd/osd_operations/background_recovery.cc @@ -110,11 +110,23 @@ seastar::future PglogBasedRecovery::do_recovery() seastar::future BackfillRecovery::do_recovery() { - if (pg->has_reset_since(epoch_started)) + logger().debug("{}", __func__); + + if (pg->has_reset_since(epoch_started)) { + logger().debug("{}: pg got reset since epoch_started={}", + __func__, epoch_started); return seastar::make_ready_future(false); - // FIXME: blocking future, limits - pg->get_recovery_handler()->dispatch_backfill_event(std::move(evt)); - return seastar::make_ready_future(false); + } + // TODO: limits + return with_blocking_future( + // process_event() of our boost::statechart machine is non-reentrant. + // with the backfill_pipeline we protect it from a second entry from + // the implementation of BackfillListener. + handle.enter(pg->backfill_pipeline.process) + ).then([this] { + pg->get_recovery_handler()->dispatch_backfill_event(std::move(evt)); + return seastar::make_ready_future(false); + }); } } // namespace crimson::osd diff --git a/src/crimson/osd/osd_operations/background_recovery.h b/src/crimson/osd/osd_operations/background_recovery.h index 235038544b9d..ae439b9300bf 100644 --- a/src/crimson/osd/osd_operations/background_recovery.h +++ b/src/crimson/osd/osd_operations/background_recovery.h @@ -74,9 +74,17 @@ public: class BackfillRecovery final : public BackgroundRecovery { boost::intrusive_ptr evt; + OrderedPipelinePhase::Handle handle; seastar::future do_recovery() override; public: + class BackfillRecoveryPipeline { + OrderedPipelinePhase process = { + "BackfillRecovery::PGPipeline::process" + }; + friend class BackfillRecovery; + }; + template BackfillRecovery( Ref pg, diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index 30b025d35d7b..58e17daeaf80 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -657,6 +657,7 @@ private: friend class PGAdvanceMap; friend class PeeringEvent; friend class RepRequest; + friend class BackfillRecovery; friend struct BackfillState::PGFacade; private: seastar::future find_unfound() { @@ -675,6 +676,9 @@ private: const set &get_actingset() const { return peering_state.get_actingset(); } + +private: + BackfillRecovery::BackfillRecoveryPipeline backfill_pipeline; }; std::ostream& operator<<(std::ostream&, const PG& pg);