From a29f1a078fb232b55d3b4e8a292d44c52872ad8b Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Tue, 18 Dec 2018 06:59:13 -0800 Subject: [PATCH] mds: use vector for subtree access This is a performance refactor. Signed-off-by: Patrick Donnelly --- src/mds/MDCache.cc | 8 -------- src/mds/MDCache.h | 9 ++++++++- src/mds/MDSRank.cc | 8 +++----- src/mds/Server.cc | 35 +++++++++++++++++------------------ src/mds/journal.cc | 7 +++---- 5 files changed, 31 insertions(+), 36 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index dd5f0d4278628..840b4e9723333 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -806,14 +806,6 @@ MDSCacheObject *MDCache::get_object(const MDSCacheObjectInfo &info) // ==================================================================== // subtree management -void MDCache::list_subtrees(list& ls) -{ - for (map >::iterator p = subtrees.begin(); - p != subtrees.end(); - ++p) - ls.push_back(p->first); -} - /* * adjust the dir_auth of a subtree. * merge with parent and/or child subtrees, if is it appropriate. diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 0e929c8ee29e1..cd3eef2093705 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -314,7 +314,14 @@ protected: // join/split subtrees as appropriate public: bool is_subtrees() { return !subtrees.empty(); } - void list_subtrees(list& ls); + template + void get_subtrees(T& c) { + if constexpr (std::is_same_v>) + c.reserve(c.size() + subtrees.size()); + for (const auto& p : subtrees) { + c.push_back(p.first); + } + } void adjust_subtree_auth(CDir *root, mds_authority_t auth, bool adjust_pop=true); void adjust_subtree_auth(CDir *root, mds_rank_t a, mds_rank_t b=CDIR_AUTH_UNKNOWN) { adjust_subtree_auth(root, mds_authority_t(a,b)); diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 63c0d33619ef3..33cf9e60b44a6 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -2724,13 +2724,11 @@ void MDSRank::command_get_subtrees(Formatter *f) ceph_assert(f != NULL); std::lock_guard l(mds_lock); - std::list subtrees; - mdcache->list_subtrees(subtrees); + std::vector subtrees; + mdcache->get_subtrees(subtrees); f->open_array_section("subtrees"); - for (std::list::iterator i = subtrees.begin(); i != subtrees.end(); ++i) { - const CDir *dir = *i; - + for (const auto& dir : subtrees) { f->open_object_section("subtree"); { f->dump_bool("is_auth", dir->is_auth()); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 43de496ed955e..b0d2a18c3080c 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -7760,37 +7760,36 @@ version_t Server::_rename_prepare_import(MDRequestRef& mdr, CDentry *srcdn, buff bool Server::_need_force_journal(CInode *diri, bool empty) { - list ls; - diri->get_dirfrags(ls); + std::vector dirs; + diri->get_dirfrags(dirs); bool force_journal = false; if (empty) { - for (list::iterator p = ls.begin(); p != ls.end(); ++p) { - if ((*p)->is_subtree_root() && (*p)->get_dir_auth().first == mds->get_nodeid()) { - dout(10) << " frag " << (*p)->get_frag() << " is auth subtree dirfrag, will force journal" << dendl; + for (const auto& dir : dirs) { + if (dir->is_subtree_root() && dir->get_dir_auth().first == mds->get_nodeid()) { + dout(10) << " frag " << dir->get_frag() << " is auth subtree dirfrag, will force journal" << dendl; force_journal = true; break; } else - dout(20) << " frag " << (*p)->get_frag() << " is not auth subtree dirfrag" << dendl; + dout(20) << " frag " << dir->get_frag() << " is not auth subtree dirfrag" << dendl; } } else { // see if any children of our frags are auth subtrees. - list subtrees; - mdcache->list_subtrees(subtrees); - dout(10) << " subtrees " << subtrees << " frags " << ls << dendl; - for (list::iterator p = ls.begin(); p != ls.end(); ++p) { - CDir *dir = *p; - for (list::iterator q = subtrees.begin(); q != subtrees.end(); ++q) { - if (dir->contains(*q)) { - if ((*q)->get_dir_auth().first == mds->get_nodeid()) { - dout(10) << " frag " << (*p)->get_frag() << " contains (maybe) auth subtree, will force journal " - << **q << dendl; + std::vector subtrees; + mdcache->get_subtrees(subtrees); + dout(10) << " subtrees " << subtrees << " frags " << dirs << dendl; + for (const auto& dir : dirs) { + for (const auto& subtree : subtrees) { + if (dir->contains(subtree)) { + if (subtree->get_dir_auth().first == mds->get_nodeid()) { + dout(10) << " frag " << dir->get_frag() << " contains (maybe) auth subtree, will force journal " + << *subtree << dendl; force_journal = true; break; } else - dout(20) << " frag " << (*p)->get_frag() << " contains but isn't auth for " << **q << dendl; + dout(20) << " frag " << dir->get_frag() << " contains but isn't auth for " << *subtree << dendl; } else - dout(20) << " frag " << (*p)->get_frag() << " does not contain " << **q << dendl; + dout(20) << " frag " << dir->get_frag() << " does not contain " << *subtree << dendl; } if (force_journal) break; diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 2759bb7c11c24..7b9bbd5a032e5 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -2612,10 +2612,9 @@ void ESubtreeMap::replay(MDSRank *mds) } } - list subs; - mds->mdcache->list_subtrees(subs); - for (list::iterator p = subs.begin(); p != subs.end(); ++p) { - CDir *dir = *p; + std::vector dirs; + mds->mdcache->get_subtrees(dirs); + for (const auto& dir : dirs) { if (dir->get_dir_auth().first != mds->get_nodeid()) continue; if (subtrees.count(dir->dirfrag()) == 0) { -- 2.39.5