]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PG: explicit TOOFULL verb for backfill cancellation
authorSage Weil <sage@redhat.com>
Mon, 23 Oct 2017 02:38:14 +0000 (21:38 -0500)
committerSage Weil <sage@redhat.com>
Mon, 23 Oct 2017 02:38:14 +0000 (21:38 -0500)
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 <sage@redhat.com>
src/messages/MBackfillReserve.h
src/osd/OSD.cc
src/osd/PG.cc
src/osd/PG.h

index a0e1276bb329c23dc59d483299ed31f77d48ffac..0d4814c2f672a323e366744e87120069dd7ac07a 100644 (file)
@@ -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;
index 7ad5a770fa66a664af27bacf52cbf9bedd058356..4faf8649e6f0f5be23ba62c35a9f5855ed53a647 100644 (file)
@@ -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();
   }
index 128c2a4a57ce40031ceee2e8b4863969717ed424..68151a9f3dc97b045ae5a30b09303462e665ec19 100644 (file)
@@ -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();
 }
 
index 4488bc12b252517a6ef39d5ae7f98e999f44f2ff..005090929cd998348dc9dd29fca3903436532dd8 100644 (file)
@@ -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();