From 597dfd11728b55ad181316ac10be7155e37a6ba9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 19 Sep 2017 14:53:31 -0500 Subject: [PATCH] osd/PG: specify delay in Cancel{Recovery,Backfill} For now it is always the retry interval, but later perhaps not! Signed-off-by: Sage Weil --- src/osd/OSD.cc | 4 ++-- src/osd/PG.cc | 20 ++++++++++---------- src/osd/PG.h | 21 +++++++++++++++++---- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 80676ce0896d4..8029c2990ad35 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -9155,14 +9155,14 @@ void OSD::do_recovery( auto evt = PG::CephPeeringEvtRef(new PG::CephPeeringEvt( queued, queued, - PG::CancelBackfill())); + PG::CancelBackfill(cct->_conf->osd_recovery_retry_interval))); pg->queue_peering_event(evt); action = "in backfill"; } else if (pg->state_test(PG_STATE_RECOVERING)) { auto evt = PG::CephPeeringEvtRef(new PG::CephPeeringEvt( queued, queued, - PG::CancelRecovery())); + PG::CancelRecovery(cct->_conf->osd_recovery_retry_interval))); pg->queue_peering_event(evt); action = "in recovery"; } else { diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 635dac07213c4..20d76cdc98666 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -3728,21 +3728,21 @@ void PG::reject_reservation() get_osdmap()->get_epoch()); } -void PG::schedule_backfill_full_retry() +void PG::schedule_backfill_retry(float delay) { Mutex::Locker lock(osd->recovery_request_lock); osd->recovery_request_timer.add_event_after( - cct->_conf->osd_backfill_retry_interval, + delay, new QueuePeeringEvt( this, get_osdmap()->get_epoch(), RequestBackfill())); } -void PG::schedule_recovery_full_retry() +void PG::schedule_recovery_retry(float delay) { Mutex::Locker lock(osd->recovery_request_lock); osd->recovery_request_timer.add_event_after( - cct->_conf->osd_recovery_retry_interval, + delay, new QueuePeeringEvt( this, get_osdmap()->get_epoch(), DoRecovery())); @@ -6195,7 +6195,7 @@ PG::RecoveryState::Backfilling::Backfilling(my_context ctx) } boost::statechart::result -PG::RecoveryState::Backfilling::react(const CancelBackfill &) +PG::RecoveryState::Backfilling::react(const CancelBackfill &c) { PG *pg = context< RecoveryMachine >().pg; pg->osd->local_reserver.cancel_reservation(pg->info.pgid); @@ -6221,7 +6221,7 @@ PG::RecoveryState::Backfilling::react(const CancelBackfill &) pg->waiting_on_backfill.clear(); - pg->schedule_backfill_full_retry(); + pg->schedule_backfill_retry(c.delay); return transit(); } @@ -6251,7 +6251,7 @@ PG::RecoveryState::Backfilling::react(const RemoteReservationRejected &) pg->waiting_on_backfill.clear(); pg->finish_recovery_op(hobject_t::get_max()); - pg->schedule_backfill_full_retry(); + pg->schedule_backfill_retry(pg->cct->_conf->osd_recovery_retry_interval); return transit(); } @@ -6345,7 +6345,7 @@ PG::RecoveryState::WaitRemoteBackfillReserved::react(const RemoteReservationReje pg->state_set(PG_STATE_BACKFILL_TOOFULL); pg->publish_stats_to_osd(); - pg->schedule_backfill_full_retry(); + pg->schedule_backfill_retry(pg->cct->_conf->osd_recovery_retry_interval); return transit(); } @@ -6630,7 +6630,7 @@ PG::RecoveryState::WaitLocalRecoveryReserved::react(const RecoveryTooFull &evt) { PG *pg = context< RecoveryMachine >().pg; pg->state_set(PG_STATE_RECOVERY_TOOFULL); - pg->schedule_recovery_full_retry(); + pg->schedule_recovery_retry(pg->cct->_conf->osd_recovery_retry_interval); return transit(); } @@ -6749,7 +6749,7 @@ PG::RecoveryState::Recovering::react(const CancelRecovery &evt) pg->state_set(PG_STATE_RECOVERY_WAIT); pg->osd->local_reserver.cancel_reservation(pg->info.pgid); release_reservations(true); - pg->schedule_recovery_full_retry(); + pg->schedule_recovery_retry(evt.delay); return transit(); } diff --git a/src/osd/PG.h b/src/osd/PG.h index 05a74afdb9c4f..2b9c42e6abbb6 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1405,8 +1405,8 @@ public: void handle_scrub_reserve_release(OpRequestRef op); void reject_reservation(); - void schedule_backfill_full_retry(); - void schedule_recovery_full_retry(); + void schedule_backfill_retry(float retry); + void schedule_recovery_retry(float retry); // -- recovery state -- @@ -1558,6 +1558,21 @@ public: *out << #T; \ } \ }; + struct CancelBackfill : boost::statechart::event { + float delay; + explicit CancelBackfill(float delay) : delay(delay) {} + void print(std::ostream *out) const { + *out << "CancelBackfill: delay " << delay; + } + }; + struct CancelRecovery : boost::statechart::event { + float delay; + explicit CancelRecovery(float delay) : delay(delay) {} + void print(std::ostream *out) const { + *out << "CancelRecovery: delay " << delay; + } + }; + TrivialEvent(Initialize) TrivialEvent(Load) TrivialEvent(GotInfo) @@ -1568,13 +1583,11 @@ public: TrivialEvent(LocalBackfillReserved) TrivialEvent(RemoteBackfillReserved) TrivialEvent(RemoteReservationRejected) - TrivialEvent(CancelBackfill) TrivialEvent(RequestBackfill) TrivialEvent(RequestRecovery) TrivialEvent(RecoveryDone) TrivialEvent(BackfillTooFull) TrivialEvent(RecoveryTooFull) - TrivialEvent(CancelRecovery) TrivialEvent(MakePrimary) TrivialEvent(MakeStray) -- 2.39.5