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: v12.2.11~17^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=950323c44eb10d7467c0e69f502735fe11f02556;p=ceph.git wherever: guard handle_conf_change() from concurrent execution Signed-off-by: Venky Shankar (cherry picked from commit aad318abc9a680d68aab96b051fb7457c8f7feac) Conflicts: src/common/ceph_context.cc src/mds/MDSDaemon.cc src/mon/Monitor.cc src/osd/OSD.cc src/osdc/Objecter.cc fix conflicts in the form of using `Mutex` in place of `ceph::mutex` (w/ the appropriate locking/waiting/signalling semantics). --- diff --git a/src/common/ceph_context.cc b/src/common/ceph_context.cc index 0afdc3ac66cd..87194f7dd537 100644 --- a/src/common/ceph_context.cc +++ b/src/common/ceph_context.cc @@ -34,7 +34,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("lock_dep_obs", false, true) { } ~LockdepObs() override { if (m_registered) { @@ -49,6 +50,7 @@ public: void handle_conf_change(const md_config_t *conf, const std::set &changed) override { + Mutex::Locker locker(lock); if (conf->lockdep && !m_registered) { lockdep_register_ceph_context(m_cct); m_registered = true; @@ -60,14 +62,17 @@ public: private: CephContext *m_cct; bool m_registered; + Mutex lock; }; class MempoolObs : public md_config_obs_t, public AdminSocketHook { CephContext *cct; + Mutex lock; public: - explicit MempoolObs(CephContext *cct) : cct(cct) { + explicit MempoolObs(CephContext *cct) + : cct(cct), lock("mem_pool_obs", false, true) { cct->_conf->add_observer(this); int r = cct->get_admin_socket()->register_command( "dump_mempools", @@ -92,6 +97,7 @@ public: void handle_conf_change(const md_config_t *conf, const std::set &changed) override { + Mutex::Locker locker(lock); if (changed.count("mempool_debug")) { mempool::set_debug_mode(cct->_conf->mempool_debug); } @@ -184,9 +190,12 @@ private: */ class LogObs : public md_config_obs_t { ceph::logging::Log *log; + Mutex lock; public: - explicit LogObs(ceph::logging::Log *l) : log(l) {} + explicit LogObs(ceph::logging::Log *l) + : log(l), lock("log_obs", false, true) { + } const char** get_tracked_conf_keys() const override { static const char *KEYS[] = { @@ -211,6 +220,7 @@ public: void handle_conf_change(const md_config_t *conf, const std::set &changed) override { + Mutex::Locker 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 c444c5e533f2..57de906310f8 100644 --- a/src/mds/MDSDaemon.cc +++ b/src/mds/MDSDaemon.cc @@ -1063,8 +1063,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 9960dea46df4..26b667c9069f 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -889,7 +889,9 @@ void Monitor::shutdown() state = STATE_SHUTDOWN; + lock.Unlock(); g_conf->remove_observer(this); + lock.Lock(); if (admin_hook) { AdminSocket* admin_socket = cct->get_admin_socket(); diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index e555f4091368..31a821517cdc 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -3507,7 +3507,10 @@ int OSD::shutdown() #ifdef PG_DEBUG_REFS service.dump_live_pgids(); #endif + + osd_lock.Unlock(); cct->_conf->remove_observer(this); + osd_lock.Lock(); dout(10) << "syncing store" << dendl; enable_disable_fuse(true); @@ -9979,6 +9982,7 @@ const char** OSD::get_tracked_conf_keys() const void OSD::handle_conf_change(const struct md_config_t *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 df8bc236a3dc..311a2dc1676a 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -413,7 +413,9 @@ void Objecter::shutdown() initialized = false; + wl.unlock(); cct->_conf->remove_observer(this); + wl.lock(); map::iterator p; while (!osd_sessions.empty()) {