]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
messages/MOSDMarkMeDown: use addrvec
authorSage Weil <sage@redhat.com>
Wed, 30 May 2018 18:56:52 +0000 (13:56 -0500)
committerSage Weil <sage@redhat.com>
Fri, 1 Jun 2018 13:08:19 +0000 (08:08 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/messages/MOSDMarkMeDown.h
src/mon/OSDMonitor.cc
src/osd/OSD.cc

index 1a422d6abbb07ee33582f76d5f5e350cf968dbb5..66e29063a87fd49539fe308fd417a5a78527924c 100644 (file)
 
 class MOSDMarkMeDown : public PaxosServiceMessage {
 
-  static const int HEAD_VERSION = 2;
-  static const int COMPAT_VERSION = 2;
+  static const int HEAD_VERSION = 3;
+  static const int COMPAT_VERSION = 3;
 
  public:
   uuid_d fsid;
-  entity_inst_t target_osd;
+  int32_t target_osd;
+  entity_addrvec_t target_addrs;
   epoch_t epoch = 0;
   bool request_ack = false;          // ack requested
 
   MOSDMarkMeDown()
     : PaxosServiceMessage(MSG_OSD_MARK_ME_DOWN, 0,
                          HEAD_VERSION, COMPAT_VERSION) { }
-  MOSDMarkMeDown(const uuid_d &fs, const entity_inst_t& f,
+  MOSDMarkMeDown(const uuid_d &fs, int osd, const entity_addrvec_t& av,
                 epoch_t e, bool request_ack)
     : PaxosServiceMessage(MSG_OSD_MARK_ME_DOWN, e,
                          HEAD_VERSION, COMPAT_VERSION),
-      fsid(fs), target_osd(f), epoch(e), request_ack(request_ack) {}
+      fsid(fs), target_osd(osd), target_addrs(av),
+      epoch(e), request_ack(request_ack) {}
  private:
   ~MOSDMarkMeDown() override {}
 
 public: 
-  entity_inst_t get_target() const { return target_osd; }
   epoch_t get_epoch() const { return epoch; }
 
   void decode_payload() override {
     auto p = payload.cbegin();
     paxos_decode(p);
+    if (header.version <= 2) {
+      decode(fsid, p);
+      entity_inst_t i;
+      decode(i, p);
+      target_osd = i.name.num();
+      target_addrs = entity_addrvec_t(i.addr);
+      decode(epoch, p);
+      decode(request_ack, p);
+      return;
+    }
     decode(fsid, p);
     decode(target_osd, p);
+    decode(target_addrs, p);
     decode(epoch, p);
     decode(request_ack, p);
   }
@@ -55,8 +67,22 @@ public:
   void encode_payload(uint64_t features) override {
     using ceph::encode;
     paxos_encode();
+    if (!HAVE_FEATURE(features, SERVER_NAUTILUS)) {
+      header.version = 2;
+      header.compat_version = 2;
+      encode(fsid, payload);
+      encode(entity_inst_t(entity_name_t::OSD(target_osd),
+                          target_addrs.legacy_addr()),
+            payload, features);
+      encode(epoch, payload);
+      encode(request_ack, payload);
+      return;
+    }
+    header.version = HEAD_VERSION;
+    header.compat_version = COMPAT_VERSION;
     encode(fsid, payload);
     encode(target_osd, payload, features);
+    encode(target_addrs, payload, features);
     encode(epoch, payload);
     encode(request_ack, payload);
   }
@@ -65,7 +91,8 @@ public:
   void print(ostream& out) const override {
     out << "MOSDMarkMeDown("
        << "request_ack=" << request_ack
-       << ", target_osd=" << target_osd
+       << ", osd." << target_osd
+       << ", " << target_addrs
        << ", fsid=" << fsid
        << ")";
   }
index c9cdc5e0617d0c4658d9167d735442bad1dd96d6..ff6aa16d52867b805686f57cd51e8c8ee1443a2a 100644 (file)
@@ -2197,7 +2197,8 @@ public:
       op,
       new MOSDMarkMeDown(
        m->fsid,
-       m->get_target(),
+       m->target_osd,
+       m->target_addrs,
        m->get_epoch(),
        false));   // ACK itself does not request an ack
   }
@@ -2209,8 +2210,7 @@ bool OSDMonitor::preprocess_mark_me_down(MonOpRequestRef op)
 {
   op->mark_osdmon_event(__func__);
   MOSDMarkMeDown *m = static_cast<MOSDMarkMeDown*>(op->get_req());
-  int requesting_down = m->get_target().name.num();
-  int from = m->get_orig_source().num();
+  int from = m->target_osd;
 
   // check permissions
   if (check_source(m, m->fsid))
@@ -2222,7 +2222,7 @@ bool OSDMonitor::preprocess_mark_me_down(MonOpRequestRef op)
 
   if (!osdmap.exists(from) ||
       osdmap.is_down(from) ||
-      osdmap.get_addr(from) != m->get_target().addr) {
+      osdmap.get_addrs(from) != m->target_addrs) {
     dout(5) << "preprocess_mark_me_down from dead osd."
            << from << ", ignoring" << dendl;
     send_incremental(op, m->get_epoch()+1);
@@ -2230,10 +2230,11 @@ bool OSDMonitor::preprocess_mark_me_down(MonOpRequestRef op)
   }
 
   // no down might be set
-  if (!can_mark_down(requesting_down))
+  if (!can_mark_down(from))
     goto reply;
 
-  dout(10) << "MOSDMarkMeDown for: " << m->get_target() << dendl;
+  dout(10) << "MOSDMarkMeDown for: " << m->get_orig_source()
+          << " " << m->target_addrs << dendl;
   return false;
 
  reply:
@@ -2248,10 +2249,10 @@ bool OSDMonitor::prepare_mark_me_down(MonOpRequestRef op)
 {
   op->mark_osdmon_event(__func__);
   MOSDMarkMeDown *m = static_cast<MOSDMarkMeDown*>(op->get_req());
-  int target_osd = m->get_target().name.num();
+  int target_osd = m->target_osd;
 
   assert(osdmap.is_up(target_osd));
-  assert(osdmap.get_addr(target_osd) == m->get_target().addr);
+  assert(osdmap.get_addrs(target_osd) == m->target_addrs);
 
   mon->clog->info() << "osd." << target_osd << " marked itself down";
   pending_inc.new_state[target_osd] = CEPH_OSD_UP;
index 0ef31cd9a19f4cd4dc215413d9dfb92d5705c645..c0235cd170344f4d40f59698b3721950e7b2d937 100644 (file)
@@ -1243,11 +1243,14 @@ bool OSDService::prepare_to_stop()
   if (osdmap && osdmap->is_up(whoami)) {
     dout(0) << __func__ << " telling mon we are shutting down" << dendl;
     set_state(PREPARING_TO_STOP);
-    monc->send_mon_message(new MOSDMarkMeDown(monc->get_fsid(),
-                                             osdmap->get_inst(whoami),
-                                             osdmap->get_epoch(),
-                                             true  // request ack
-                                             ));
+    monc->send_mon_message(
+      new MOSDMarkMeDown(
+       monc->get_fsid(),
+       whoami,
+       osdmap->get_addrs(whoami),
+       osdmap->get_epoch(),
+       true  // request ack
+       ));
     utime_t now = ceph_clock_now();
     utime_t timeout;
     timeout.set_from_double(now + cct->_conf->osd_mon_shutdown_timeout);