@@ -110,7 +110,7 @@ PGRecovery::start_recovery_ops(
110110 }
111111 pg->reset_pglog_based_recovery_op ();
112112 }
113- return seastar::make_ready_future<bool >(! done);
113+ return seastar::make_ready_future<bool >(done);
114114 });
115115}
116116
@@ -196,10 +196,10 @@ size_t PGRecovery::start_primary_recovery_ops(
196196 auto it = missing.get_items ().find (head);
197197 assert (it != missing.get_items ().end ());
198198 auto head_need = it->second .need ;
199- out->emplace_back (recover_missing (trigger, head, head_need));
199+ out->emplace_back (recover_missing (trigger, head, head_need, true ));
200200 ++skipped;
201201 } else {
202- out->emplace_back (recover_missing (trigger, soid, item.need ));
202+ out->emplace_back (recover_missing (trigger, soid, item.need , true ));
203203 }
204204 ++started;
205205 }
@@ -306,7 +306,9 @@ size_t PGRecovery::start_replica_recovery_ops(
306306PGRecovery::interruptible_future<>
307307PGRecovery::recover_missing (
308308 RecoveryBackend::RecoveryBlockingEvent::TriggerI& trigger,
309- const hobject_t &soid, eversion_t need)
309+ const hobject_t &soid,
310+ eversion_t need,
311+ bool with_throttle)
310312{
311313 logger ().info (" {} {} v {}" , __func__, soid, need);
312314 auto [recovering, added] = pg->get_recovery_backend ()->add_recovering (soid);
@@ -319,7 +321,9 @@ PGRecovery::recover_missing(
319321 } else {
320322 return recovering.wait_track_blocking (
321323 trigger,
322- pg->get_recovery_backend ()->recover_object (soid, need)
324+ with_throttle
325+ ? recover_object_with_throttle (soid, need)
326+ : recover_object (soid, need)
323327 .handle_exception_interruptible (
324328 [=, this , soid = std::move (soid)] (auto e) {
325329 on_failed_recover ({ pg->get_pg_whoami () }, soid, need);
@@ -367,7 +371,7 @@ RecoveryBackend::interruptible_future<> PGRecovery::prep_object_replica_pushes(
367371 logger ().info (" {} {} v {}, new recovery" , __func__, soid, need);
368372 return recovering.wait_track_blocking (
369373 trigger,
370- pg-> get_recovery_backend ()-> recover_object (soid, need)
374+ recover_object_with_throttle (soid, need)
371375 .handle_exception_interruptible (
372376 [=, this , soid = std::move (soid)] (auto e) {
373377 on_failed_recover ({ pg->get_pg_whoami () }, soid, need);
@@ -516,6 +520,25 @@ void PGRecovery::request_primary_scan(
516520 });
517521}
518522
523+ PGRecovery::interruptible_future<>
524+ PGRecovery::recover_object_with_throttle (
525+ const hobject_t &soid,
526+ eversion_t need)
527+ {
528+ crimson::osd::scheduler::params_t params =
529+ {1 , 0 , crimson::osd::scheduler::scheduler_class_t ::background_best_effort};
530+ auto &ss = pg->get_shard_services ();
531+ logger ().debug (" {} {}" , soid, need);
532+ return ss.with_throttle (
533+ std::move (params),
534+ [this , soid, need] {
535+ logger ().debug (" got throttle: {} {}" , soid, need);
536+ auto backend = pg->get_recovery_backend ();
537+ assert (backend);
538+ return backend->recover_object (soid, need);
539+ });
540+ }
541+
519542void PGRecovery::enqueue_push (
520543 const hobject_t & obj,
521544 const eversion_t & v,
@@ -527,7 +550,7 @@ void PGRecovery::enqueue_push(
527550 if (!added)
528551 return ;
529552 peering_state.prepare_backfill_for_missing (obj, v, peers);
530- std::ignore = pg-> get_recovery_backend ()-> recover_object (obj, v).\
553+ std::ignore = recover_object_with_throttle (obj, v).\
531554 handle_exception_interruptible ([] (auto ) {
532555 ceph_abort_msg (" got exception on backfill's push" );
533556 return seastar::make_ready_future<>();
@@ -605,8 +628,8 @@ void PGRecovery::update_peers_last_backfill(
605628
606629bool PGRecovery::budget_available () const
607630{
608- // TODO: the limits!
609- return true ;
631+ auto &ss = pg-> get_shard_services ();
632+ return ss. throttle_available () ;
610633}
611634
612635void PGRecovery::on_pg_clean ()
0 commit comments