]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/Mgr: use cond (not context) for FSMap wait
authorSage Weil <sage@redhat.com>
Tue, 4 Apr 2017 18:27:41 +0000 (14:27 -0400)
committerSage Weil <sage@redhat.com>
Tue, 4 Apr 2017 18:27:41 +0000 (14:27 -0400)
This is simpler.

Signed-off-by: Sage Weil <sage@redhat.com>
src/mgr/ClusterState.h
src/mgr/Mgr.cc
src/mgr/Mgr.h

index 039da14e8dc7e45ee7f90cecbe625b2e0871d16f..4fee3a0131b85186d5320afd74fb337e0b7fc84e 100644 (file)
@@ -71,6 +71,11 @@ public:
 
   void notify_osdmap(const OSDMap &osd_map);
 
+  bool have_fsmap() {
+    Mutex::Locker l(lock);
+    return fsmap.get_epoch() > 0;
+  }
+
   template<typename Callback, typename...Args>
   void with_fsmap(Callback&& cb, Args&&...args)
   {
index 0492ceff571b82167ebfc5ffcca8733d1125cb49..a0e908eecf691a44632395c8fa549a51f9ad38bb 100644 (file)
@@ -46,7 +46,6 @@ Mgr::Mgr(MonClient *monc_, Messenger *clientm_, Objecter *objecter_,
   lock("Mgr::lock"),
   timer(g_ceph_context, lock),
   finisher(g_ceph_context, "Mgr", "mgr-fin"),
-  waiting_for_fs_map(NULL),
   py_modules(daemon_state, cluster_state, *monc, finisher),
   cluster_state(monc, nullptr),
   server(monc, daemon_state, cluster_state, py_modules, clog_, audit_clog_),
@@ -59,7 +58,6 @@ Mgr::Mgr(MonClient *monc_, Messenger *clientm_, Objecter *objecter_,
 
 Mgr::~Mgr()
 {
-  assert(waiting_for_fs_map == nullptr);
 }
 
 
@@ -186,19 +184,14 @@ void Mgr::init()
   monc->sub_want("mgrdigest", 0, 0);
 
   // Prepare to receive FSMap and request it
-  dout(4) << "requesting FSMap..." << dendl;
-  C_SaferCond cond;
-  waiting_for_fs_map = &cond;
   monc->sub_want("fsmap", 0, 0);
   monc->renew_subs();
 
   // Wait for FSMap
   dout(4) << "waiting for FSMap..." << dendl;
-  lock.Unlock();
-  cond.wait();
-  lock.Lock();
-  waiting_for_fs_map = nullptr;
-  dout(4) << "Got FSMap." << dendl;
+  while (!cluster_state.have_fsmap()) {
+    fs_map_cond.Wait(lock);
+  }
 
 
   // Wait for MgrDigest...?
@@ -486,10 +479,7 @@ void Mgr::handle_fs_map(MFSMap* m)
 
   const FSMap &new_fsmap = m->get_fsmap();
 
-  if (waiting_for_fs_map) {
-    waiting_for_fs_map->complete(0);
-    waiting_for_fs_map = NULL;
-  }
+  fs_map_cond.Signal();
 
   // TODO: callers (e.g. from python land) are potentially going to see
   // the new fsmap before we've bothered populating all the resulting
index c83144dfa4a2bd449728c34d4791e3c53140a1b1..652fff94f61fa1b5f81b9d520dc22a5d572454db 100644 (file)
@@ -54,7 +54,7 @@ protected:
   SafeTimer timer;
   Finisher finisher;
 
-  Context *waiting_for_fs_map;
+  Cond fs_map_cond;
 
   PyModules py_modules;
   DaemonStateIndex daemon_state;