From: John Spray Date: Mon, 29 Jun 2015 10:58:07 +0000 (+0100) Subject: mds: replace MDS::*_done calls with contexts X-Git-Tag: v9.0.3~44^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d58d7b59a9abac7228e542f0faf6b7d8a3adb05d;p=ceph.git mds: replace MDS::*_done calls with contexts 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 --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index f2f1e0d6eb7f..0af4c5db9511 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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; } } diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 48c0d412cd18..78e97154e114 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -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, diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index 538f36c3eca5..681ea9187cac 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -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() { diff --git a/src/mds/MDS.h b/src/mds/MDS.h index aa35f62f861d..3788ce4c6eb4 100644 --- a/src/mds/MDS.h +++ b/src/mds/MDS.h @@ -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); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 5e472e1663c9..5fbb5969109f 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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() diff --git a/src/mds/Server.h b/src/mds/Server.h index d5b9066da7fe..3b575ea29859 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -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();