]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Monitor: add MOSDMarkMeDown support
authorSamuel Just <sam.just@inktank.com>
Wed, 20 Mar 2013 21:30:49 +0000 (14:30 -0700)
committerSamuel Just <sam.just@inktank.com>
Fri, 22 Mar 2013 01:37:35 +0000 (18:37 -0700)
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/mon/Monitor.cc
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h

index bcebe3a1ccbc1756769e98c70adddfb2ae84d602..93f55607137c80ea0e553436f3ca85ff13f0375c 100644 (file)
@@ -3071,6 +3071,7 @@ bool Monitor::_ms_dispatch(Message *m)
       break;
 
       // OSDs
+    case MSG_OSD_MARK_ME_DOWN:
     case MSG_OSD_FAILURE:
     case MSG_OSD_BOOT:
     case MSG_OSD_ALIVE:
index 952b3721c2b725d756330563aa70d267327d2e08..d3cefae38035608875ff6d1059aaeb0546bfe2f8 100644 (file)
@@ -25,6 +25,7 @@
 #include "crush/CrushTester.h"
 
 #include "messages/MOSDFailure.h"
+#include "messages/MOSDMarkMeDown.h"
 #include "messages/MOSDMap.h"
 #include "messages/MOSDBoot.h"
 #include "messages/MOSDAlive.h"
@@ -540,6 +541,8 @@ bool OSDMonitor::preprocess_query(PaxosServiceMessage *m)
     return preprocess_command(static_cast<MMonCommand*>(m));
 
     // damp updates
+  case MSG_OSD_MARK_ME_DOWN:
+    return preprocess_mark_me_down(static_cast<MOSDMarkMeDown*>(m));
   case MSG_OSD_FAILURE:
     return preprocess_failure(static_cast<MOSDFailure*>(m));
   case MSG_OSD_BOOT:
@@ -568,6 +571,8 @@ bool OSDMonitor::prepare_update(PaxosServiceMessage *m)
   
   switch (m->get_type()) {
     // damp updates
+  case MSG_OSD_MARK_ME_DOWN:
+    return prepare_mark_me_down(static_cast<MOSDMarkMeDown*>(m));
   case MSG_OSD_FAILURE:
     return prepare_failure(static_cast<MOSDFailure*>(m));
   case MSG_OSD_BOOT:
@@ -664,7 +669,6 @@ bool OSDMonitor::preprocess_failure(MOSDFailure *m)
       goto didit;
     }
   }
-  
 
   // weird?
   if (!osdmap.have_inst(badboy)) {
@@ -702,6 +706,75 @@ bool OSDMonitor::preprocess_failure(MOSDFailure *m)
   return true;
 }
 
+class C_AckMarkedDown : public Context {
+  OSDMonitor *osdmon;
+  MOSDMarkMeDown *m;
+public:
+  C_AckMarkedDown(
+    OSDMonitor *osdmon,
+    MOSDMarkMeDown *m)
+    : osdmon(osdmon), m(m) {}
+
+  void finish(int) {
+    osdmon->mon->send_reply(
+      m,
+      new MOSDMarkMeDown(
+       m->fsid,
+       m->get_target(),
+       m->get_epoch(),
+       m->ack));
+  }
+  ~C_AckMarkedDown() {
+    m->put();
+  }
+};
+
+bool OSDMonitor::preprocess_mark_me_down(MOSDMarkMeDown *m)
+{
+  int requesting_down = m->get_target().name.num();
+
+  // check permissions
+  if (check_source(m, m->fsid))
+    goto didit;
+
+  // first, verify the reporting host is valid
+  if (m->get_orig_source().is_osd()) {
+    int from = m->get_orig_source().num();
+    if (!osdmap.exists(from) ||
+       osdmap.get_addr(from) != m->get_orig_source_inst().addr ||
+       osdmap.is_down(from)) {
+      dout(5) << "preprocess_mark_me_down from dead osd."
+             << from << ", ignoring" << dendl;
+      send_incremental(m, m->get_epoch()+1);
+      goto didit;
+    }
+  }
+
+  // no down might be set
+  if (!can_mark_down(requesting_down))
+    goto didit;
+
+  dout(10) << "MOSDMarkMeDown for: " << m->get_target() << dendl;
+  return false;
+
+ didit:
+  Context *c(new C_AckMarkedDown(this, m));
+  c->complete(0);
+  return true;
+}
+
+bool OSDMonitor::prepare_mark_me_down(MOSDMarkMeDown *m)
+{
+  int target_osd = m->get_target().name.num();
+
+  assert(osdmap.is_up(target_osd));
+  assert(osdmap.get_addr(target_osd) == m->get_target().addr);
+
+  pending_inc.new_state[target_osd] = CEPH_OSD_UP;
+  wait_for_finished_proposal(new C_AckMarkedDown(this, m));
+  return true;
+}
+
 bool OSDMonitor::can_mark_down(int i)
 {
   if (osdmap.test_flag(CEPH_OSDMAP_NODOWN)) {
index 4dd6feecc1d46748582135c8e7aca70d4f13da75..15eb469c129d966a76b54c995493ecabb4776134 100644 (file)
@@ -174,8 +174,12 @@ private:
 
   bool check_source(PaxosServiceMessage *m, uuid_d fsid);
  
+  bool preprocess_mark_me_down(class MOSDMarkMeDown *m);
+
+  friend class C_AckMarkedDown;
   bool preprocess_failure(class MOSDFailure *m);
   bool prepare_failure(class MOSDFailure *m);
+  bool prepare_mark_me_down(class MOSDMarkMeDown *m);
   void process_failures();
   void kick_all_failures();