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();
}
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();
}
}
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);
<< 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()) {
} else {
dout(10) << " no failure_info for osd." << target_osd << dendl;
}
- mon->no_reply(m);
+ mon->no_reply(op);
}
return false;
++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;
#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"
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
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())
}
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();
}
}
}
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);