]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PG: respect primary's priority for remote recovery reservation
authorSage Weil <sage@redhat.com>
Sun, 22 Oct 2017 19:09:53 +0000 (14:09 -0500)
committerSage Weil <sage@redhat.com>
Sun, 22 Oct 2017 19:09:53 +0000 (14:09 -0500)
This now mirrors the backfill approach (e.g., RequestBackfillPrio).

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

index 124e7f1e7dcde3d338fe6b260d9ddb093f050b91..bf4421e6d8b9961a04185f084b7d532b75b7d707 100644 (file)
@@ -8596,7 +8596,7 @@ void OSD::handle_pg_recovery_reserve(OpRequestRef op)
       new PG::CephPeeringEvt(
        m->query_epoch,
        m->query_epoch,
-       PG::RequestRecovery()));
+       PG::RequestRecoveryPrio(m->priority)));
   } else if (m->type == MRecoveryReserve::GRANT) {
     evt = PG::CephPeeringEvtRef(
       new PG::CephPeeringEvt(
index 90959d67ba0b17d5796731fd0a7e1ebc0e049f07..fb7b5142dcadf426e7df231c985596619f0fe58b 100644 (file)
@@ -6623,14 +6623,6 @@ PG::RecoveryState::RepWaitRecoveryReserved::RepWaitRecoveryReserved(my_context c
     NamedState(context< RecoveryMachine >().pg, "Started/ReplicaActive/RepWaitRecoveryReserved")
 {
   context< RecoveryMachine >().log_enter(state_name);
-  PG *pg = context< RecoveryMachine >().pg;
-
-  pg->osd->remote_reserver.request_reservation(
-    pg->info.pgid,
-    new QueuePeeringEvt<RemoteRecoveryReserved>(
-      pg, pg->get_osdmap()->get_epoch(),
-      RemoteRecoveryReserved()),
-    pg->get_recovery_priority());
 }
 
 boost::statechart::result
@@ -6698,6 +6690,24 @@ PG::RecoveryState::RepNotRecovering::react(const RequestBackfillPrio &evt)
   return transit<RepWaitBackfillReserved>();
 }
 
+boost::statechart::result
+PG::RecoveryState::RepNotRecovering::react(const RequestRecoveryPrio &evt)
+{
+  PG *pg = context< RecoveryMachine >().pg;
+  ostringstream ss;
+
+  // fall back to a local reckoning of priority of primary doesn't pass one
+  // (pre-mimic compat)
+  int prio = evt.priority ? evt.priority : pg->get_recovery_priority();
+  pg->osd->remote_reserver.request_reservation(
+    pg->info.pgid,
+    new QueuePeeringEvt<RemoteRecoveryReserved>(
+      pg, pg->get_osdmap()->get_epoch(),
+      RemoteRecoveryReserved()),
+    prio);
+  return transit<RepWaitRecoveryReserved>();
+}
+
 void PG::RecoveryState::RepWaitBackfillReserved::exit()
 {
   context< RecoveryMachine >().log_exit(state_name, enter_time);
index 40e7c7c3be5e33d85e6f86ab2ecfc257257b7d75..4488bc12b252517a6ef39d5ae7f98e999f44f2ff 100644 (file)
@@ -1795,6 +1795,15 @@ public:
       *out << "RequestBackfillPrio: priority " << priority;
     }
   };
+  struct RequestRecoveryPrio : boost::statechart::event< RequestRecoveryPrio > {
+    unsigned priority;
+    explicit RequestRecoveryPrio(unsigned prio) :
+              boost::statechart::event< RequestRecoveryPrio >(),
+                         priority(prio) {}
+    void print(std::ostream *out) const {
+      *out << "RequestRecoveryPrio: priority " << priority;
+    }
+  };
 #define TrivialEvent(T) struct T : boost::statechart::event< T > { \
     T() : boost::statechart::event< T >() {}                      \
     void print(std::ostream *out) const {                         \
@@ -1846,7 +1855,6 @@ protected:
   TrivialEvent(RemoteReservationRejected)
   TrivialEvent(RemoteReservationCanceled)
   TrivialEvent(RequestBackfill)
-  TrivialEvent(RequestRecovery)
   TrivialEvent(RecoveryDone)
   protected:
   TrivialEvent(BackfillTooFull)
@@ -2313,14 +2321,15 @@ protected:
 
     struct RepNotRecovering : boost::statechart::state< RepNotRecovering, ReplicaActive>, NamedState {
       typedef boost::mpl::list<
+       boost::statechart::custom_reaction< RequestRecoveryPrio >,
        boost::statechart::custom_reaction< RequestBackfillPrio >,
-        boost::statechart::transition< RequestRecovery, RepWaitRecoveryReserved >,
        boost::statechart::custom_reaction< RejectRemoteReservation >,
        boost::statechart::transition< RemoteReservationRejected, RepNotRecovering >,
        boost::statechart::transition< RemoteReservationCanceled, RepNotRecovering >,
        boost::statechart::transition< RecoveryDone, RepNotRecovering >  // for compat with pre-reservation peers
        > reactions;
       explicit RepNotRecovering(my_context ctx);
+      boost::statechart::result react(const RequestRecoveryPrio &evt);
       boost::statechart::result react(const RequestBackfillPrio &evt);
       boost::statechart::result react(const RejectRemoteReservation &evt);
       void exit();