]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd/PG: add explicit CANCEL MBackfillReserve type
authorSage Weil <sage@redhat.com>
Wed, 4 Oct 2017 20:30:14 +0000 (15:30 -0500)
committerSage Weil <sage@redhat.com>
Wed, 4 Oct 2017 20:30:14 +0000 (15:30 -0500)
This lets us distinguish between REJECT and CANCEL for clarity.

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

index f70c2946b30e0cf2ed4b673d2a0361fed365db43..89d3c9ff33d75d3db98c327bb06a3c68dd48ef70 100644 (file)
@@ -18,8 +18,8 @@
 #include "msg/Message.h"
 
 class MBackfillReserve : public Message {
-  static const int HEAD_VERSION = 3;
-  static const int COMPAT_VERSION = 3;
+  static const int HEAD_VERSION = 4;
+  static const int COMPAT_VERSION = 4;
 public:
   spg_t pgid;
   epoch_t query_epoch;
@@ -27,6 +27,7 @@ public:
     REQUEST = 0,
     GRANT = 1,
     REJECT = 2,
+    CANCEL = 3,
   };
   uint32_t type;
   uint32_t priority;
@@ -57,6 +58,9 @@ public:
     case REJECT:
       out << "REJECT ";
       break;
+    case CANCEL:
+      out << "CANCEL ";
+      break;
     }
     out << " pgid: " << pgid << ", query_epoch: " << query_epoch;
     if (type == REQUEST) out << ", prio: " << priority;
@@ -73,6 +77,18 @@ public:
   }
 
   void encode_payload(uint64_t features) override {
+    if (!HAVE_FEATURE(features, SERVER_MIMIC)) {
+      header.version = 3;
+      header.compat_version = 3;
+      ::encode(pgid.pgid, payload);
+      ::encode(query_epoch, payload);
+      ::encode(type == CANCEL ? REJECT : type, payload);
+      ::encode(priority, payload);
+      ::encode(pgid.shard, payload);
+      return;
+    }
+    header.version = HEAD_VERSION;
+    header.compat_version = COMPAT_VERSION;
     ::encode(pgid.pgid, payload);
     ::encode(query_epoch, payload);
     ::encode(type, payload);
index dd72fbb29f97638413643d1696a126f82394722e..63cf3eaeace703f34c9f5839e59469b1926b75f3 100644 (file)
@@ -8681,11 +8681,18 @@ void OSD::handle_pg_backfill_reserve(OpRequestRef op)
   } else if (m->type == MBackfillReserve::REJECT) {
     // NOTE: this is replica -> primary "i reject your request"
     //      and also primary -> replica "cancel my previously-granted request"
+    //                                  (for older peers)
     evt = PG::CephPeeringEvtRef(
       new PG::CephPeeringEvt(
        m->query_epoch,
        m->query_epoch,
        PG::RemoteReservationRejected()));
+  } else if (m->type == MBackfillReserve::CANCEL) {
+    evt = PG::CephPeeringEvtRef(
+      new PG::CephPeeringEvt(
+       m->query_epoch,
+       m->query_epoch,
+       PG::RemoteReservationCanceled()));
   } else {
     ceph_abort();
   }
index 51937233363ec693a4c9ba1fc252d4496bc2ee74..8681187e96e29d7cec7baea2b602d6353946d5d4 100644 (file)
@@ -6199,7 +6199,7 @@ PG::RecoveryState::Backfilling::react(const DeferBackfill &c)
     if (con) {
       pg->osd->send_message_osd_cluster(
         new MBackfillReserve(
-         MBackfillReserve::REJECT,
+         MBackfillReserve::CANCEL,
          spg_t(pg->info.pgid.pgid, it->shard),
          pg->get_osdmap()->get_epoch()),
        con.get());
@@ -6228,7 +6228,7 @@ PG::RecoveryState::Backfilling::react(const RemoteReservationRejected &)
     if (con) {
       pg->osd->send_message_osd_cluster(
         new MBackfillReserve(
-         MBackfillReserve::REJECT,
+         MBackfillReserve::CANCEL,
          spg_t(pg->info.pgid.pgid, it->shard),
          pg->get_osdmap()->get_epoch()),
        con.get());
@@ -6308,7 +6308,7 @@ PG::RecoveryState::WaitRemoteBackfillReserved::react(const RemoteReservationReje
   PG *pg = context< RecoveryMachine >().pg;
   pg->osd->local_reserver.cancel_reservation(pg->info.pgid);
 
-  // Send REJECT to all previously acquired reservations
+  // Send CANCEL to all previously acquired reservations
   set<pg_shard_t>::const_iterator it, begin, end, next;
   begin = context< Active >().remote_shards_to_reserve_backfill.begin();
   end = context< Active >().remote_shards_to_reserve_backfill.end();
@@ -6321,7 +6321,7 @@ PG::RecoveryState::WaitRemoteBackfillReserved::react(const RemoteReservationReje
     if (con) {
       pg->osd->send_message_osd_cluster(
         new MBackfillReserve(
-       MBackfillReserve::REJECT,
+       MBackfillReserve::CANCEL,
        spg_t(pg->info.pgid.pgid, it->shard),
        pg->get_osdmap()->get_epoch()),
       con.get());