@@ -113,28 +113,33 @@ ReplicatedRecoveryBackend::maybe_pull_missing_obj(
113113 // object is not missing, don't pull
114114 return seastar::make_ready_future<>();
115115 }
116- return pg.obc_loader .with_obc <RWState::RWREAD>(soid.get_head (),
117- [this , soid, need](auto head, auto ) {
118- PullOp pull_op;
119- auto & recovery_waiter = get_recovering (soid);
120- recovery_waiter.pull_info =
121- std::make_optional<RecoveryBackend::pull_info_t >();
122- auto & pull_info = *recovery_waiter.pull_info ;
123- prepare_pull (head, pull_op, pull_info, soid, need);
124- auto msg = crimson::make_message<MOSDPGPull>();
125- msg->from = pg.get_pg_whoami ();
126- msg->set_priority (pg.get_recovery_op_priority ());
127- msg->pgid = pg.get_pgid ();
128- msg->map_epoch = pg.get_osdmap_epoch ();
129- msg->min_epoch = pg.get_last_peering_reset ();
130- msg->set_pulls ({std::move (pull_op)});
131- return shard_services.send_to_osd (
132- pull_info.from .osd ,
133- std::move (msg),
134- pg.get_osdmap_epoch ());
135- }).si_then ([this , soid] {
136- auto & recovery_waiter = get_recovering (soid);
137- return recovery_waiter.wait_for_pull ();
116+ return interruptor::repeat_eagain ([this , soid, need] {
117+ using prepare_pull_iertr =
118+ crimson::osd::ObjectContextLoader::load_obc_iertr::extend<
119+ crimson::ct_error::eagain>;
120+ return pg.obc_loader .with_obc <RWState::RWREAD>(soid.get_head (),
121+ [this , soid, need](auto head, auto ) {
122+ PullOp pull_op;
123+ auto & recovery_waiter = get_recovering (soid);
124+ recovery_waiter.pull_info =
125+ std::make_optional<RecoveryBackend::pull_info_t >();
126+ auto & pull_info = *recovery_waiter.pull_info ;
127+ prepare_pull (head, pull_op, pull_info, soid, need);
128+ auto msg = crimson::make_message<MOSDPGPull>();
129+ msg->from = pg.get_pg_whoami ();
130+ msg->set_priority (pg.get_recovery_op_priority ());
131+ msg->pgid = pg.get_pgid ();
132+ msg->map_epoch = pg.get_osdmap_epoch ();
133+ msg->min_epoch = pg.get_last_peering_reset ();
134+ msg->set_pulls ({std::move (pull_op)});
135+ return shard_services.send_to_osd (
136+ pull_info.from .osd ,
137+ std::move (msg),
138+ pg.get_osdmap_epoch ());
139+ }).si_then ([this , soid]() -> prepare_pull_iertr::future<> {
140+ auto & recovery_waiter = get_recovering (soid);
141+ return recovery_waiter.wait_for_pull ();
142+ });
138143 }).handle_error_interruptible (
139144 crimson::ct_error::assert_all (" unexpected error" )
140145 );
0 commit comments