From: Venky Shankar Date: Thu, 26 Jul 2018 03:17:03 +0000 (-0400) Subject: wherever: guard handle_conf_change() from concurrent execution X-Git-Tag: v14.1.0~554^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=aad318abc9a680d68aab96b051fb7457c8f7feac;p=ceph-ci.git wherever: guard handle_conf_change() from concurrent execution Fixes: http://tracker.ceph.com/issues/24823 Signed-off-by: Venky Shankar --- diff --git a/src/common/ceph_context.cc b/src/common/ceph_context.cc index e432a8ecbe8..b0b1f412ca6 100644 --- a/src/common/ceph_context.cc +++ b/src/common/ceph_context.cc @@ -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 &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 &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 &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); diff --git a/src/mds/MDSDaemon.cc b/src/mds/MDSDaemon.cc index 64904ddfb7d..6fbe913043e 100644 --- a/src/mds/MDSDaemon.cc +++ b/src/mds/MDSDaemon.cc @@ -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(); diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 98dd216bfa1..2ba52ee55c7 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -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); diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index c172fef223e..47d4baf4236 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -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 &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); diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index c7b043b5e58..cb5b82a091c 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -404,7 +404,9 @@ void Objecter::shutdown() initialized = false; + wl.unlock(); cct->_conf.remove_observer(this); + wl.lock(); map::iterator p; while (!osd_sessions.empty()) {