mirror of
https://github.com/ceph/ceph
synced 2024-12-28 22:43:29 +00:00
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:
parent
f5adeeb621
commit
1c422d2f2a
@ -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));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user