From: Sage Weil Date: Thu, 26 Oct 2017 13:42:34 +0000 (-0500) Subject: osd/PG: handle remote backfill recovation while waiting for other targets X-Git-Tag: v13.0.1~401^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8afd4ec647842957a2c13faf2c4272790bccd1ba;p=ceph.git 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 --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 7a91811b45e..21377cbe89d 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 a03deb2e906..0ddb648cb40 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 {