From 1c422d2f2a18b9a9317cc8d548bf7f2a85664cae Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Fri, 16 Oct 2020 22:07:50 +0800 Subject: [PATCH] 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 --- src/crimson/common/errorator.h | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/crimson/common/errorator.h b/src/crimson/common/errorator.h index a52a711f9d1..aef57cb9b37 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)); + }); } } }