From ee759133fac6e8ae419a714f58c625f587355fdf Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rados=C5=82aw=20Zarzy=C5=84ski?= Date: Fri, 22 Apr 2022 16:48:54 +0200 Subject: [PATCH] crimson/osd: bring AggregateBlockingEvent. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Radosław Zarzyński --- src/crimson/common/operation.h | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/crimson/common/operation.h b/src/crimson/common/operation.h index a284037d4a36f..6dc32007a657b 100644 --- a/src/crimson/common/operation.h +++ b/src/crimson/common/operation.h @@ -339,6 +339,44 @@ private: } }; +template +struct AggregateBlockingEvent { + struct TriggerI { + template + decltype(auto) maybe_record_blocking(FutureT&& fut, + const typename T::Blocker& blocker) { + // AggregateBlockingEvent is supposed to be used on relatively cold + // paths (recovery), so we don't need to worry about the dynamic + // polymothps / dynamic memory's overhead. + return create_part_trigger()->maybe_record_blocking( + std::move(fut), blocker); + } + + virtual std::unique_ptr create_part_trigger() = 0; + virtual ~TriggerI() = default; + }; + + template + struct Trigger : TriggerI { + Trigger(AggregateBlockingEvent& event, const OpT& op) + : event(event), op(op) {} + + std::unique_ptr create_part_trigger() override { + return std::make_unique>( + event.events.emplace_back(), op); + } + + private: + AggregateBlockingEvent& event; + const OpT& op; + }; + +private: + std::vector events; + template + friend class Trigger; +}; + class AggregateBlocker : public BlockerT { std::vector parent_blockers; public: -- 2.39.5