});
}).then([this, soid] {
auto& recovery = recovering.at(soid);
- bool error = recovery.pi->recovery_progress.error;
- if (!error) {
- auto push_info = recovery.pushing.begin();
- object_stat_sum_t stat = {};
- if (push_info != recovery.pushing.end()) {
- stat = push_info->second.stat;
- } else {
- // no push happened, take pull_info's stat
- stat = recovery.pi->stat;
- }
- pg.get_recovery_handler()->on_global_recover(soid, stat, false);
- return seastar::make_ready_future<>();
+ auto push_info = recovery.pushing.begin();
+ object_stat_sum_t stat = {};
+ if (push_info != recovery.pushing.end()) {
+ stat = push_info->second.stat;
} else {
- if (recovery.obc)
- recovery.obc->drop_recovery_read();
- recovering.erase(soid);
- return seastar::make_exception_future<>(
- std::runtime_error(fmt::format("Errors during pushing for {}", soid)));
+ // no push happened, take pull_info's stat
+ assert(recovery.pi);
+ stat = recovery.pi->stat;
}
+ pg.get_recovery_handler()->on_global_recover(soid, stat, false);
+ return seastar::make_ready_future<>();
+ }).handle_exception([this, soid](auto e) {
+ auto& recovery = recovering.at(soid);
+ if (recovery.obc)
+ recovery.obc->drop_recovery_read();
+ recovering.erase(soid);
+ return seastar::make_exception_future<>(
+ std::runtime_error(fmt::format("Errors during pushing for {}", soid)));
});
});
}
return seastar::make_ready_future<bool>(true);
}().handle_exception([recovering_iter, &pi, peer] (auto e) {
pi.recovery_progress.error = true;
- recovering_iter->second.set_pushed(peer);
+ recovering_iter->second.set_push_failed(peer, e);
return seastar::make_ready_future<bool>(true);
});
}