From: Sage Weil Date: Mon, 23 Oct 2017 02:38:14 +0000 (-0500) Subject: osd/PG: explicit TOOFULL verb for backfill cancellation X-Git-Tag: v13.0.1~414^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0e9dac1ae1a529ecbb9305dabcb3f97c0e193f8d;p=ceph.git osd/PG: explicit TOOFULL verb for backfill cancellation We were sending REJECT if the replica filled up, and the primary would set the BACKFILL_TOOFULL state as a result. Make it an explicit verb for clarity. Signed-off-by: Sage Weil --- diff --git a/src/messages/MBackfillReserve.h b/src/messages/MBackfillReserve.h index a0e1276bb329..0d4814c2f672 100644 --- a/src/messages/MBackfillReserve.h +++ b/src/messages/MBackfillReserve.h @@ -28,6 +28,7 @@ public: GRANT = 1, // replica->primary: ok, i reserved it REJECT = 2, // replica->primary: sorry, try again later (*) RELEASE = 3, // primary->replcia: release the slot i reserved before + TOOFULL = 4, // replica->primary: too full, stop backfilling // (*) NOTE: prior to luminous, REJECT was overloaded to also mean release }; uint32_t type; @@ -62,6 +63,9 @@ public: case RELEASE: out << "RELEASE "; break; + case TOOFULL: + out << "TOOFULL "; + break; } out << " pgid: " << pgid << ", query_epoch: " << query_epoch; if (type == REQUEST) out << ", prio: " << priority; @@ -83,7 +87,8 @@ public: header.compat_version = 3; ::encode(pgid.pgid, payload); ::encode(query_epoch, payload); - ::encode(type == RELEASE ? REJECT : type, payload); + ::encode((type == RELEASE || type == TOOFULL) ? + REJECT : type, payload); ::encode(priority, payload); ::encode(pgid.shard, payload); return; diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 7ad5a770fa66..4faf8649e6f0 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -8550,6 +8550,8 @@ void OSD::handle_pg_backfill_reserve(OpRequestRef op) // NOTE: this is replica -> primary "i reject your request" // and also primary -> replica "cancel my previously-granted request" // (for older peers) + // and also replica -> primary "i revoke your reservation" + // (for older peers) evt = PG::CephPeeringEvtRef( new PG::CephPeeringEvt( m->query_epoch, @@ -8561,6 +8563,12 @@ void OSD::handle_pg_backfill_reserve(OpRequestRef op) m->query_epoch, m->query_epoch, PG::RemoteReservationCanceled())); + } else if (m->type == MBackfillReserve::TOOFULL) { + evt = PG::CephPeeringEvtRef( + new PG::CephPeeringEvt( + m->query_epoch, + m->query_epoch, + PG::RemoteReservationRevokedTooFull())); } else { ceph_abort(); } diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 128c2a4a57ce..68151a9f3dc9 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -6390,7 +6390,7 @@ PG::RecoveryState::Backfilling::react(const UnfoundBackfill &c) } boost::statechart::result -PG::RecoveryState::Backfilling::react(const RemoteReservationRejected &) +PG::RecoveryState::Backfilling::react(const RemoteReservationRevokedTooFull &) { PG *pg = context< RecoveryMachine >().pg; pg->osd->local_reserver.cancel_reservation(pg->info.pgid); @@ -6786,7 +6786,13 @@ boost::statechart::result PG::RecoveryState::RepRecovering::react(const BackfillTooFull &) { PG *pg = context< RecoveryMachine >().pg; - pg->reject_reservation(); + pg->osd->send_message_osd_cluster( + pg->primary.osd, + new MBackfillReserve( + MBackfillReserve::TOOFULL, + spg_t(pg->info.pgid.pgid, pg->primary.shard), + pg->get_osdmap()->get_epoch()), + pg->get_osdmap()->get_epoch()); return discard_event(); } diff --git a/src/osd/PG.h b/src/osd/PG.h index 4488bc12b252..005090929cd9 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1853,6 +1853,7 @@ protected: TrivialEvent(RejectRemoteReservation) public: TrivialEvent(RemoteReservationRejected) + TrivialEvent(RemoteReservationRevokedTooFull) TrivialEvent(RemoteReservationCanceled) TrivialEvent(RequestBackfill) TrivialEvent(RecoveryDone) @@ -2176,10 +2177,16 @@ protected: boost::statechart::transition< Backfilled, Recovered >, boost::statechart::custom_reaction< DeferBackfill >, boost::statechart::custom_reaction< UnfoundBackfill >, - boost::statechart::custom_reaction< RemoteReservationRejected > + boost::statechart::custom_reaction< RemoteReservationRejected >, + boost::statechart::custom_reaction< RemoteReservationRevokedTooFull> > reactions; explicit Backfilling(my_context ctx); - boost::statechart::result react(const RemoteReservationRejected& evt); + boost::statechart::result react(const RemoteReservationRejected& evt) { + // for compat with old peers + post_event(RemoteReservationRevokedTooFull()); + return discard_event(); + } + boost::statechart::result react(const RemoteReservationRevokedTooFull& evt); boost::statechart::result react(const DeferBackfill& evt); boost::statechart::result react(const UnfoundBackfill& evt); void exit();