From: Radosław Zarzyński Date: Wed, 13 Apr 2022 07:17:46 +0000 (+0200) Subject: crimson/osd: make PhaseOperationT able to deal with interruptors X-Git-Tag: v18.0.0~947^2~28 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=89493f3da1a5f9cfad448fe98a77932dc0862a2f;p=ceph.git crimson/osd: make PhaseOperationT able to deal with interruptors Signed-off-by: Radosław Zarzyński --- 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),