]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: don't hold lock in dispatch()
authorYehuda Sadeh <yehuda@inktank.com>
Thu, 6 Mar 2014 19:24:18 +0000 (11:24 -0800)
committerJohn Spray <john.spray@redhat.com>
Mon, 25 Aug 2014 00:33:43 +0000 (01:33 +0100)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/librados/RadosClient.cc

index 3d7f20829414f2c300b0446f1d1a2da4bc51397b..83f5bbef01cb39e0a6c3fa292e5481e51e6d3655 100644 (file)
@@ -349,7 +349,6 @@ int librados::RadosClient::create_ioctx(const char *name, IoCtxImpl **io)
 
 bool librados::RadosClient::ms_dispatch(Message *m)
 {
-  Mutex::Locker l(lock);
   bool ret;
 
   if (state == DISCONNECTED) {
@@ -364,20 +363,17 @@ bool librados::RadosClient::ms_dispatch(Message *m)
 
 void librados::RadosClient::ms_handle_connect(Connection *con)
 {
-  Mutex::Locker l(lock);
   objecter->ms_handle_connect(con);
 }
 
 bool librados::RadosClient::ms_handle_reset(Connection *con)
 {
-  Mutex::Locker l(lock);
   objecter->ms_handle_reset(con);
   return false;
 }
 
 void librados::RadosClient::ms_handle_remote_reset(Connection *con)
 {
-  Mutex::Locker l(lock);
   objecter->ms_handle_remote_reset(con);
 }
 
@@ -391,10 +387,12 @@ bool librados::RadosClient::_dispatch(Message *m)
     break;
   case CEPH_MSG_OSD_MAP:
     objecter->handle_osd_map(static_cast<MOSDMap*>(m));
+    lock.Lock();
     pool_cache_rwl.get_write();
     osdmap_epoch = osdmap.get_epoch();
     pool_cache_rwl.unlock();
     cond.Signal();
+    lock.Unlock();
     break;
   case MSG_GETPOOLSTATSREPLY:
     objecter->handle_get_pool_stats_reply(static_cast<MGetPoolStatsReply*>(m));
@@ -693,7 +691,7 @@ public:
 
 void librados::RadosClient::watch_notify(MWatchNotify *m)
 {
-  assert(lock.is_locked());
+  Mutex::Locker l(lock);
   map<uint64_t, WatchContext *>::iterator iter = watchers.find(m->cookie);
   if (iter != watchers.end()) {
     WatchContext *wc = iter->second;
@@ -853,6 +851,7 @@ int librados::RadosClient::monitor_log(const string& level, rados_log_callback_t
 
 void librados::RadosClient::handle_log(MLog *m)
 {
+  Mutex::Locker l(lock);
   ldout(cct, 10) << __func__ << " version " << m->version << dendl;
 
   if (log_last_version < m->version) {