);
}
+ template <typename OpT, typename T>
+ seastar::future<>
+ enter(T &stage, typename T::BlockingEvent::template Trigger<OpT>&& t) {
+ return wait_barrier().then([this, &stage, t=std::move(t)] () mutable {
+ auto fut = stage.enter();
+ t.maybe_record_blocking(fut, stage);
+ exit();
+ return std::move(fut).then(
+ [this, t=std::move(t)](auto &&barrier_ref) mutable {
+ barrier = std::move(barrier_ref);
+ return seastar::now();
+ });
+ });
+ }
+
/**
* Completes pending exit barrier without entering a new one.
*/
// dispatch (backend, blocker type)
get_event<EventT>().trigger(*that(), std::forward<Args>(args)...);
}
+
+ template <class BlockingEventT, class F>
+ auto with_blocking_event(F&& f) {
+ return std::forward<F>(f)(typename BlockingEventT::template Trigger<T>{
+ get_event<BlockingEventT>(), *that()
+ });
+ }
};
template <class T>
protected:
using TrackableOperationT<T>::TrackableOperationT;
+ template <class StageT>
+ auto enter_stage(StageT& stage) {
+ return this->template with_blocking_event<typename StageT::BlockingEvent>(
+ [&stage, this] (auto&& trigger) {
+ return handle.enter<T>(stage, std::move(trigger));
+ });
+ }
+
PipelineHandle handle;
};
return seastar::repeat([this, opref=IRef{this}]() mutable {
logger().debug("{}: in repeat", *this);
- return with_blocking_future(handle.enter(cp().await_map))
- .then([this]() {
+ return enter_stage(cp().await_map).then([this]() {
return with_blocking_future(
osd.osdmap_gate.wait_for_map(
m->get_min_epoch()));
Errorator>;
bool is_misdirected(const PG& pg) const;
+
+public:
+ std::tuple<
+ ConnectionPipeline::AwaitMap::BlockingEvent
+ > tracking_events;
};
}