From e5457dfbe21c79c1aeddcae8d8d013898343bb93 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 23 Jan 2014 17:12:47 +0800 Subject: [PATCH] mds: open sessions for rejoin imported caps Signed-off-by: Yan, Zheng --- src/mds/MDCache.cc | 63 +++++++++++++++++++++++++++++++--- src/mds/MDCache.h | 4 +++ src/messages/MMDSCacheRejoin.h | 3 ++ 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index fa860e868917d..c8641e4f69f2e 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -56,6 +56,7 @@ #include "events/EImportFinish.h" #include "events/EFragment.h" #include "events/ECommitted.h" +#include "events/ESessions.h" #include "messages/MGenericMessage.h" @@ -3613,11 +3614,24 @@ void MDCache::rejoin_send_rejoins() } if (mds->is_rejoin()) { + map > client_exports; for (map >::iterator p = cap_exports.begin(); p != cap_exports.end(); ++p) { assert(cap_export_targets.count(p->first)); - rejoins[cap_export_targets[p->first]]->cap_exports[p->first] = p->second; + int target = cap_export_targets[p->first]; + rejoins[target]->cap_exports[p->first] = p->second; + for (map::iterator q = p->second.begin(); + q != p->second.end(); + ++q) + client_exports[q->first].insert(target); + } + for (map >::iterator p = client_exports.begin(); + p != client_exports.end(); + ++p) { + entity_inst_t inst = mds->sessionmap.get_inst(entity_name_t::CLIENT(p->first.v)); + for (set::iterator q = p->second.begin(); q != p->second.end(); ++q) + rejoins[*q]->client_map[p->first] = inst; } } @@ -3970,6 +3984,8 @@ void MDCache::handle_cache_rejoin_weak(MMDSCacheRejoin *weak) assert(gather_locks.empty()); // check cap exports. + rejoin_client_map.insert(weak->client_map.begin(), weak->client_map.end()); + for (map >::iterator p = weak->cap_exports.begin(); p != weak->cap_exports.end(); ++p) { @@ -5099,11 +5115,34 @@ void MDCache::rejoin_open_ino_finish(inodeno_t ino, int ret) cap_imports_num_opening--; if (cap_imports_num_opening == 0) { - if (rejoin_gather.count(mds->get_nodeid())) - process_imported_caps(); - else + if (rejoin_gather.empty()) rejoin_gather_finish(); + else if (rejoin_gather.count(mds->get_nodeid())) + process_imported_caps(); + } +} + +class C_MDC_RejoinSessionsOpened : public Context { + MDCache *cache; +public: + map client_map; + map sseqmap; + + C_MDC_RejoinSessionsOpened(MDCache *c, map& cm) : + cache(c), client_map(cm) {} + void finish(int r) { + assert(r == 0); + cache->rejoin_open_sessions_finish(client_map, sseqmap); } +}; + +void MDCache::rejoin_open_sessions_finish(map client_map, + map& sseqmap) +{ + dout(10) << "rejoin_open_sessions_finish" << dendl; + mds->server->finish_force_open_sessions(client_map, sseqmap); + if (rejoin_gather.empty()) + rejoin_gather_finish(); } bool MDCache::process_imported_caps() @@ -5132,6 +5171,22 @@ bool MDCache::process_imported_caps() // called by rejoin_gather_finish() ? if (rejoin_gather.count(mds->get_nodeid()) == 0) { + // if sessions for imported caps are all open ? + for (map::iterator p = rejoin_client_map.begin(); + p != rejoin_client_map.end(); + ++p) { + if (!mds->sessionmap.have_session(entity_name_t::CLIENT(p->first.v))) { + C_MDC_RejoinSessionsOpened *finish = new C_MDC_RejoinSessionsOpened(this, rejoin_client_map); + version_t pv = mds->server->prepare_force_open_sessions(rejoin_client_map, finish->sseqmap); + ESessions *le = new ESessions(pv, rejoin_client_map); + mds->mdlog->start_submit_entry(le, finish); + mds->mdlog->flush(); + rejoin_client_map.clear(); + return true; + } + } + rejoin_client_map.clear(); + // process caps that were exported by slave rename for (map > >::iterator p = rejoin_slave_exports.begin(); p != rejoin_slave_exports.end(); diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 750c6b18813b2..b3c5ad5535870 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -413,6 +413,7 @@ protected: set rejoin_ack_gather; // nodes from whom i need a rejoin ack map > > rejoin_imported_caps; map > > rejoin_slave_exports; + map rejoin_client_map; map > cap_exports; // ino -> client -> capex map cap_export_targets; // ino -> auth mds @@ -490,7 +491,10 @@ public: } friend class C_MDC_RejoinOpenInoFinish; + friend class C_MDC_RejoinSessionsOpened; void rejoin_open_ino_finish(inodeno_t ino, int ret); + void rejoin_open_sessions_finish(map client_map, + map& sseqmap); bool process_imported_caps(); void choose_lock_states_and_reconnect_caps(); void prepare_realm_split(SnapRealm *realm, client_t client, inodeno_t ino, diff --git a/src/messages/MMDSCacheRejoin.h b/src/messages/MMDSCacheRejoin.h index 9cbee3a7bf6c7..bbafe64a35a7e 100644 --- a/src/messages/MMDSCacheRejoin.h +++ b/src/messages/MMDSCacheRejoin.h @@ -168,6 +168,7 @@ class MMDSCacheRejoin : public Message { // open map > cap_exports; + map client_map; bufferlist imported_caps; // full @@ -298,6 +299,7 @@ public: ::encode(xlocked_inodes, payload); ::encode(wrlocked_inodes, payload); ::encode(cap_exports, payload); + ::encode(client_map, payload); ::encode(imported_caps, payload); ::encode(strong_dirfrags, payload); ::encode(dirfrag_bases, payload); @@ -320,6 +322,7 @@ public: ::decode(xlocked_inodes, p); ::decode(wrlocked_inodes, p); ::decode(cap_exports, p); + ::decode(client_map, p); ::decode(imported_caps, p); ::decode(strong_dirfrags, p); ::decode(dirfrag_bases, p); -- 2.39.5