]> git.apps.os.sepia.ceph.com Git - ceph-ci.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>
Fri, 15 Jul 2016 01:11:49 +0000 (09:11 +0800)
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/Locker.cc
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/Server.cc

index ec3d499a6aec96d6c6d8a99cfc945d0204ddd655..966a5f2c12fabba30a90e4f433409f10037f075d 100644 (file)
@@ -2471,7 +2471,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 83ad0ded3f3b599b01aa245105dc14c6d885993d..15a0d7cd7ba6f6ea39f41c17a27faab67908db3d 100644 (file)
@@ -5326,7 +5326,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();
@@ -5428,10 +5428,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;
 
@@ -5439,7 +5442,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.
@@ -5593,7 +5595,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) {
@@ -5618,9 +5619,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;
     }
@@ -5701,7 +5705,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 a6df57dfc287d4fd8a443ebaac5a26d0fa7f835c..bf7708ac46318e06f4fa1abfae0960c6bc08ee62 100644 (file)
@@ -495,7 +495,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;
@@ -553,9 +552,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);
   }
@@ -564,16 +560,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 5db717e0f43e6436271f43c1e4e39c941a72e403..a2dcc97d0f91831d9513b18ff8b49031f1433345 100644 (file)
@@ -818,7 +818,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;
     }