]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/MgrClient: guard send_pgstats() with lock 20909/head
authorKefu Chai <kchai@redhat.com>
Thu, 15 Mar 2018 05:30:34 +0000 (13:30 +0800)
committerKefu Chai <kchai@redhat.com>
Thu, 15 Mar 2018 05:33:56 +0000 (13:33 +0800)
ms_handle_reset() races with send_pgstats(), and the latter could
reference a session with a null connection. so we need to guard
send_pgstats() with a lock.

Fixes: http://tracker.ceph.com/issues/23370
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/mgr/MgrClient.cc
src/mgr/MgrClient.h

index 25b0eea2cc8c4ca9affedea2e5fb8ae9832ea5ec..372adaaf2df7f4348f42cf6d1a01053f9f4ab9de 100644 (file)
@@ -218,20 +218,20 @@ bool MgrClient::ms_handle_refused(Connection *con)
   return false;
 }
 
-void MgrClient::send_stats()
+void MgrClient::_send_stats()
 {
-  send_report();
-  send_pgstats();
+  _send_report();
+  _send_pgstats();
   if (stats_period != 0) {
     report_callback = timer.add_event_after(
       stats_period,
       new FunctionContext([this](int) {
-         send_stats();
+         _send_stats();
        }));
   }
 }
 
-void MgrClient::send_report()
+void MgrClient::_send_report()
 {
   assert(lock.is_locked_by_me());
   assert(session);
@@ -338,6 +338,12 @@ void MgrClient::send_report()
 }
 
 void MgrClient::send_pgstats()
+{
+  Mutex::Locker l(lock);
+  _send_pgstats();
+}
+
+void MgrClient::_send_pgstats()
 {
   if (pgstats_cb && session) {
     session->con->send_message(pgstats_cb());
@@ -366,7 +372,7 @@ bool MgrClient::handle_mgr_configure(MMgrConfigure *m)
   bool starting = (stats_period == 0) && (m->stats_period != 0);
   stats_period = m->stats_period;
   if (starting) {
-    send_stats();
+    _send_stats();
   }
 
   m->put();
index 0f4d3c32e69f9a817e9688fc9b5d735ae0cf40a9..09d90851bb46363c30efda55afce1606ecf81405 100644 (file)
@@ -123,8 +123,9 @@ public:
   void update_osd_health(std::vector<OSDHealthMetric>&& metrics);
 
 private:
-  void send_stats();
-  void send_report();
+  void _send_stats();
+  void _send_pgstats();
+  void _send_report();
 };
 
 #endif