We need to discard/cancel/free the failure report messages before we
cancel a report out. Assert in the dtor to ensure we didn't forget.
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Joao Eduardo Luis <joao.luis@inktank.com>
<< m->get_orig_source_inst() << "\n";
if (failure_info.count(target_osd)) {
failure_info_t& fi = failure_info[target_osd];
+ list<MOSDFailure*> ls;
+ fi.take_report_messages(ls);
fi.cancel_report(reporter);
+ while (!ls.empty()) {
+ mon->no_reply(ls.front());
+ ls.pop_front();
+ }
if (fi.reporters.empty()) {
dout(10) << " removing last failure_info for osd." << target_osd << dendl;
failure_info.erase(target_osd);
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);
+ }
};
/// information about all failure reports for one osd