]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: combine MDCache::{reconnected_caps,cap_imports_dirty}
authorYan, Zheng <zyan@redhat.com>
Wed, 29 Jun 2016 03:25:12 +0000 (11:25 +0800)
committerYan, Zheng <zyan@redhat.com>
Wed, 20 Jul 2016 02:35:40 +0000 (10:35 +0800)
Signed-off-by: Yan, Zheng <zyan@redhat.com>
(cherry picked from commit 57067e032e84bbdb69c499aa7ea93ca68082569b)

src/mds/Locker.cc
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/Server.cc

index bd010227d677299ab963931dac6642bad01c0fac..10fff9848c997013c4099b7ffe98af939854646c 100644 (file)
@@ -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;
index c0fe0d8d2893890bfa614307d52e8ab0b422e37c..65d7480ef2a785e6f7631aabe25c954539b4dd70 100644 (file)
@@ -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<inodeno_t, int>::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<inodeno_t, int>::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) {
index d126a1507d59713d883be1da72b5be26ab1d7989..84229b8de314c06d8ed4b9499f36c047fee13867 100644 (file)
@@ -494,7 +494,6 @@ protected:
   map<inodeno_t,mds_rank_t> cap_export_targets; // ino -> auth mds
 
   map<inodeno_t,map<client_t,map<mds_rank_t,cap_reconnect_t> > > cap_imports;  // ino -> client -> frommds -> capex
-  map<inodeno_t,int> cap_imports_dirty;
   set<inodeno_t> cap_imports_missing;
   map<inodeno_t, list<MDSInternalContextBase*> > 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<CInode*,map<client_t, reconnected_cap_info_t> >  reconnected_caps;   // inode -> client -> snap_follows,realmino
+  map<inodeno_t,map<client_t, reconnected_cap_info_t> >  reconnected_caps;   // inode -> client -> snap_follows,realmino
   map<inodeno_t,map<client_t, snapid_t> > 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;
   }
index 6fe258ce9193e7da034c54e230e5b8f8944ac553..1e13581084a0869d4b81f288a1fb33241b2315c5 100644 (file)
@@ -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;
     }