]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix remote wrlock rejoin
authorYan, Zheng <zheng.z.yan@intel.com>
Sun, 16 Jun 2013 07:51:32 +0000 (15:51 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Wed, 19 Jun 2013 17:45:24 +0000 (01:45 +0800)
remote wrlock's target is not always inode's auth MDS.

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/mds/MDCache.cc

index f2068e50e7a0fe369e003b4a930921128695e79b..e592dde96ca1e7001d9c958dbd6e304b616306fd 100644 (file)
@@ -4519,25 +4519,29 @@ void MDCache::handle_cache_rejoin_strong(MMDSCacheRejoin *strong)
        mdr->locks.insert(lock);
       }
     }
-    // wrlock(s)?
-    if (strong->wrlocked_inodes.count(in->vino())) {
-      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);
-       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.
+  }
+  // wrlock(s)?
+  for (map<vinodeno_t, map<int, list<MMDSCacheRejoin::slave_reqid> > >::iterator p = strong->wrlocked_inodes.begin();
+       p != strong->wrlocked_inodes.end();
+       ++p) {
+    CInode *in = get_inode(p->first);
+    for (map<int, list<MMDSCacheRejoin::slave_reqid> >::iterator q = p->second.begin();
+        q != p->second.end();
+       ++q) {
+      SimpleLock *lock = in->get_lock(q->first);
+      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.
+       if (in->is_auth())
          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);
-       }
+       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);
       }
     }
   }