From 550b37c51fbdd146dc4e6cfb1873d21b76a01c2c Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Tue, 10 Nov 2020 17:14:44 +0800 Subject: [PATCH] crimson/common: deal with seastar::thread in interruptible_future Signed-off-by: Xuehan Xu --- src/crimson/common/interruptible_future.h | 39 ++++++++++++++++++++++- src/crimson/osd/ops_executer.cc | 4 +-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/crimson/common/interruptible_future.h b/src/crimson/common/interruptible_future.h index 65fdb7d4271..0d66ca843c4 100644 --- a/src/crimson/common/interruptible_future.h +++ b/src/crimson/common/interruptible_future.h @@ -6,6 +6,7 @@ #include #include #include +#include #include "crimson/common/errorator.h" @@ -254,7 +255,15 @@ public: [[gnu::always_inline]] value_type&& get() { - return std::move(core_type::get()); + if (core_type::available()) { + return core_type::get(); + } else { + // destined to wait! + auto interruption_condition = interrupt_cond; + auto&& value = core_type::get(); + interrupt_cond = interruption_condition; + return std::move(value); + } } using core_type::available; @@ -1173,6 +1182,34 @@ public: return ::seastar::internal::when_all_succeed_impl( futurize_invoke_if_func(std::forward(fut_or_funcs))...); } + + template >> + static inline Result async(Func&& func) { + return seastar::async([func=std::forward(func), + interrupt_condition=interrupt_cond]() mutable { + return non_futurized_call_with_interruption( + interrupt_condition, std::forward(func)); + }); + } + + static void yield() { + assert(interrupt_cond); + auto interruption_condition = interrupt_cond; + interrupt_cond.release(); + seastar::thread::yield(); + interrupt_cond = interruption_condition; + } + + static void maybe_yield() { + assert(interrupt_cond); + if (seastar::thread::should_yield()) { + auto interruption_condition = interrupt_cond; + interrupt_cond.release(); + seastar::thread::yield(); + interrupt_cond = interruption_condition; + } + } private: // return true if an new interrupt condition is created and false otherwise template diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 63ca81af9ba..fd9731312d3 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -79,14 +79,14 @@ OpsExecuter::call_ierrorator::future<> OpsExecuter::do_op_call(OSDOp& osd_op) cname, mname, num_read, num_write); const auto prev_rd = num_read; const auto prev_wr = num_write; - return seastar::async( + return interruptor::async( [this, method, indata=std::move(indata)]() mutable { ceph::bufferlist outdata; auto cls_context = reinterpret_cast(this); const auto ret = method->exec(cls_context, indata, outdata); return std::make_pair(ret, std::move(outdata)); } - ).then( + ).then_interruptible( [this, prev_rd, prev_wr, &osd_op, flags] (auto outcome) -> call_errorator::future<> { auto& [ret, outdata] = outcome; -- 2.39.5