diff options
author | Yan, Zheng <zheng.z.yan@intel.com> | 2013-06-16 15:51:32 +0800 |
---|---|---|
committer | Yan, Zheng <zheng.z.yan@intel.com> | 2013-06-20 01:45:24 +0800 |
commit | b2f1a1ad58b71a86512c5abfea751f174aea044d (patch) | |
tree | 268d5e68926c2b5ddda6df540dc71c5ad979d8fc | |
parent | 15a5d37a90daca11d9dc0a581417d2a07b9d14ad (diff) | |
download | ceph-b2f1a1ad58b71a86512c5abfea751f174aea044d.tar.gz |
mds: fix remote wrlock rejoin
remote wrlock's target is not always inode's auth MDS.
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
-rw-r--r-- | src/mds/MDCache.cc | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index f2068e50e7a..e592dde96ca 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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); } } } |