From 89493f3da1a5f9cfad448fe98a77932dc0862a2f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rados=C5=82aw=20Zarzy=C5=84ski?= Date: Wed, 13 Apr 2022 09:17:46 +0200 Subject: [PATCH] crimson/osd: make PhaseOperationT able to deal with interruptors MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Radosław Zarzyński --- src/crimson/osd/osd_operation.h | 17 ++++++++++++----- .../osd/osd_operations/client_request.cc | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/crimson/osd/osd_operation.h b/src/crimson/osd/osd_operation.h index 4b36852017a..66f2ef9eb77 100644 --- a/src/crimson/osd/osd_operation.h +++ b/src/crimson/osd/osd_operation.h @@ -158,11 +158,17 @@ protected: get_event().trigger(*that(), std::forward(args)...); } - template + template auto with_blocking_event(F&& f) { - return std::forward(f)(typename BlockingEventT::template Trigger{ + auto ret = std::forward(f)(typename BlockingEventT::template Trigger{ get_event(), *that() }); + if constexpr (std::is_same_v) { + return ret; + } else { + using ret_t = decltype(ret); + return typename InterruptorT::template futurize_t{std::move(ret)}; + } } }; @@ -172,11 +178,12 @@ class PhasedOperationT : public TrackableOperationT { protected: using TrackableOperationT::TrackableOperationT; - template + template auto enter_stage(StageT& stage) { - return this->template with_blocking_event( + return this->template with_blocking_event( [&stage, this] (auto&& trigger) { - return handle.enter(stage, std::move(trigger)); + return handle.enter(stage, std::move(trigger)); }); } diff --git a/src/crimson/osd/osd_operations/client_request.cc b/src/crimson/osd/osd_operations/client_request.cc index 649293460f3..7a7e6286f51 100644 --- a/src/crimson/osd/osd_operations/client_request.cc +++ b/src/crimson/osd/osd_operations/client_request.cc @@ -85,7 +85,7 @@ seastar::future<> ClientRequest::start() track_event(); return seastar::repeat([this, opref=IRef{this}]() mutable { logger().debug("{}: in repeat", *this); - return enter_stage(cp().await_map).then([this]() { + return enter_stage<>(cp().await_map).then([this]() { return with_blocking_event( [this](auto&& trigger) { return osd.osdmap_gate.wait_for_map(std::move(trigger), -- 2.39.5