]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: rejoin dirfragtreelock too
authorSage Weil <sage@newdream.net>
Mon, 23 Mar 2009 21:07:58 +0000 (14:07 -0700)
committerSage Weil <sage@newdream.net>
Mon, 23 Mar 2009 21:07:58 +0000 (14:07 -0700)
We need to rejoin _all_ scatterlocks.

src/mds/MDCache.cc
src/messages/MMDSCacheRejoin.h

index ce0c3627868daa19098d823fe9fe79a6bb6bdfd6..caffb149ab6e741a4efecb41be6f675d2f7dfd9e 100644 (file)
@@ -2715,14 +2715,16 @@ void MDCache::rejoin_send_rejoins()
        p->second->add_strong_inode(root->vino(),
                                    root->get_caps_wanted(),
                                    root->filelock.get_state(),
-                                   root->nestlock.get_state());
+                                   root->nestlock.get_state(),
+                                   root->dirfragtreelock.get_state());
       }
       if (CInode *in = get_inode(MDS_INO_STRAY(p->first))) {
        p->second->add_weak_inode(in->vino());
        p->second->add_strong_inode(in->vino(),
                                    in->get_caps_wanted(),
                                    in->filelock.get_state(),
-                                   in->nestlock.get_state());
+                                   in->nestlock.get_state(),
+                                   in->dirfragtreelock.get_state());
       }
     }
   }  
@@ -2851,7 +2853,8 @@ void MDCache::rejoin_walk(CDir *dir, MMDSCacheRejoin *rejoin)
        rejoin->add_strong_inode(in->vino(),
                                 in->get_caps_wanted(),
                                 in->filelock.get_state(),
-                                in->nestlock.get_state());
+                                in->nestlock.get_state(),
+                                in->dirfragtreelock.get_state());
        in->get_nested_dirfrags(nested);
       }
     }
@@ -2971,13 +2974,14 @@ void MDCache::handle_cache_rejoin_weak(MMDSCacheRejoin *weak)
   }
 
   // assimilate any potentially dirty scatterlock state
-  for (map<inodeno_t,pair<bufferlist,bufferlist> >::iterator p = weak->inode_scatterlocks.begin();
+  for (map<inodeno_t,MMDSCacheRejoin::lock_bls>::iterator p = weak->inode_scatterlocks.begin();
        p != weak->inode_scatterlocks.end();
        p++) {
     CInode *in = get_inode(p->first);
     assert(in);
-    in->decode_lock_state(CEPH_LOCK_IFILE, p->second.first);
-    in->decode_lock_state(CEPH_LOCK_INEST, p->second.second);
+    in->decode_lock_state(CEPH_LOCK_IFILE, p->second.file);
+    in->decode_lock_state(CEPH_LOCK_INEST, p->second.nest);
+    in->decode_lock_state(CEPH_LOCK_IDFT, p->second.dft);
     if (!survivor)
       rejoin_potential_updated_scatterlocks.insert(in);
   }
@@ -3052,7 +3056,7 @@ void MDCache::handle_cache_rejoin_weak(MMDSCacheRejoin *weak)
 
   if (survivor) {
     // survivor.  do everything now.
-    for (map<inodeno_t,pair<bufferlist,bufferlist> >::iterator p = weak->inode_scatterlocks.begin();
+    for (map<inodeno_t,MMDSCacheRejoin::lock_bls>::iterator p = weak->inode_scatterlocks.begin();
         p != weak->inode_scatterlocks.end();
         p++) {
       CInode *in = get_inode(p->first);
@@ -3216,13 +3220,14 @@ void MDCache::handle_cache_rejoin_strong(MMDSCacheRejoin *strong)
   MMDSCacheRejoin *missing = 0;  // if i'm missing something..
   
   // assimilate any potentially dirty scatterlock state
-  for (map<inodeno_t,pair<bufferlist,bufferlist> >::iterator p = strong->inode_scatterlocks.begin();
+  for (map<inodeno_t,MMDSCacheRejoin::lock_bls>::iterator p = strong->inode_scatterlocks.begin();
        p != strong->inode_scatterlocks.end();
        p++) {
     CInode *in = get_inode(p->first);
     assert(in);
-    in->decode_lock_state(CEPH_LOCK_IFILE, p->second.first);
-    in->decode_lock_state(CEPH_LOCK_INEST, p->second.second);
+    in->decode_lock_state(CEPH_LOCK_IFILE, p->second.file);
+    in->decode_lock_state(CEPH_LOCK_INEST, p->second.nest);
+    in->decode_lock_state(CEPH_LOCK_IDFT, p->second.dft);
     rejoin_potential_updated_scatterlocks.insert(in);
   }
 
index eb31c70d3bed77bc5e8898dbd294411a725a05d0..03f7ce7574c92aef18c73279ca9e08d359e913f9 100644 (file)
@@ -44,20 +44,22 @@ class MMDSCacheRejoin : public Message {
   // -- types --
   struct inode_strong { 
     int32_t caps_wanted;
-    int32_t filelock, nestlock;
+    int32_t filelock, nestlock, dftlock;
     inode_strong() {}
-    inode_strong(int cw, int dl, int nl) : 
+    inode_strong(int cw, int dl, int nl, int dftl) : 
       caps_wanted(cw),
-      filelock(dl), nestlock(nl) { }
+      filelock(dl), nestlock(nl), dftlock(dftl) { }
     void encode(bufferlist &bl) const {
       ::encode(caps_wanted, bl);
       ::encode(filelock, bl);
       ::encode(nestlock, bl);
+      ::encode(dftlock, bl);
     }
     void decode(bufferlist::iterator &bl) {
       ::decode(caps_wanted, bl);
       ::decode(filelock, bl);
       ::decode(nestlock, bl);
+      ::decode(dftlock, bl);
     }
   };
   WRITE_CLASS_ENCODER(inode_strong)
@@ -130,10 +132,25 @@ class MMDSCacheRejoin : public Message {
   // -- data --
   int32_t op;
 
+  struct lock_bls {
+    bufferlist file, nest, dft;
+    void encode(bufferlist& bl) const {
+      ::encode(file, bl);
+      ::encode(nest, bl);
+      ::encode(dft, bl);
+    }
+    void decode(bufferlist::iterator& bl) {
+      ::decode(file, bl);
+      ::decode(nest, bl);
+      ::decode(dft, bl);
+    }
+  };
+  WRITE_CLASS_ENCODER(lock_bls)
+
   // weak
   map<dirfrag_t, map<string_snap_t, dn_weak> > weak;
   set<vinodeno_t> weak_inodes;
-  map<inodeno_t, pair<bufferlist,bufferlist> > inode_scatterlocks;
+  map<inodeno_t, lock_bls> inode_scatterlocks;
 
   // strong
   map<dirfrag_t, dirfrag_strong> strong_dirfrags;
@@ -170,8 +187,8 @@ class MMDSCacheRejoin : public Message {
   void add_weak_inode(vinodeno_t i) {
     weak_inodes.insert(i);
   }
-  void add_strong_inode(vinodeno_t i, int cw, int dl, int nl) {
-    strong_inodes[i] = inode_strong(cw, dl, nl);
+  void add_strong_inode(vinodeno_t i, int cw, int dl, int nl, int dftl) {
+    strong_inodes[i] = inode_strong(cw, dl, nl, dftl);
   }
   void add_inode_locks(CInode *in, __u32 nonce) {
     ::encode(in->inode.ino, inode_locks);
@@ -198,8 +215,9 @@ class MMDSCacheRejoin : public Message {
   void add_scatterlock_state(CInode *in) {
     if (inode_scatterlocks.count(in->ino()))
       return;  // already added this one
-    in->encode_lock_state(CEPH_LOCK_IFILE, inode_scatterlocks[in->ino()].first);
-    in->encode_lock_state(CEPH_LOCK_INEST, inode_scatterlocks[in->ino()].second);
+    in->encode_lock_state(CEPH_LOCK_IFILE, inode_scatterlocks[in->ino()].file);
+    in->encode_lock_state(CEPH_LOCK_INEST, inode_scatterlocks[in->ino()].nest);
+    in->encode_lock_state(CEPH_LOCK_IDFT, inode_scatterlocks[in->ino()].dft);
   }
 
   void copy_cap_exports(bufferlist &bl) {
@@ -280,5 +298,6 @@ WRITE_CLASS_ENCODER(MMDSCacheRejoin::inode_strong)
 WRITE_CLASS_ENCODER(MMDSCacheRejoin::dirfrag_strong)
 WRITE_CLASS_ENCODER(MMDSCacheRejoin::dn_strong)
 WRITE_CLASS_ENCODER(MMDSCacheRejoin::dn_weak)
+WRITE_CLASS_ENCODER(MMDSCacheRejoin::lock_bls)
 
 #endif