From: Xuehan Xu Date: Tue, 10 Nov 2020 09:14:44 +0000 (+0800) Subject: crimson/common: deal with seastar::thread in interruptible_future X-Git-Tag: v17.1.0~2698^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F37536%2Fhead;p=ceph.git crimson/common: deal with seastar::thread in interruptible_future Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/common/interruptible_future.h b/src/crimson/common/interruptible_future.h index 65fdb7d42712..0d66ca843c4a 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 63ca81af9ba6..fd9731312d31 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;