From b224749643a13bc05bff819c86ee31f84f8db40a Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Wed, 16 Nov 2022 15:19:41 +0000 Subject: [PATCH] crimson/osd: implement the basics of SnapTrimEvent Signed-off-by: Radoslaw Zarzynski --- .../osd/osd_operation_external_tracking.h | 1 + .../osd/osd_operations/common/pg_pipeline.h | 1 + .../osd/osd_operations/snaptrim_event.cc | 61 ++++++++++++++++++- .../osd/osd_operations/snaptrim_event.h | 20 +++++- src/crimson/osd/pg.h | 1 + 5 files changed, 81 insertions(+), 3 deletions(-) diff --git a/src/crimson/osd/osd_operation_external_tracking.h b/src/crimson/osd/osd_operation_external_tracking.h index 19b115b8563e4..2e0cbd01c92a2 100644 --- a/src/crimson/osd/osd_operation_external_tracking.h +++ b/src/crimson/osd/osd_operation_external_tracking.h @@ -11,6 +11,7 @@ #include "crimson/osd/osd_operations/pg_advance_map.h" #include "crimson/osd/osd_operations/recovery_subrequest.h" #include "crimson/osd/osd_operations/replicated_request.h" +#include "crimson/osd/osd_operations/snaptrim_event.h" #include "crimson/osd/pg_activation_blocker.h" #include "crimson/osd/pg_map.h" diff --git a/src/crimson/osd/osd_operations/common/pg_pipeline.h b/src/crimson/osd/osd_operations/common/pg_pipeline.h index 20417d0277476..a5c0c9fbcb3d3 100644 --- a/src/crimson/osd/osd_operations/common/pg_pipeline.h +++ b/src/crimson/osd/osd_operations/common/pg_pipeline.h @@ -11,6 +11,7 @@ namespace crimson::osd { class CommonPGPipeline { protected: friend class InternalClientRequest; + friend class SnapTrimEvent; struct WaitForActive : OrderedExclusivePhaseT { static constexpr auto type_name = "CommonPGPipeline:::wait_for_active"; diff --git a/src/crimson/osd/osd_operations/snaptrim_event.cc b/src/crimson/osd/osd_operations/snaptrim_event.cc index d3fd67e45aea0..f7f489bc5483c 100644 --- a/src/crimson/osd/osd_operations/snaptrim_event.cc +++ b/src/crimson/osd/osd_operations/snaptrim_event.cc @@ -10,6 +10,15 @@ namespace { } } +namespace crimson { + template <> + struct EventBackendRegistry { + static std::tuple<> get_backends() { + return {}; + } + }; +} + namespace crimson::osd { void SnapTrimEvent::print(std::ostream &lhs) const @@ -29,8 +38,56 @@ void SnapTrimEvent::dump_detail(Formatter *f) const seastar::future<> SnapTrimEvent::start() { - logger().debug("{}", __func__); - return seastar::now(); + logger().debug("{}: {}", *this, __func__); + return with_pg( + pg->get_shard_services(), pg + ).finally([ref=IRef{this}, this] { + logger().debug("{}: complete", *ref); + return handle.complete(); + }); +} + +CommonPGPipeline& SnapTrimEvent::pp() +{ + return pg->request_pg_pipeline; +} + +seastar::future<> SnapTrimEvent::with_pg( + ShardServices &shard_services, Ref _pg) +{ + return interruptor::with_interruption([&shard_services, this] { + return enter_stage( + pp().wait_for_active + ).then_interruptible([this] { + return with_blocking_event([this] (auto&& trigger) { + return pg->wait_for_active_blocker.wait(std::move(trigger)); + }); + }).then_interruptible([this] { + return enter_stage( + pp().recover_missing); + }).then_interruptible([] { + //return do_recover_missing(pg, get_target_oid()); + return seastar::now(); + }).then_interruptible([this] { + return enter_stage( + pp().get_obc); + }).then_interruptible([this] { + return enter_stage( + pp().process); + }).then_interruptible([&shard_services, this] { + std::vector to_trim; + assert(!to_trim.empty()); + for (const auto& object : to_trim) { + logger().debug("{}: trimming {}", object); + // TODO: start subop and add to subop blcoker + } + return seastar::now(); + }); + }, [this](std::exception_ptr eptr) { + // TODO: better debug output + logger().debug("{}: interrupted {}", *this, eptr); + }, pg); } } // namespace crimson::osd diff --git a/src/crimson/osd/osd_operations/snaptrim_event.h b/src/crimson/osd/osd_operations/snaptrim_event.h index bcb20e48ddd84..f8e32b0baefac 100644 --- a/src/crimson/osd/osd_operations/snaptrim_event.h +++ b/src/crimson/osd/osd_operations/snaptrim_event.h @@ -8,7 +8,9 @@ #include "crimson/osd/osdmap_gate.h" #include "crimson/osd/osd_operation.h" -#include "crimson/osd/osd_operations/background_recovery.h" +#include "crimson/osd/osd_operations/common/pg_pipeline.h" +#include "crimson/osd/pg.h" +#include "crimson/osd/pg_activation_blocker.h" #include "osd/osd_types.h" #include "osd/PGPeeringEvent.h" #include "osd/PeeringState.h" @@ -38,8 +40,24 @@ public: ShardServices &shard_services, Ref pg); private: + CommonPGPipeline& pp(); + + PipelineHandle handle; Ref pg; const snapid_t snapid; + +public: + PipelineHandle& get_handle() { return handle; } + + std::tuple< + StartEvent, + CommonPGPipeline::WaitForActive::BlockingEvent, + PGActivationBlocker::BlockingEvent, + CommonPGPipeline::RecoverMissing::BlockingEvent, + CommonPGPipeline::GetOBC::BlockingEvent, + CommonPGPipeline::Process::BlockingEvent, + CompletionEvent + > tracking_events; }; } // namespace crimson::osd diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index dd013e8db74a4..f8be8e1cb5ed2 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -720,6 +720,7 @@ private: friend struct PGFacade; friend class InternalClientRequest; friend class WatchTimeoutRequest; + friend class SnapTrimEvent; private: seastar::future find_unfound() { return seastar::make_ready_future(true); -- 2.39.5