From 8afd4ec647842957a2c13faf2c4272790bccd1ba Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 26 Oct 2017 08:42:34 -0500 Subject: [PATCH] osd/PG: handle remote backfill recovation while waiting for other targets If we have multiple targets, we may still be waiting on them when we get a revocation. Signed-off-by: Sage Weil --- src/osd/PG.cc | 15 +++++++++++++-- src/osd/PG.h | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 7a91811b45ee..21377cbe89d0 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -6542,8 +6542,7 @@ void PG::RecoveryState::WaitRemoteBackfillReserved::exit() pg->osd->recoverystate_perf->tinc(rs_waitremotebackfillreserved_latency, dur); } -boost::statechart::result -PG::RecoveryState::WaitRemoteBackfillReserved::react(const RemoteReservationRejected &evt) +void PG::RecoveryState::WaitRemoteBackfillReserved::retry() { PG *pg = context< RecoveryMachine >().pg; pg->osd->local_reserver.cancel_reservation(pg->info.pgid); @@ -6573,7 +6572,19 @@ PG::RecoveryState::WaitRemoteBackfillReserved::react(const RemoteReservationReje pg->publish_stats_to_osd(); pg->schedule_backfill_retry(pg->cct->_conf->osd_recovery_retry_interval); +} +boost::statechart::result +PG::RecoveryState::WaitRemoteBackfillReserved::react(const RemoteReservationRejected &evt) +{ + retry(); + return transit(); +} + +boost::statechart::result +PG::RecoveryState::WaitRemoteBackfillReserved::react(const RemoteReservationRevoked &evt) +{ + retry(); return transit(); } diff --git a/src/osd/PG.h b/src/osd/PG.h index a03deb2e906b..0ddb648cb40e 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -2201,13 +2201,16 @@ protected: typedef boost::mpl::list< boost::statechart::custom_reaction< RemoteBackfillReserved >, boost::statechart::custom_reaction< RemoteReservationRejected >, + boost::statechart::custom_reaction< RemoteReservationRevoked >, boost::statechart::transition< AllBackfillsReserved, Backfilling > > reactions; set::const_iterator backfill_osd_it; explicit WaitRemoteBackfillReserved(my_context ctx); + void retry(); void exit(); boost::statechart::result react(const RemoteBackfillReserved& evt); boost::statechart::result react(const RemoteReservationRejected& evt); + boost::statechart::result react(const RemoteReservationRevoked& evt); }; struct WaitLocalBackfillReserved : boost::statechart::state< WaitLocalBackfillReserved, Active >, NamedState { -- 2.47.3