From: Yan, Zheng Date: Fri, 28 Apr 2017 02:53:41 +0000 (+0800) Subject: mds: simplify auxiliary subtrees when sending subtree resolve X-Git-Tag: v12.0.3~38^2~18 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=649b38edb35ff4dfd944b6a91cdb3a6b48000e59;p=ceph.git mds: simplify auxiliary subtrees when sending subtree resolve Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index ba34e4bf28ce..6321e6bb49d9 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -2797,6 +2797,9 @@ void MDCache::send_subtree_resolves() resolves[*p] = new MMDSResolve; } + map > my_subtrees; + map > my_ambig_imports; + // known for (map >::iterator p = subtrees.begin(); p != subtrees.end(); @@ -2817,10 +2820,8 @@ void MDCache::send_subtree_resolves() vector dfls; for (set::iterator q = bounds.begin(); q != bounds.end(); ++q) dfls.push_back((*q)->dirfrag()); - for (map::iterator q = resolves.begin(); - q != resolves.end(); - ++q) - resolves[q->first]->add_ambiguous_import(dir->dirfrag(), dfls); + + my_ambig_imports[dir->dirfrag()] = dfls; dout(10) << " ambig " << dir->dirfrag() << " " << dfls << dendl; } else { // not ambiguous. @@ -2835,11 +2836,9 @@ void MDCache::send_subtree_resolves() ++q) { CDir *bound = *q; dfls.push_back(bound->dirfrag()); - for (map::iterator r = resolves.begin(); - r != resolves.end(); - ++r) - resolves[r->first]->add_subtree_bound(dir->dirfrag(), bound->dirfrag()); } + + my_subtrees[dir->dirfrag()] = dfls; dout(10) << " claim " << dir->dirfrag() << " " << dfls << dendl; } } @@ -2848,19 +2847,37 @@ void MDCache::send_subtree_resolves() for (map >::iterator p = my_ambiguous_imports.begin(); p != my_ambiguous_imports.end(); ++p) { - for (map::iterator q = resolves.begin(); - q != resolves.end(); - ++q) - resolves[q->first]->add_ambiguous_import(p->first, p->second); + my_ambig_imports[p->first] = p->second; dout(10) << " ambig " << p->first << " " << p->second << dendl; } + // simplify the claimed subtree. + for (auto p = my_subtrees.begin(); p != my_subtrees.end(); ++p) { + unsigned i = 0; + while (i < p->second.size()) { + dirfrag_t b = p->second[i]; + if (my_subtrees.count(b)) { + vector& bb = my_subtrees[b]; + dout(10) << " simplify: " << p->first << " swallowing " << b << " with bounds " << bb << dendl; + for (vector::iterator r = bb.begin(); r != bb.end(); ++r) + p->second.push_back(*r); + my_subtrees.erase(b); + p->second.erase(p->second.begin() + i); + } else { + ++i; + } + } + } + // send for (map::iterator p = resolves.begin(); p != resolves.end(); ++p) { + MMDSResolve* m = p->second; + m->subtrees = my_subtrees; + m->ambiguous_imports = my_ambig_imports; dout(10) << "sending subtee resolve to mds." << p->first << dendl; - mds->send_message_mds(p->second, p->first); + mds->send_message_mds(m, p->first); } resolves_pending = false; }