summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYan, Zheng <zheng.z.yan@intel.com>2013-06-16 15:51:32 +0800
committerYan, Zheng <zheng.z.yan@intel.com>2013-06-20 01:45:24 +0800
commitb2f1a1ad58b71a86512c5abfea751f174aea044d (patch)
tree268d5e68926c2b5ddda6df540dc71c5ad979d8fc
parent15a5d37a90daca11d9dc0a581417d2a07b9d14ad (diff)
downloadceph-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.cc40
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);
}
}
}