]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgrc: reset send_report timer on session change
authorJohn Spray <john.spray@redhat.com>
Fri, 15 Jul 2016 15:48:32 +0000 (16:48 +0100)
committerJohn Spray <john.spray@redhat.com>
Thu, 29 Sep 2016 16:26:59 +0000 (17:26 +0100)
Signed-off-by: John Spray <john.spray@redhat.com>
src/mgr/MgrClient.cc
src/mgr/MgrClient.h

index 8af29a52222a378c3394aa88377a1cda184d5d7b..715d68307f81e33df2a71a1188a352d64a66461a 100644 (file)
@@ -32,7 +32,8 @@ MgrClient::MgrClient(CephContext *cct_, Messenger *msgr_)
     : Dispatcher(cct_), cct(cct_), msgr(msgr_),
       session(nullptr),
       lock("mgrc"),
-      timer(cct_, lock)
+      timer(cct_, lock),
+      report_callback(nullptr)
 {
   assert(cct != nullptr);
 }
@@ -95,6 +96,10 @@ bool MgrClient::handle_mgr_map(MMgrMap *m)
                     << session->con->get_peer_addr() << dendl;
       delete session;
       session = nullptr;
+      if (report_callback != nullptr) {
+        timer.cancel_event(report_callback);
+        report_callback = nullptr;
+      }
 
       std::vector<ceph_tid_t> erase_cmds;
       auto commands = command_table.get_commands();
@@ -166,6 +171,7 @@ void MgrClient::send_report()
 {
   assert(lock.is_locked_by_me());
   assert(session);
+  report_callback = nullptr;
 
   auto report = new MMgrReport();
   auto pcc = cct->get_perfcounters_collection();
@@ -221,8 +227,8 @@ void MgrClient::send_report()
   session->con->send_message(report);
 
   if (stats_period != 0) {
-    auto c = new C_StdFunction([this](){send_report();});
-    timer.add_event_after(stats_period, c);
+    report_callback = new C_StdFunction([this](){send_report();});
+    timer.add_event_after(stats_period, report_callback);
   }
 }
 
@@ -230,6 +236,12 @@ bool MgrClient::handle_mgr_configure(MMgrConfigure *m)
 {
   assert(lock.is_locked_by_me());
 
+  if (session == nullptr) {
+    lderr(cct) << "dropping unexpected configure message" << dendl;
+    m->put();
+    return true;
+  }
+
   ldout(cct, 4) << "stats_period=" << m->stats_period << dendl;
 
   bool starting = (stats_period == 0) && (m->stats_period != 0);
index 92775d62e3b1a833e7ab054a7ea47044555d058b..20a3cc8c02d73d0a529524322d62de0dd55b976f 100644 (file)
@@ -65,6 +65,7 @@ protected:
   void signal_cond_list(list<Cond*>& ls);
 
   list<Cond*> waiting_for_session;
+  Context *report_callback;
 
 public:
   MgrClient(CephContext *cct_, Messenger *msgr_);