]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd/PG: handle remote backfill recovation while waiting for other targets
authorSage Weil <sage@redhat.com>
Thu, 26 Oct 2017 13:42:34 +0000 (08:42 -0500)
committerSage Weil <sage@redhat.com>
Thu, 26 Oct 2017 13:42:34 +0000 (08:42 -0500)
If we have multiple targets, we may still be waiting on them when we get
a revocation.

Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/PG.cc
src/osd/PG.h

index 7a91811b45ee57dbe48a0516021a8d8e63134564..21377cbe89d0bc3617841703334bcc703d416bd2 100644 (file)
@@ -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<NotBackfilling>();
+}
+
+boost::statechart::result
+PG::RecoveryState::WaitRemoteBackfillReserved::react(const RemoteReservationRevoked &evt)
+{
+  retry();
   return transit<NotBackfilling>();
 }
 
index a03deb2e906b9bd62dd9d79660fed9f6b39b9496..0ddb648cb40e653768e877a8ab6cdd96f1a4be3f 100644 (file)
@@ -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<pg_shard_t>::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 {