]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: fix leak of MOSDFailure messages
authorSage Weil <sage@inktank.com>
Sun, 23 Jun 2013 15:53:09 +0000 (08:53 -0700)
committerSage Weil <sage@inktank.com>
Sun, 23 Jun 2013 15:53:09 +0000 (08:53 -0700)
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>
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h

index cf0e45d9a65af2d67f6f976959f8a1338ea3c7ee..9db57b9d93d66a1923c42f2dff8aa0d49e88d60a 100644 (file)
@@ -978,7 +978,13 @@ bool OSDMonitor::prepare_failure(MOSDFailure *m)
                      << 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);
index ef5ba77462b13d244e1e24fc71fb5e024e245658..5af3d0cb0574169d44d35abb3b732d8d5e447ab6 100644 (file)
@@ -45,6 +45,10 @@ struct failure_reporter_t {
 
   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