From: Sage Weil Date: Sun, 22 Oct 2017 19:09:53 +0000 (-0500) Subject: osd/PG: respect primary's priority for remote recovery reservation X-Git-Tag: v13.0.1~414^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4078102bdc1f117e465b5537833c74ebc70f1b69;p=ceph.git osd/PG: respect primary's priority for remote recovery reservation This now mirrors the backfill approach (e.g., RequestBackfillPrio). Signed-off-by: Sage Weil --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 124e7f1e7dc..bf4421e6d8b 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -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( diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 90959d67ba0..fb7b5142dca 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -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( - 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(); } +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( + pg, pg->get_osdmap()->get_epoch(), + RemoteRecoveryReserved()), + prio); + return transit(); +} + void PG::RecoveryState::RepWaitBackfillReserved::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); diff --git a/src/osd/PG.h b/src/osd/PG.h index 40e7c7c3be5..4488bc12b25 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -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();