From: Kefu Chai Date: Fri, 16 Oct 2020 14:07:50 +0000 (+0800) Subject: crimson/common: schedule action only if the future is not available X-Git-Tag: v16.1.0~829^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1c422d2f2a18b9a9317cc8d548bf7f2a85664cae;p=ceph.git crimson/common: schedule action only if the future is not available otherwise we could call do_until() recursively if we have other tasks which need to prempt the reactor and current future's state is actually always available. Signed-off-by: Kefu Chai --- diff --git a/src/crimson/common/errorator.h b/src/crimson/common/errorator.h index a52a711f9d1b..aef57cb9b375 100644 --- a/src/crimson/common/errorator.h +++ b/src/crimson/common/errorator.h @@ -58,18 +58,19 @@ inline auto do_until(AsyncAction action) { return futurator::type::errorator_type::template make_exception_future2<>( f.get_exception() ); - } - if (!f.available() || seastar::need_preempt()) { + } else if (f.available()) { + if (auto done = f.get0()) { + return futurator::type::errorator_type::template make_ready_future<>(); + } + } else { return std::move(f)._then( - [ action = std::move(action)] (auto &&done) mutable { - if (done) { - return futurator::type::errorator_type::template make_ready_future<>(); - } + [action = std::move(action)] (auto &&done) mutable { + if (done) { + return futurator::type::errorator_type::template make_ready_future<>(); + } return ::crimson::do_until( - std::move(action)); - }); - } else if (bool stop_cond = f.get0()) { - return futurator::type::errorator_type::template make_ready_future<>(); + std::move(action)); + }); } } }