]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: OSDMonitor: move failure code to support op requests
authorJoao Eduardo Luis <joao@suse.de>
Wed, 24 Jun 2015 16:54:33 +0000 (17:54 +0100)
committerJoao Eduardo Luis <joao@suse.de>
Thu, 16 Jul 2015 17:31:22 +0000 (18:31 +0100)
Signed-off-by: Joao Eduardo Luis <joao@suse.de>
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h

index 8d178953eda5fab2af20539a52ab5e7346c5ad0e..26b2fbe6a07dd897ccbb68af56b8425871df9a10 100644 (file)
@@ -431,11 +431,11 @@ void OSDMonitor::on_active()
     mon->clog->info() << "osdmap " << osdmap << "\n";
 
   if (!mon->is_leader()) {
-    list<MOSDFailure*> ls;
+    list<MonOpRequestRef> ls;
     take_all_failures(ls);
     while (!ls.empty()) {
-      MonOpRequestRef op =
-        mon->op_tracker.create_request<MonOpRequest>(ls.front());
+      MonOpRequestRef op = ls.front();
+      op->mark_osdmon_event(__func__);
       dispatch(op);
       ls.pop_front();
     }
@@ -447,10 +447,9 @@ void OSDMonitor::on_shutdown()
   dout(10) << __func__ << dendl;
 
   // discard failure info, waiters
-  list<MOSDFailure*> ls;
+  list<MonOpRequestRef> ls;
   take_all_failures(ls);
   while (!ls.empty()) {
-    ls.front()->put();
     ls.pop_front();
   }
 }
@@ -1708,10 +1707,9 @@ bool OSDMonitor::prepare_failure(MonOpRequestRef op)
     mon->clog->debug() << m->get_target() << " reported failed by "
                      << m->get_orig_source_inst() << "\n";
     failure_info_t& fi = failure_info[target_osd];
-    MOSDFailure *old = fi.add_report(reporter, failed_since, m);
-    if (old) {
-      mon->no_reply(old);
-      old->put();
+    MonOpRequestRef old_op = fi.add_report(reporter, failed_since, op);
+    if (old_op) {
+      mon->no_reply(old_op);
     }
 
     return check_failure(now, target_osd, fi);
@@ -1721,12 +1719,12 @@ bool OSDMonitor::prepare_failure(MonOpRequestRef op)
                      << m->get_orig_source_inst() << "\n";
     if (failure_info.count(target_osd)) {
       failure_info_t& fi = failure_info[target_osd];
-      list<MOSDFailure*> ls;
+      list<MonOpRequestRef> ls;
       fi.take_report_messages(ls);
       fi.cancel_report(reporter);
       while (!ls.empty()) {
-       mon->no_reply(ls.front());
-       ls.front()->put();
+        if (ls.front())
+          mon->no_reply(ls.front());
        ls.pop_front();
       }
       if (fi.reporters.empty()) {
@@ -1740,7 +1738,7 @@ bool OSDMonitor::prepare_failure(MonOpRequestRef op)
     } else {
       dout(10) << " no failure_info for osd." << target_osd << dendl;
     }
-    mon->no_reply(m);
+    mon->no_reply(op);
   }
 
   return false;
@@ -1754,19 +1752,20 @@ void OSDMonitor::process_failures()
       ++p;
     } else {
       dout(10) << "process_failures osd." << p->first << dendl;
-      list<MOSDFailure*> ls;
+      list<MonOpRequestRef> ls;
       p->second.take_report_messages(ls);
       failure_info.erase(p++);
 
       while (!ls.empty()) {
-       send_latest(ls.front(), ls.front()->get_epoch());
+        MOSDFailure *m = ls.front()->get_req<MOSDFailure>();
+        send_latest(m, m->get_epoch());
        ls.pop_front();
       }
     }
   }
 }
 
-void OSDMonitor::take_all_failures(list<MOSDFailure*>& ls)
+void OSDMonitor::take_all_failures(list<MonOpRequestRef>& ls)
 {
   dout(10) << __func__ << " on " << failure_info.size() << " osds" << dendl;
 
index 2907dcbc0ee9938ecf7c77416abcb3bd9490b2f6..0796361fb855f893e19bd3ed737b6868db998abb 100644 (file)
@@ -39,7 +39,6 @@ class PGMap;
 #include "messages/MOSDBoot.h"
 #include "messages/MMonCommand.h"
 #include "messages/MOSDMap.h"
-#include "messages/MOSDFailure.h"
 #include "messages/MPoolOp.h"
 
 #include "erasure-code/ErasureCodeInterface.h"
@@ -53,14 +52,11 @@ class PGMap;
 struct failure_reporter_t {
   int num_reports;          ///< reports from this reporter
   utime_t failed_since;     ///< when they think it failed
-  MOSDFailure *msg;         ///< most recent failure message
+  MonOpRequestRef op;       ///< most recent failure op request
 
-  failure_reporter_t() : num_reports(0), msg(NULL) {}
-  failure_reporter_t(utime_t s) : num_reports(1), failed_since(s), msg(NULL) {}
-  ~failure_reporter_t() {
-    // caller should have taken this message before removing the entry.
-    assert(!msg);
-  }
+  failure_reporter_t() : num_reports(0) {}
+  failure_reporter_t(utime_t s) : num_reports(1), failed_since(s) {}
+  ~failure_reporter_t() { }
 };
 
 /// information about all failure reports for one osd
@@ -83,9 +79,10 @@ struct failure_info_t {
     return max_failed_since;
   }
 
-  // set the message for the latest report.  return any old message we had,
+  // set the message for the latest report.  return any old op request we had,
   // if any, so we can discard it.
-  MOSDFailure *add_report(int who, utime_t failed_since, MOSDFailure *msg) {
+  MonOpRequestRef add_report(int who, utime_t failed_since,
+                              MonOpRequestRef op) {
     map<int, failure_reporter_t>::iterator p = reporters.find(who);
     if (p == reporters.end()) {
       if (max_failed_since == utime_t())
@@ -98,18 +95,18 @@ struct failure_info_t {
     }
     num_reports++;
 
-    MOSDFailure *ret = p->second.msg;
-    p->second.msg = msg;
+    MonOpRequestRef ret = p->second.op;
+    p->second.op = op;
     return ret;
   }
 
-  void take_report_messages(list<MOSDFailure*>& ls) {
+  void take_report_messages(list<MonOpRequestRef>& ls) {
     for (map<int, failure_reporter_t>::iterator p = reporters.begin();
         p != reporters.end();
         ++p) {
-      if (p->second.msg) {
-       ls.push_back(p->second.msg);
-       p->second.msg = NULL;
+      if (p->second.op) {
+       ls.push_back(p->second.op);
+        p->second.op.reset();
       }
     }
   }
@@ -247,7 +244,7 @@ private:
   bool prepare_failure(MonOpRequestRef op);
   bool prepare_mark_me_down(MonOpRequestRef op);
   void process_failures();
-  void take_all_failures(list<MOSDFailure*>& ls);
+  void take_all_failures(list<MonOpRequestRef>& ls);
 
   bool preprocess_boot(MonOpRequestRef op);
   bool prepare_boot(MonOpRequestRef op);