@@ -24,29 +24,33 @@ namespace {
2424
2525using std::map;
2626using std::set;
27+ using PglogBasedRecovery = crimson::osd::PglogBasedRecovery;
2728
2829void PGRecovery::start_pglogbased_recovery ()
2930{
30- using PglogBasedRecovery = crimson::osd::PglogBasedRecovery;
31- (void ) pg->get_shard_services ().start_operation <PglogBasedRecovery>(
31+ auto [op, fut] = pg->get_shard_services ().start_operation <PglogBasedRecovery>(
3232 static_cast <crimson::osd::PG*>(pg),
3333 pg->get_shard_services (),
3434 pg->get_osdmap_epoch (),
3535 float (0.001 ));
36+ pg->set_pglog_based_recovery_op (op.get ());
3637}
3738
3839PGRecovery::interruptible_future<bool >
3940PGRecovery::start_recovery_ops (
4041 RecoveryBackend::RecoveryBlockingEvent::TriggerI& trigger,
42+ PglogBasedRecovery &recover_op,
4143 size_t max_to_start)
4244{
4345 assert (pg->is_primary ());
4446 assert (pg->is_peered ());
4547
46- if (!pg->is_recovering () && !pg->is_backfilling ()) {
47- logger ().debug (" recovery raced and were queued twice, ignoring!" );
48+ if (pg->has_reset_since (recover_op.get_epoch_started ()) ||
49+ recover_op.is_cancelled ()) {
50+ logger ().debug (" recovery {} cancelled." , recover_op);
4851 return seastar::make_ready_future<bool >(false );
4952 }
53+ ceph_assert (pg->is_recovering ());
5054
5155 // in ceph-osd the do_recovery() path handles both the pg log-based
5256 // recovery and the backfill, albeit they are separated at the layer
@@ -68,12 +72,15 @@ PGRecovery::start_recovery_ops(
6872 return interruptor::parallel_for_each (started,
6973 [] (auto && ifut) {
7074 return std::move (ifut);
71- }).then_interruptible ([this ] {
75+ }).then_interruptible ([this , &recover_op ] {
7276 // TODO: maybe we should implement a recovery race interruptor in the future
73- if (!pg->is_recovering () && !pg->is_backfilling ()) {
74- logger ().debug (" recovery raced and were queued twice, ignoring!" );
77+ if (pg->has_reset_since (recover_op.get_epoch_started ()) ||
78+ recover_op.is_cancelled ()) {
79+ logger ().debug (" recovery {} cancelled." , recover_op);
7580 return seastar::make_ready_future<bool >(false );
7681 }
82+ ceph_assert (pg->is_recovering ());
83+ ceph_assert (!pg->is_backfilling ());
7784
7885 bool done = !pg->get_peering_state ().needs_recovery ();
7986 if (done) {
@@ -101,6 +108,7 @@ PGRecovery::start_recovery_ops(
101108 pg->get_osdmap_epoch (),
102109 PeeringState::RequestBackfill{});
103110 }
111+ pg->reset_pglog_based_recovery_op ();
104112 }
105113 return seastar::make_ready_future<bool >(!done);
106114 });
0 commit comments