]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
config: avoid re-entrant locking on observer callback
authorJason Dillaman <dillaman@redhat.com>
Wed, 13 Jan 2016 01:34:41 +0000 (20:34 -0500)
committerJason Dillaman <dillaman@redhat.com>
Wed, 13 Jan 2016 14:54:29 +0000 (09:54 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/common/config.cc

index 4ee54bb59adb9c59ff01bc3dadbf32850817a63f..531bd6c52544d2c4df5c21faa7178431574c0bbe 100644 (file)
@@ -616,17 +616,21 @@ void md_config_t::_apply_changes(std::ostream *oss)
 
 void md_config_t::call_all_observers()
 {
-  Mutex::Locker l(lock);
+  std::map<md_config_obs_t*,std::set<std::string> > obs;
+  {
+    Mutex::Locker l(lock);
 
-  expand_all_meta();
+    expand_all_meta();
 
-  std::map<md_config_obs_t*,std::set<std::string> > obs;
-  for (obs_map_t::iterator r = observers.begin(); r != observers.end(); ++r)
-    obs[r->second].insert(r->first);
+    for (obs_map_t::iterator r = observers.begin(); r != observers.end(); ++r) {
+      obs[r->second].insert(r->first);
+    }
+  }
   for (std::map<md_config_obs_t*,std::set<std::string> >::iterator p = obs.begin();
        p != obs.end();
-       ++p)
+       ++p) {
     p->first->handle_conf_change(this, p->second);
+  }
 }
 
 int md_config_t::injectargs(const std::string& s, std::ostream *oss)