]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
wherever: guard handle_conf_change() from concurrent execution
authorVenky Shankar <vshankar@redhat.com>
Thu, 26 Jul 2018 03:17:03 +0000 (23:17 -0400)
committerVenky Shankar <vshankar@redhat.com>
Thu, 13 Dec 2018 16:32:41 +0000 (11:32 -0500)
Fixes: http://tracker.ceph.com/issues/24823
Signed-off-by: Venky Shankar <vshankar@redhat.com>
src/common/ceph_context.cc
src/mds/MDSDaemon.cc
src/mon/Monitor.cc
src/osd/OSD.cc
src/osdc/Objecter.cc

index e432a8ecbe8d864d4e0d2506a2f605b82bef90d2..b0b1f412ca66a68b99e41050394302e93fbb57bf 100644 (file)
@@ -91,7 +91,8 @@ namespace {
 
 class LockdepObs : public md_config_obs_t {
 public:
-  explicit LockdepObs(CephContext *cct) : m_cct(cct), m_registered(false) {
+  explicit LockdepObs(CephContext *cct)
+    : m_cct(cct), m_registered(false), lock(ceph::make_mutex("lock_dep_obs")) {
   }
   ~LockdepObs() override {
     if (m_registered) {
@@ -106,6 +107,7 @@ public:
 
   void handle_conf_change(const ConfigProxy& conf,
                           const std::set <std::string> &changed) override {
+    std::unique_lock locker(lock);
     if (conf->lockdep && !m_registered) {
       lockdep_register_ceph_context(m_cct);
       m_registered = true;
@@ -117,14 +119,17 @@ public:
 private:
   CephContext *m_cct;
   bool m_registered;
+  ceph::mutex lock;
 };
 
 class MempoolObs : public md_config_obs_t,
                  public AdminSocketHook {
   CephContext *cct;
+  ceph::mutex lock;
 
 public:
-  explicit MempoolObs(CephContext *cct) : cct(cct) {
+  explicit MempoolObs(CephContext *cct)
+    : cct(cct), lock(ceph::make_mutex("mem_pool_obs")) {
     cct->_conf.add_observer(this);
     int r = cct->get_admin_socket()->register_command(
       "dump_mempools",
@@ -149,6 +154,7 @@ public:
 
   void handle_conf_change(const ConfigProxy& conf,
                           const std::set <std::string> &changed) override {
+    std::unique_lock locker(lock);
     if (changed.count("mempool_debug")) {
       mempool::set_debug_mode(cct->_conf->mempool_debug);
     }
@@ -240,9 +246,12 @@ private:
  */
 class LogObs : public md_config_obs_t {
   ceph::logging::Log *log;
+  ceph::mutex lock;
 
 public:
-  explicit LogObs(ceph::logging::Log *l) : log(l) {}
+  explicit LogObs(ceph::logging::Log *l)
+    : log(l), lock(ceph::make_mutex("log_obs")) {
+  }
 
   const char** get_tracked_conf_keys() const override {
     static const char *KEYS[] = {
@@ -268,6 +277,7 @@ public:
 
   void handle_conf_change(const ConfigProxy& conf,
                           const std::set <std::string> &changed) override {
+    std::unique_lock locker(lock);
     // stderr
     if (changed.count("log_to_stderr") || changed.count("err_to_stderr")) {
       int l = conf->log_to_stderr ? 99 : (conf->err_to_stderr ? -1 : -2);
index 64904ddfb7ded54221d6bf02059a2903f0cd3bfd..6fbe913043e956c6c50e66057f8a91fa9f9c9201 100644 (file)
@@ -1048,8 +1048,11 @@ void MDSDaemon::suicide()
 
   //because add_observer is called after set_up_admin_socket
   //so we can use asok_hook to avoid assert in the remove_observer
-  if (asok_hook != NULL)
+  if (asok_hook != NULL) {
+    mds_lock.Unlock();
     g_conf().remove_observer(this);
+    mds_lock.Lock();
+  }
 
   clean_up_admin_socket();
 
index 98dd216bfa160612ad89eab108d5c3bc16426953..2ba52ee55c773e6009b33230b87d23e6ed594ad5 100644 (file)
@@ -941,7 +941,9 @@ void Monitor::shutdown()
 
   state = STATE_SHUTDOWN;
 
+  lock.Unlock();
   g_conf().remove_observer(this);
+  lock.Lock();
 
   if (admin_hook) {
     cct->get_admin_socket()->unregister_commands(admin_hook);
index c172fef223eee60c1c5ccf45e7d4dc5fa91acdea..47d4baf4236806631f8749cd28422abe61f2264e 100644 (file)
@@ -3650,7 +3650,10 @@ int OSD::shutdown()
 #ifdef PG_DEBUG_REFS
   service.dump_live_pgids();
 #endif
+
+  osd_lock.Unlock();
   cct->_conf.remove_observer(this);
+  osd_lock.Lock();
 
   service.meta_ch.reset();
 
@@ -9515,6 +9518,7 @@ const char** OSD::get_tracked_conf_keys() const
 void OSD::handle_conf_change(const ConfigProxy& conf,
                             const std::set <std::string> &changed)
 {
+  Mutex::Locker l(osd_lock);
   if (changed.count("osd_max_backfills")) {
     service.local_reserver.set_max(cct->_conf->osd_max_backfills);
     service.remote_reserver.set_max(cct->_conf->osd_max_backfills);
index c7b043b5e58b333eb7861d632ede60119a3455e1..cb5b82a091c8d46035b0cd3719e3e9028737582d 100644 (file)
@@ -404,7 +404,9 @@ void Objecter::shutdown()
 
   initialized = false;
 
+  wl.unlock();
   cct->_conf.remove_observer(this);
+  wl.lock();
 
   map<int,OSDSession*>::iterator p;
   while (!osd_sessions.empty()) {