From: Joao Eduardo Luis Date: Wed, 24 Jun 2015 16:54:33 +0000 (+0100) Subject: mon: OSDMonitor: move failure code to support op requests X-Git-Tag: v9.1.0~535^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7ed9fbf28553f0c38d8bcc15f853b9d09bd247ad;p=ceph.git mon: OSDMonitor: move failure code to support op requests Signed-off-by: Joao Eduardo Luis --- diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 8d178953eda5..26b2fbe6a07d 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -431,11 +431,11 @@ void OSDMonitor::on_active() mon->clog->info() << "osdmap " << osdmap << "\n"; if (!mon->is_leader()) { - list ls; + list ls; take_all_failures(ls); while (!ls.empty()) { - MonOpRequestRef op = - mon->op_tracker.create_request(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 ls; + list 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 ls; + list 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 ls; + list 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(); + send_latest(m, m->get_epoch()); ls.pop_front(); } } } } -void OSDMonitor::take_all_failures(list& ls) +void OSDMonitor::take_all_failures(list& ls) { dout(10) << __func__ << " on " << failure_info.size() << " osds" << dendl; diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h index 2907dcbc0ee9..0796361fb855 100644 --- a/src/mon/OSDMonitor.h +++ b/src/mon/OSDMonitor.h @@ -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::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& ls) { + void take_report_messages(list& ls) { for (map::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& ls); + void take_all_failures(list& ls); bool preprocess_boot(MonOpRequestRef op); bool prepare_boot(MonOpRequestRef op);