]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: replace MDS::*_done calls with contexts
authorJohn Spray <john.spray@redhat.com>
Mon, 29 Jun 2015 10:58:07 +0000 (11:58 +0100)
committerJohn Spray <john.spray@redhat.com>
Fri, 3 Jul 2015 10:57:45 +0000 (11:57 +0100)
One less part of the MDS interface that's public, and
avoids the subsystems being coupled to the names of these
callback fns.

Signed-off-by: John Spray <john.spray@redhat.com>
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/MDS.cc
src/mds/MDS.h
src/mds/Server.cc
src/mds/Server.h

index f2f1e0d6eb7fcd068ad31766c9b7a70d152e38c1..0af4c5db951149272dcd602acccbbaf9f5043fc3 100644 (file)
@@ -169,6 +169,8 @@ public:
 MDCache::MDCache(MDS *m) :
   logger(0),
   filer(m->objecter, &m->finisher),
+  rejoin_done(NULL),
+  resolve_done(NULL),
   recovery_queue(m),
   stray_manager(m)
 {
@@ -223,6 +225,9 @@ MDCache::~MDCache()
     delete logger;
     logger = 0;
   }
+
+  delete rejoin_done;
+  delete resolve_done;
   //delete renamer;
 }
 
@@ -2645,9 +2650,10 @@ ESubtreeMap *MDCache::create_subtree_map()
 }
 
 
-void MDCache::resolve_start()
+void MDCache::resolve_start(MDSInternalContext *resolve_done_)
 {
   dout(10) << "resolve_start" << dendl;
+  resolve_done = resolve_done_;
 
   if (mds->mdsmap->get_root() != mds->whoami) {
     // if we don't have the root dir, adjust it to UNKNOWN.  during
@@ -3267,7 +3273,8 @@ void MDCache::maybe_resolve_finish()
   if (mds->is_resolve()) {
     trim_unlinked_inodes();
     recalc_auth_bits(false);
-    mds->resolve_done();
+    resolve_done->complete(0);
+    resolve_done = NULL;
   } else {
     maybe_send_pending_rejoins();
   }
@@ -3837,9 +3844,10 @@ void MDCache::recalc_auth_bits(bool replay)
  *   after recovery.
  */
 
-void MDCache::rejoin_start()
+void MDCache::rejoin_start(MDSInternalContext *rejoin_done_)
 {
   dout(10) << "rejoin_start" << dendl;
+  rejoin_done = rejoin_done_;
 
   rejoin_gather = recovery_set;
   // need finish opening cap inodes before sending cache rejoins
@@ -5657,7 +5665,9 @@ void MDCache::open_snap_parents()
     do_delayed_cap_imports();
 
     start_files_to_recover(rejoin_recover_q, rejoin_check_q);
-    mds->rejoin_done();
+    assert(rejoin_done);
+    rejoin_done->complete(0);
+    rejoin_done = NULL;
   }
 }
 
index 48c0d412cd18023fc9a0ca13c7de5e45e3e356e7..78e97154e1148cc693072407eee90fcc4183537e 100644 (file)
@@ -461,7 +461,7 @@ public:
   }
   void cancel_ambiguous_import(CDir *);
   void finish_ambiguous_import(dirfrag_t dirino);
-  void resolve_start();
+  void resolve_start(MDSInternalContext *resolve_done_);
   void send_resolves();
   void send_slave_resolves();
   void send_subtree_resolves();
@@ -520,8 +520,10 @@ protected:
     if (rejoins_pending)
       rejoin_send_rejoins();
   }
+  MDSInternalContext *rejoin_done;
+  MDSInternalContext *resolve_done;
 public:
-  void rejoin_start();
+  void rejoin_start(MDSInternalContext *rejoin_done_);
   void rejoin_gather_finish();
   void rejoin_send_rejoins();
   void rejoin_export_caps(inodeno_t ino, client_t client, ceph_mds_cap_reconnect& capinfo,
index 538f36c3eca560d22dc929849c8eeca54badec64..681ea9187cac9ba84a377a8bdae010947c6a23db 100644 (file)
@@ -2418,6 +2418,29 @@ void MDS::replay_done()
   }
 }
 
+/**
+ * Helper for simple callbacks that call a void fn with no args.
+ */
+class C_VoidFn : public MDSInternalContext
+{
+  typedef void (MDS::*fn_ptr)();
+  protected:
+   MDS *mds_daemon;
+   fn_ptr fn; 
+  public:
+  C_VoidFn(MDS *mds_, fn_ptr fn_)
+    : MDSInternalContext(mds_), mds_daemon(mds_), fn(fn_)
+  {
+    assert(mds_);
+    assert(fn_);
+  }
+
+  void finish(int r)
+  {
+    (mds_daemon->*fn)();
+  }
+};
+
 void MDS::reopen_log()
 {
   dout(1) << "reopen_log" << dendl;
@@ -2431,7 +2454,7 @@ void MDS::resolve_start()
 
   reopen_log();
 
-  mdcache->resolve_start();
+  mdcache->resolve_start(new C_VoidFn(this, &MDS::resolve_done));
   finish_contexts(g_ceph_context, waiting_for_resolve);
 }
 void MDS::resolve_done()
@@ -2447,7 +2470,7 @@ void MDS::reconnect_start()
   if (last_state == MDSMap::STATE_REPLAY)
     reopen_log();
 
-  server->reconnect_clients();
+  server->reconnect_clients(new C_VoidFn(this, &MDS::reconnect_done));
   finish_contexts(g_ceph_context, waiting_for_reconnect);
 }
 void MDS::reconnect_done()
@@ -2464,7 +2487,7 @@ void MDS::rejoin_joint_start()
 void MDS::rejoin_start()
 {
   dout(1) << "rejoin_start" << dendl;
-  mdcache->rejoin_start();
+  mdcache->rejoin_start(new C_VoidFn(this, &MDS::rejoin_done));
 }
 void MDS::rejoin_done()
 {
index aa35f62f861dd24884df00b69abe6913e1b4fe99..3788ce4c6eb4104471aa338edfb9242bdaed4f3e 100644 (file)
@@ -444,6 +444,7 @@ private:
 
   void reopen_log();
 
+ protected:
   void resolve_start();
   void resolve_done();
   void reconnect_start();
@@ -457,6 +458,7 @@ private:
   void active_start();
   void stopping_start();
   void stopping_done();
+ public:
 
   void handle_mds_recovery(mds_rank_t who);
   void handle_mds_failure(mds_rank_t who);
index 5e472e1663c9f86b8380d81c4a273cdb3ae19f9b..5fbb5969109f66d3c930855bcbb738dea3ca6a38 100644 (file)
@@ -674,8 +674,9 @@ void Server::journal_close_session(Session *session, int state, Context *on_safe
   finish_flush_session(session, session->get_push_seq());
 }
 
-void Server::reconnect_clients()
+void Server::reconnect_clients(MDSInternalContext *reconnect_done_)
 {
+  reconnect_done = reconnect_done_;
   mds->sessionmap.get_client_set(client_reconnect_gather);
 
   if (client_reconnect_gather.empty()) {
@@ -810,7 +811,9 @@ void Server::handle_client_reconnect(MClientReconnect *m)
 void Server::reconnect_gather_finish()
 {
   dout(7) << "reconnect_gather_finish.  failed on " << failed_reconnects << " clients" << dendl;
-  mds->reconnect_done();
+  assert(reconnect_done);
+  reconnect_done->complete(0);
+  reconnect_done = NULL;
 }
 
 void Server::reconnect_tick()
index d5b9066da7fe9692786d3e69947df8eeef59e7e4..3b575ea2985992e9e33086995bc6be2db67636ca 100644 (file)
@@ -53,9 +53,11 @@ private:
   // OSDMap full status, used to generate ENOSPC on some operations
   bool is_full;
 
-public:
+  // State for while in reconnect
+  MDSInternalContext *reconnect_done;
   int failed_reconnects;
 
+public:
   bool terminating_sessions;
 
   Server(MDS *m) : 
@@ -64,12 +66,14 @@ public:
     messenger(mds->messenger),
     logger(0),
     is_full(false),
+    reconnect_done(NULL),
     failed_reconnects(0),
     terminating_sessions(false) {
   }
   ~Server() {
     g_ceph_context->get_perfcounters_collection()->remove(logger);
     delete logger;
+    delete reconnect_done;
   }
 
   void create_logger();
@@ -99,7 +103,7 @@ public:
   void find_idle_sessions();
   void kill_session(Session *session, Context *on_safe);
   void journal_close_session(Session *session, int state, Context *on_safe);
-  void reconnect_clients();
+  void reconnect_clients(MDSInternalContext *reconnect_done_);
   void handle_client_reconnect(class MClientReconnect *m);
   //void process_reconnect_cap(CInode *in, int from, ceph_mds_cap_reconnect& capinfo);
   void reconnect_gather_finish();