]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: rejoin dirfrags explicitly
authorSage Weil <sage@newdream.net>
Fri, 18 Mar 2011 21:38:08 +0000 (14:38 -0700)
committerSage Weil <sage.weil@dreamhost.com>
Fri, 1 Apr 2011 21:34:32 +0000 (14:34 -0700)
We need to rejoin dirfrag replicas explicitly.  We were doing only dentries,
but that won't necessarily include every dirfrag.

Signed-off-by: Sage Weil <sage@newdream.net>
src/mds/MDCache.cc
src/messages/MMDSCacheRejoin.h

index bc1a1a6519963e50bc8a43952ca03242f645f384..f263ed5ca052ebbca5b3f7fdb02070537b5e1a14 100644 (file)
@@ -3227,6 +3227,7 @@ void MDCache::rejoin_walk(CDir *dir, MMDSCacheRejoin *rejoin)
   
   if (mds->is_rejoin()) {
     // WEAK
+    rejoin->add_weak_dirfrag(dir->dirfrag());
     for (CDir::map_t::iterator p = dir->items.begin();
         p != dir->items.end();
         ++p) {
@@ -3366,7 +3367,8 @@ void MDCache::handle_cache_rejoin_weak(MMDSCacheRejoin *weak)
         p != weak->cap_exports.end();
         ++p) {
       CInode *in = get_inode(p->first);
-      if (in && !in->is_auth()) continue;
+      if (in && !in->is_auth())
+       continue;
       filepath& path = weak->cap_export_paths[p->first];
       if (!in) {
        if (!path_is_mine(path))
@@ -3404,6 +3406,30 @@ void MDCache::handle_cache_rejoin_weak(MMDSCacheRejoin *weak)
   
   // walk weak map
   set<CDir*> dirs_to_share;
+  for (set<dirfrag_t>::iterator p = weak->weak_dirfrags.begin();
+       p != weak->weak_dirfrags.end();
+       ++p) {
+    CInode *diri = get_inode(p->ino);
+    if (!diri)
+      dout(0) << " missing dir ino " << p->ino << dendl;
+    assert(diri);
+    
+    frag_t fg = diri->dirfragtree[p->frag.value()];
+    CDir *dir = diri->get_dirfrag(fg);
+    if (!dir)
+      dout(0) << " missing dir for " << p->frag << " (which maps to " << fg << ") on " << *diri << dendl;
+    assert(dir);
+    if (dirs_to_share.count(dir)) {
+      dout(10) << " already have " << p->frag << " -> " << fg << " " << *dir << dendl;
+    } else {
+      dirs_to_share.insert(dir);
+      int nonce = dir->add_replica(from);
+      dout(10) << " have " << p->frag << " -> " << fg << " " << *dir << dendl;
+      if (ack)
+       ack->add_strong_dirfrag(dir->dirfrag(), nonce, dir->dir_rep);
+    }
+  }
+
   for (map<inodeno_t,map<string_snap_t,MMDSCacheRejoin::dn_weak> >::iterator p = weak->weak.begin();
        p != weak->weak.end();
        ++p) {
@@ -3425,13 +3451,7 @@ void MDCache::handle_cache_rejoin_weak(MMDSCacheRejoin *weak)
        if (!dir)
          dout(0) << " missing dir frag " << fg << " on " << *diri << dendl;
        assert(dir);
-       if (dirs_to_share.count(dir) == 0) {
-         dirs_to_share.insert(dir);
-         int nonce = dir->add_replica(from);
-         dout(10) << " have " << *dir << dendl;
-         if (ack)
-           ack->add_strong_dirfrag(dir->dirfrag(), nonce, dir->dir_rep);
-       }
+       assert(dirs_to_share.count(dir));
       }
 
       // and dentry
index cd442c899739fec1d4ceab78fb5871763da27699..6138911d73d3a466d21e7d79d463c611611cca70 100644 (file)
@@ -149,6 +149,7 @@ class MMDSCacheRejoin : public Message {
 
   // weak
   map<inodeno_t, map<string_snap_t, dn_weak> > weak;
+  set<dirfrag_t> weak_dirfrags;
   set<vinodeno_t> weak_inodes;
   map<inodeno_t, lock_bls> inode_scatterlocks;
 
@@ -233,6 +234,9 @@ public:
   }
    
   // dentries
+  void add_weak_dirfrag(dirfrag_t df) {
+    weak_dirfrags.insert(df);
+  }
   void add_weak_dentry(inodeno_t dirino, const string& dname, snapid_t last, dn_weak& dnw) {
     weak[dirino][string_snap_t(dname, last)] = dnw;
   }
@@ -261,6 +265,7 @@ public:
     ::encode(cap_export_bl, payload);
     ::encode(strong_dirfrags, payload);
     ::encode(weak, payload);
+    ::encode(weak_dirfrags, payload);
     ::encode(weak_inodes, payload);
     ::encode(strong_dentries, payload);
     ::encode(authpinned_dentries, payload);
@@ -283,6 +288,7 @@ public:
     }
     ::decode(strong_dirfrags, p);
     ::decode(weak, p);
+    ::decode(weak_dirfrags, p);
     ::decode(weak_inodes, p);
     ::decode(strong_dentries, p);
     ::decode(authpinned_dentries, p);