From 4cbd62ecdc42aa91045f7f5c7ce5dab0cb59c16e 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 (cherry picked from commit 597dfd11728b55ad181316ac10be7155e37a6ba9) --- 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 426da24400891..8bb38c2f83f60 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -9404,14 +9404,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 c5899b7716f57..80554a6c43ddc 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -3878,21 +3878,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())); @@ -6400,7 +6400,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); @@ -6426,7 +6426,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(); } @@ -6456,7 +6456,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(); } @@ -6550,7 +6550,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(); } @@ -6835,7 +6835,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(); } @@ -6954,7 +6954,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 7f162efc9f5c3..d73b48daf0538 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1410,8 +1410,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 -- @@ -1563,6 +1563,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) @@ -1573,13 +1588,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