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 <kchai@redhat.com>
This commit is contained in:
Kefu Chai 2020-10-16 22:07:50 +08:00
parent f5adeeb621
commit 1c422d2f2a

View File

@ -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));
});
}
}
}