]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mon: take the mon lock in handle_conf_change
authorhuangjun <huangjun@xsky.com>
Fri, 21 Jun 2019 14:09:39 +0000 (22:09 +0800)
committerhuangjun <huangjun@xsky.com>
Fri, 21 Jun 2019 14:09:39 +0000 (22:09 +0800)
Let the finisher thread to do the job, it can hold the mon lock
and not hold the config::lock, so can avoid dead lock with mon::tick thread.

Fixes: http://tracker.ceph.com/issues/39625
Signed-off-by: huangjun <huangjun@xsky.com>
src/mon/Monitor.cc

index 3c06dc2610b99b00b914a2a55db792a8079500da..c2d62ed94aa4ee0d39ed88f3a5d8202a1055dd5f 100644 (file)
@@ -550,11 +550,19 @@ void Monitor::handle_conf_change(const ConfigProxy& conf,
   if (changed.count("mon_health_to_clog") ||
       changed.count("mon_health_to_clog_interval") ||
       changed.count("mon_health_to_clog_tick_interval")) {
-    health_to_clog_update_conf(changed);
+    std::set<std::string> c2(changed);
+    finisher.queue(new C_MonContext(this, [this, c2](int) {
+      Mutex::Locker l(lock);
+      health_to_clog_update_conf(c2);
+    }));
   }
 
   if (changed.count("mon_scrub_interval")) {
-    scrub_update_interval(conf->mon_scrub_interval);
+    int scrub_interval = conf->mon_scrub_interval;
+    finisher.queue(new C_MonContext(this, [this, scrub_interval](int) {
+      Mutex::Locker l(lock);
+      scrub_update_interval(scrub_interval);
+    }));
   }
 }