]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: reqid for rejoinning authpin/wrlock need to be list
authorYan, Zheng <zheng.z.yan@intel.com>
Thu, 14 Mar 2013 12:29:53 +0000 (20:29 +0800)
committerGreg Farnum <greg@inktank.com>
Mon, 1 Apr 2013 16:26:00 +0000 (09:26 -0700)
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/mds/MDCache.cc
src/messages/MMDSCacheRejoin.h

index 0d2cac12027dd39e9a03e898c9ef89a76bb152e0..86f7c09a75f78ea5363ce76cc8dcca88d2a91645 100644 (file)
@@ -4309,16 +4309,19 @@ void MDCache::handle_cache_rejoin_strong(MMDSCacheRejoin *strong)
       // dn auth_pin?
       if (strong->authpinned_dentries.count(p->first) &&
          strong->authpinned_dentries[p->first].count(q->first)) {
-       MMDSCacheRejoin::slave_reqid r = strong->authpinned_dentries[p->first][q->first];
-       dout(10) << " dn authpin by " << r << " on " << *dn << dendl;
-       
-       // get/create slave mdrequest
-       MDRequest *mdr;
-       if (have_request(r.reqid))
-         mdr = request_get(r.reqid);
-       else
-         mdr = request_start_slave(r.reqid, r.attempt, from);
-       mdr->auth_pin(dn);
+       for (list<MMDSCacheRejoin::slave_reqid>::iterator r = strong->authpinned_dentries[p->first][q->first].begin();
+            r != strong->authpinned_dentries[p->first][q->first].end();
+            ++r) {
+         dout(10) << " dn authpin by " << *r << " on " << *dn << dendl;
+
+         // get/create slave mdrequest
+         MDRequest *mdr;
+         if (have_request(r->reqid))
+           mdr = request_get(r->reqid);
+         else
+           mdr = request_start_slave(r->reqid, r->attempt, from);
+         mdr->auth_pin(dn);
+       }
       }
 
       // dn xlock?
@@ -4395,22 +4398,25 @@ void MDCache::handle_cache_rejoin_strong(MMDSCacheRejoin *strong)
 
     // auth pin?
     if (strong->authpinned_inodes.count(in->vino())) {
-      MMDSCacheRejoin::slave_reqid r = strong->authpinned_inodes[in->vino()];
-      dout(10) << " inode authpin by " << r << " on " << *in << dendl;
+      for (list<MMDSCacheRejoin::slave_reqid>::iterator r = strong->authpinned_inodes[in->vino()].begin();
+          r != strong->authpinned_inodes[in->vino()].end();
+          ++r) {
+       dout(10) << " inode authpin by " << *r << " on " << *in << dendl;
 
-      // get/create slave mdrequest
-      MDRequest *mdr;
-      if (have_request(r.reqid))
-       mdr = request_get(r.reqid);
-      else
-       mdr = request_start_slave(r.reqid, r.attempt, from);
-      if (strong->frozen_authpin_inodes.count(in->vino())) {
-       assert(!in->get_num_auth_pins());
-       mdr->freeze_auth_pin(in);
-      } else {
-       assert(!in->is_frozen_auth_pin());
+       // get/create slave mdrequest
+       MDRequest *mdr;
+       if (have_request(r->reqid))
+         mdr = request_get(r->reqid);
+       else
+         mdr = request_start_slave(r->reqid, r->attempt, from);
+       if (strong->frozen_authpin_inodes.count(in->vino())) {
+         assert(!in->get_num_auth_pins());
+         mdr->freeze_auth_pin(in);
+       } else {
+         assert(!in->is_frozen_auth_pin());
+       }
+       mdr->auth_pin(in);
       }
-      mdr->auth_pin(in);
     }
     // xlock(s)?
     if (strong->xlocked_inodes.count(in->vino())) {
@@ -4433,19 +4439,23 @@ void MDCache::handle_cache_rejoin_strong(MMDSCacheRejoin *strong)
     }
     // wrlock(s)?
     if (strong->wrlocked_inodes.count(in->vino())) {
-      for (map<int,MMDSCacheRejoin::slave_reqid>::iterator q = strong->wrlocked_inodes[in->vino()].begin();
+      for (map<int, list<MMDSCacheRejoin::slave_reqid> >::iterator q = strong->wrlocked_inodes[in->vino()].begin();
           q != strong->wrlocked_inodes[in->vino()].end();
           ++q) {
        SimpleLock *lock = in->get_lock(q->first);
-       dout(10) << " inode wrlock by " << q->second << " on " << *lock << " on " << *in << dendl;
-       MDRequest *mdr = request_get(q->second.reqid);  // should have this from auth_pin above.
-       assert(mdr->is_auth_pinned(in));
-       lock->set_state(LOCK_LOCK);
-       if (lock == &in->filelock)
-         in->loner_cap = -1;
-       lock->get_wrlock(true);
-       mdr->wrlocks.insert(lock);
-       mdr->locks.insert(lock);
+       for (list<MMDSCacheRejoin::slave_reqid>::iterator r = q->second.begin();
+            r != q->second.end();
+            ++r) {
+         dout(10) << " inode wrlock by " << *r << " on " << *lock << " on " << *in << dendl;
+         MDRequest *mdr = request_get(r->reqid);  // should have this from auth_pin above.
+         assert(mdr->is_auth_pinned(in));
+         lock->set_state(LOCK_MIX);
+         if (lock == &in->filelock)
+           in->loner_cap = -1;
+         lock->get_wrlock(true);
+         mdr->wrlocks.insert(lock);
+         mdr->locks.insert(lock);
+       }
       }
     }
   }
index c6a22585aa4964abfc5833d1965a5830741c72d4..dc8a1afe114c1e3ceff8f992790826dae7c21c53 100644 (file)
@@ -192,11 +192,11 @@ class MMDSCacheRejoin : public Message {
       ::decode(attempt, bl);
     }
   };
-  map<vinodeno_t, slave_reqid> authpinned_inodes;
+  map<vinodeno_t, list<slave_reqid> > authpinned_inodes;
   map<vinodeno_t, slave_reqid> frozen_authpin_inodes;
   map<vinodeno_t, map<__s32, slave_reqid> > xlocked_inodes;
-  map<vinodeno_t, map<__s32, slave_reqid> > wrlocked_inodes;
-  map<dirfrag_t, map<string_snap_t, slave_reqid> > authpinned_dentries;
+  map<vinodeno_t, map<__s32, list<slave_reqid> > > wrlocked_inodes;
+  map<dirfrag_t, map<string_snap_t, list<slave_reqid> > > authpinned_dentries;
   map<dirfrag_t, map<string_snap_t, slave_reqid> > xlocked_dentries;
   
   MMDSCacheRejoin() :
@@ -238,7 +238,7 @@ public:
     ::encode(bl, inode_base);
   }
   void add_inode_authpin(vinodeno_t ino, const metareqid_t& ri, __u32 attempt) {
-    authpinned_inodes[ino] = slave_reqid(ri, attempt);
+    authpinned_inodes[ino].push_back(slave_reqid(ri, attempt));
   }
   void add_inode_frozen_authpin(vinodeno_t ino, const metareqid_t& ri, __u32 attempt) {
     frozen_authpin_inodes[ino] = slave_reqid(ri, attempt);
@@ -247,7 +247,7 @@ public:
     xlocked_inodes[ino][lt] = slave_reqid(ri, attempt);
   }
   void add_inode_wrlock(vinodeno_t ino, int lt, const metareqid_t& ri, __u32 attempt) {
-    wrlocked_inodes[ino][lt] = slave_reqid(ri, attempt);
+    wrlocked_inodes[ino][lt].push_back(slave_reqid(ri, attempt));
   }
 
   void add_scatterlock_state(CInode *in) {
@@ -286,7 +286,7 @@ public:
   }
   void add_dentry_authpin(dirfrag_t df, const string& dname, snapid_t last,
                          const metareqid_t& ri, __u32 attempt) {
-    authpinned_dentries[df][string_snap_t(dname, last)] = slave_reqid(ri, attempt);
+    authpinned_dentries[df][string_snap_t(dname, last)].push_back(slave_reqid(ri, attempt));
   }
   void add_dentry_xlock(dirfrag_t df, const string& dname, snapid_t last,
                        const metareqid_t& ri, __u32 attempt) {