PGRecovery::start_recovery_ops() should wait for all inflight recovery ops, whether they are
started by BackgroundRecovery or not, otherwise there may be circumstances in which BackgroundRecovery
keep recursively invoking its do_recovery when start_recovery_ops returns recovery done while there are
still missing objects.
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
if (pg->get_recovery_backend()->is_recovering(soid)) {
logger().debug("{}: already recovering object {}", __func__, soid);
+ auto& recovery_waiter = pg->get_recovery_backend()->get_recovering(soid);
+ out->push_back(recovery_waiter.wait_for_recovered_blocking());
+ started++;
continue;
}
seastar::future<> wait_for_recovered() {
return recovered.get_shared_future();
}
+ crimson::osd::blocking_future<>
+ wait_for_recovered_blocking() {
+ return make_blocking_future(
+ recovered.get_shared_future());
+ }
seastar::future<> wait_for_pull() {
return pulled.get_shared_future();
}