From bace1c8c7ce7d29676b9ed6925cdee41af8a8425 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 29 Jun 2016 11:25:12 +0800 Subject: [PATCH] mds: combine MDCache::{reconnected_caps,cap_imports_dirty} Signed-off-by: Yan, Zheng (cherry picked from commit 57067e032e84bbdb69c499aa7ea93ca68082569b) --- src/mds/Locker.cc | 2 +- src/mds/MDCache.cc | 24 ++++++++++++++---------- src/mds/MDCache.h | 18 ++++++++++-------- src/mds/Server.cc | 2 +- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index bd010227d6772..10fff9848c997 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -2470,7 +2470,7 @@ void Locker::handle_client_caps(MClientCaps *m) if (mds->is_reconnect() && m->get_dirty() && m->get_client_tid() > 0 && !session->have_completed_flush(m->get_client_tid())) { - mdcache->set_reconnect_dirty_caps(m->get_ino(), m->get_dirty()); + mdcache->set_reconnected_dirty_caps(client, m->get_ino(), m->get_dirty()); } mds->wait_for_replay(new C_MDS_RetryMessage(mds, m)); return; diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index c0fe0d8d28938..65d7480ef2a78 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -5322,7 +5322,7 @@ bool MDCache::process_imported_caps() assert(session); for (auto r = q->second.begin(); r != q->second.end(); ++r) { Capability *cap = in->reconnect_cap(q->first, r->second, session); - add_reconnected_cap(in, q->first, r->second); + add_reconnected_cap(q->first, in->ino(), r->second); if (r->first >= 0) { if (cap->get_last_seq() == 0) // don't increase mseq if cap already exists cap->inc_mseq(); @@ -5424,10 +5424,13 @@ void MDCache::choose_lock_states_and_reconnect_caps() if (in->is_auth() && !in->is_base() && in->inode.is_dirty_rstat()) in->mark_dirty_rstat(); + auto p = reconnected_caps.find(in->ino()); + int dirty_caps = 0; - map::iterator it = cap_imports_dirty.find(in->ino()); - if (it != cap_imports_dirty.end()) - dirty_caps = it->second; + if (p != reconnected_caps.end()) { + for (const auto &it : p->second) + dirty_caps |= it.second.dirty_caps; + } in->choose_lock_states(dirty_caps); dout(15) << " chose lock states on " << *in << dendl; @@ -5435,7 +5438,6 @@ void MDCache::choose_lock_states_and_reconnect_caps() check_realm_past_parents(realm); - auto p = reconnected_caps.find(in); if (p != reconnected_caps.end()) { bool missing_snap_parent = false; // also, make sure client's cap is in the correct snaprealm. @@ -5589,7 +5591,6 @@ void MDCache::export_remaining_imported_caps() mds->queue_waiters(p->second); cap_imports.clear(); - cap_imports_dirty.clear(); cap_reconnect_waiters.clear(); if (warn_str.peek() != EOF) { @@ -5614,9 +5615,12 @@ void MDCache::try_reconnect_cap(CInode *in, Session *session) mds->locker->try_eval(in, CEPH_CAP_LOCKS); } else { int dirty_caps = 0; - map::iterator it = cap_imports_dirty.find(in->ino()); - if (it != cap_imports_dirty.end()) - dirty_caps = it->second; + auto p = reconnected_caps.find(in->ino()); + if (p != reconnected_caps.end()) { + auto q = p->second.find(client); + if (q != p->second.end()) + dirty_caps = q->second.dirty_caps; + } in->choose_lock_states(dirty_caps); dout(15) << " chose lock states on " << *in << dendl; } @@ -5697,7 +5701,7 @@ void MDCache::open_snap_parents() dout(10) << " past parents now open on " << *in << dendl; for (CInode *child : p->second) { - auto q = reconnected_caps.find(child); + auto q = reconnected_caps.find(child->ino()); assert(q != reconnected_caps.end()); for (auto r = q->second.begin(); r != q->second.end(); ++r) { if (r->second.snap_follows > 0 && r->second.snap_follows < in->first - 1) { diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index d126a1507d597..84229b8de314c 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -494,7 +494,6 @@ protected: map cap_export_targets; // ino -> auth mds map > > cap_imports; // ino -> client -> frommds -> capex - map cap_imports_dirty; set cap_imports_missing; map > cap_reconnect_waiters; int cap_imports_num_opening; @@ -552,9 +551,6 @@ public: assert(cap_imports[ino][client].size() == 1); cap_imports.erase(ino); } - void set_reconnect_dirty_caps(inodeno_t ino, int dirty) { - cap_imports_dirty[ino] |= dirty; - } void wait_replay_cap_reconnect(inodeno_t ino, MDSInternalContextBase *c) { cap_reconnect_waiters[ino].push_back(c); } @@ -563,16 +559,22 @@ public: struct reconnected_cap_info_t { inodeno_t realm_ino; snapid_t snap_follows; - reconnected_cap_info_t() : realm_ino(0), snap_follows(0) {} + int dirty_caps; + reconnected_cap_info_t() : + realm_ino(0), snap_follows(0), dirty_caps(0) {} }; - map > reconnected_caps; // inode -> client -> snap_follows,realmino + map > reconnected_caps; // inode -> client -> snap_follows,realmino map > reconnected_snaprealms; // realmino -> client -> realmseq - void add_reconnected_cap(CInode *in, client_t client, const cap_reconnect_t& icr) { - reconnected_cap_info_t &info = reconnected_caps[in][client]; + void add_reconnected_cap(client_t client, inodeno_t ino, const cap_reconnect_t& icr) { + reconnected_cap_info_t &info = reconnected_caps[ino][client]; info.realm_ino = inodeno_t(icr.capinfo.snaprealm); info.snap_follows = icr.snap_follows; } + void set_reconnected_dirty_caps(client_t client, inodeno_t ino, int dirty) { + reconnected_cap_info_t &info = reconnected_caps[ino][client]; + info.dirty_caps |= dirty; + } void add_reconnected_snaprealm(client_t client, inodeno_t ino, snapid_t seq) { reconnected_snaprealms[ino][client] = seq; } diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 6fe258ce9193e..1e13581084a08 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -810,7 +810,7 @@ void Server::handle_client_reconnect(MClientReconnect *m) dout(15) << "open cap realm " << inodeno_t(p->second.capinfo.snaprealm) << " on " << *in << dendl; in->reconnect_cap(from, p->second, session); - mdcache->add_reconnected_cap(in, from, p->second); + mdcache->add_reconnected_cap(from, p->first, p->second); recover_filelocks(in, p->second.flockbl, m->get_orig_source().num()); continue; } -- 2.39.5