});
}).then([this, soid] {
auto& recovery = recovering.at(soid);
- bool error = recovery.pi.recovery_progress.error;
+ bool error = recovery.pi->recovery_progress.error;
if (!error) {
auto push_info = recovery.pushing.begin();
object_stat_sum_t stat = {};
stat = push_info->second.stat;
} else {
// no push happened, take pull_info's stat
- stat = recovery.pi.stat;
+ stat = recovery.pi->stat;
}
pg.get_recovery_handler()->on_global_recover(soid, stat, false);
return seastar::make_ready_future<>();
}
PullOp po;
auto& recovery_waiter = recovering.at(soid);
- auto& pi = recovery_waiter.pi;
+ recovery_waiter.pi = std::make_optional<RecoveryBackend::PullInfo>();
+ auto& pi = *recovery_waiter.pi;
prepare_pull(po, pi, soid, need);
auto msg = make_message<MOSDPGPull>();
msg->from = pg.get_pg_whoami();
return seastar::make_ready_future<>();
}).safe_then([this, soid, epoch_to_freeze, need] {
auto& recovery_waiter = recovering[soid];
- auto& pi = recovery_waiter.pi;
+ auto& pi = *recovery_waiter.pi;
pi.recovery_info.soid = soid;
pi.recovery_info.version = need;
return on_local_recover_persist(soid, pi.recovery_info,
}, PGBackend::load_metadata_ertr::all_same_way(
[this, soid, epoch_to_freeze, need] (auto e) {
auto& recovery_waiter = recovering[soid];
- auto& pi = recovery_waiter.pi;
+ auto& pi = *recovery_waiter.pi;
pi.recovery_info.soid = soid;
pi.recovery_info.version = need;
return on_local_recover_persist(soid, pi.recovery_info,
const hobject_t &hoid = pop.soid;
auto& recovery_waiter = recovering[hoid];
- auto& pi = recovery_waiter.pi;
+ auto& pi = *recovery_waiter.pi;
if (pi.recovery_info.size == (uint64_t(-1))) {
pi.recovery_info.size = pop.recovery_info.size;
pi.recovery_info.copy_subset.intersection_of(
if (complete) {
pi.stat.num_objects_recovered++;
- pg.get_recovery_handler()->on_local_recover(pop.soid, recovering[pop.soid].pi.recovery_info,
+ pg.get_recovery_handler()->on_local_recover(pop.soid, recovering[pop.soid].pi->recovery_info,
false, *t);
return seastar::make_ready_future<bool>(true);
} else {
if (pop.version == eversion_t()) {
// replica doesn't have it!
pg.get_recovery_handler()->on_failed_recover({ m->from }, pop.soid,
- get_recovering(pop.soid).pi.recovery_info.version);
+ get_recovering(pop.soid).pi->recovery_info.version);
return seastar::make_exception_future<>(
std::runtime_error(fmt::format(
"Error on pushing side {} when pulling obj {}",