]> git.apps.os.sepia.ceph.com Git - ceph.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>
Tue, 8 Jan 2019 08:45:04 +0000 (03:45 -0500)
Signed-off-by: Venky Shankar <vshankar@redhat.com>
(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).

src/common/ceph_context.cc
src/mds/MDSDaemon.cc
src/mon/Monitor.cc
src/osd/OSD.cc
src/osdc/Objecter.cc

index 0afdc3ac66cd83c552ba7d3300e3dcaea932fc36..87194f7dd5370099b4ed8fee4f73e85cec8b820b 100644 (file)
@@ -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 <std::string> &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 <std::string> &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 <std::string> &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);
index c444c5e533f20d71f1b70d54aa6349c1430315f7..57de906310f8bbc952d33bfdea9b1e6100cc08ce 100644 (file)
@@ -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();
 
index 9960dea46df40bde7c435f015618bb92988983cc..26b667c9069f7b3ff7f009801a66ac2cb380f39d 100644 (file)
@@ -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();
index e555f4091368aa1c38d348217f371b7ad3c4046a..31a821517cdc735e8f27856cb1ba309b83a79791 100644 (file)
@@ -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 <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 df8bc236a3dc8ade44168de01e8ed8e6dda54f46..311a2dc1676a39fb6ea7ba3711399695db2bfe20 100644 (file)
@@ -413,7 +413,9 @@ void Objecter::shutdown()
 
   initialized = false;
 
+  wl.unlock();
   cct->_conf->remove_observer(this);
+  wl.lock();
 
   map<int,OSDSession*>::iterator p;
   while (!osd_sessions.empty()) {