if osd failed finally, this may make these reporters cannot receive lastest
update right away, besides, it's not effective to make a traverse of all reporters
Signed-off-by: Mingxin Liu <mingxin@xsky.com>
<< m->get_orig_source_inst() << "\n";
if (failure_info.count(target_osd)) {
failure_info_t& fi = failure_info[target_osd];
- list<MonOpRequestRef> ls;
- fi.take_report_messages(ls);
- fi.cancel_report(reporter);
- while (!ls.empty()) {
- if (ls.front())
- mon->no_reply(ls.front());
- ls.pop_front();
+ MonOpRequestRef report_op = fi.cancel_report(reporter);
+ if (report_op) {
+ mon->no_reply(report_op);
}
if (fi.reporters.empty()) {
dout(10) << " removing last failure_info for osd." << target_osd
}
}
- void cancel_report(int who) {
+ MonOpRequestRef cancel_report(int who) {
map<int, failure_reporter_t>::iterator p = reporters.find(who);
if (p == reporters.end())
- return;
+ return MonOpRequestRef();
+ MonOpRequestRef ret = p->second.op;
reporters.erase(p);
- if (reporters.empty())
- max_failed_since = utime_t();
+ return ret;
}
};