const hobject_t& soid,
eversion_t need)
{
- return pg->get_recovery_backend()->add_recovering(soid).wait_track_blocking(
- trigger,
- pg->get_recovery_backend()->recover_object(soid, need)
- .handle_exception_interruptible(
- [=, this, soid = std::move(soid)] (auto e) {
- on_failed_recover({ pg->get_pg_whoami() }, soid, need);
- return seastar::make_ready_future<>();
- })
- );
+ logger().info("{} {} v {}", __func__, soid, need);
+ auto [recovering, added] = pg->get_recovery_backend()->add_recovering(soid);
+ if (added) {
+ logger().info("{} {} v {}, new recovery", __func__, soid, need);
+ return recovering.wait_track_blocking(
+ trigger,
+ pg->get_recovery_backend()->recover_object(soid, need)
+ .handle_exception_interruptible(
+ [=, this, soid = std::move(soid)] (auto e) {
+ on_failed_recover({ pg->get_pg_whoami() }, soid, need);
+ return seastar::make_ready_future<>();
+ })
+ );
+ } else {
+ return recovering.wait_for_recovered();
+ }
}
-void PGRecovery::on_local_recover(
+RecoveryBackend::interruptible_future<>
+PGRecovery::on_local_recover(
const hobject_t& soid,
const ObjectRecoveryInfo& recovery_info,
const bool is_delete,