]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: use vector for subtree access
authorPatrick Donnelly <pdonnell@redhat.com>
Tue, 18 Dec 2018 14:59:13 +0000 (06:59 -0800)
committerPatrick Donnelly <pdonnell@redhat.com>
Tue, 18 Dec 2018 21:22:11 +0000 (13:22 -0800)
This is a performance refactor.

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/MDSRank.cc
src/mds/Server.cc
src/mds/journal.cc

index dd5f0d42786289f2760b4e9669705d4c6222653d..840b4e9723333ace2d3ed4419c65c8b2d515d8d3 100644 (file)
@@ -806,14 +806,6 @@ MDSCacheObject *MDCache::get_object(const MDSCacheObjectInfo &info)
 // ====================================================================
 // subtree management
 
-void MDCache::list_subtrees(list<CDir*>& ls)
-{
-  for (map<CDir*,set<CDir*> >::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.
index 0e929c8ee29e1622236ffc15087df1918b46a696..cd3eef20937056d64d6b5f90fabdfb0296bb0d94 100644 (file)
@@ -314,7 +314,14 @@ protected:
   //  join/split subtrees as appropriate
 public:
   bool is_subtrees() { return !subtrees.empty(); }
-  void list_subtrees(list<CDir*>& ls);
+  template<typename T>
+  void get_subtrees(T& c) {
+    if constexpr (std::is_same_v<T, std::vector<CDir*>>)
+      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));
index 63c0d33619ef3c2e7c929051da09a671ee6cbb78..33cf9e60b44a6e8b0045284cb88784122ba37f63 100644 (file)
@@ -2724,13 +2724,11 @@ void MDSRank::command_get_subtrees(Formatter *f)
   ceph_assert(f != NULL);
   std::lock_guard l(mds_lock);
 
-  std::list<CDir*> subtrees;
-  mdcache->list_subtrees(subtrees);
+  std::vector<CDir*> subtrees;
+  mdcache->get_subtrees(subtrees);
 
   f->open_array_section("subtrees");
-  for (std::list<CDir*>::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());
index 43de496ed955e53b2f3ed6748247da821ced8cb3..b0d2a18c3080cb4828075d61a8e3fac03ae758e7 100644 (file)
@@ -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<CDir*> ls;
-  diri->get_dirfrags(ls);
+  std::vector<CDir*> dirs;
+  diri->get_dirfrags(dirs);
 
   bool force_journal = false;
   if (empty) {
-    for (list<CDir*>::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<CDir*> subtrees;
-    mdcache->list_subtrees(subtrees);
-    dout(10) << " subtrees " << subtrees << " frags " << ls << dendl;
-    for (list<CDir*>::iterator p = ls.begin(); p != ls.end(); ++p) {
-      CDir *dir = *p;
-      for (list<CDir*>::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<CDir*> 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;
index 2759bb7c11c24a79c1af3480e2388c9aa6e77d4b..7b9bbd5a032e55b0c3f00513188286bcc276bea6 100644 (file)
@@ -2612,10 +2612,9 @@ void ESubtreeMap::replay(MDSRank *mds)
       }
     }
     
-    list<CDir*> subs;
-    mds->mdcache->list_subtrees(subs);
-    for (list<CDir*>::iterator p = subs.begin(); p != subs.end(); ++p) {
-      CDir *dir = *p;
+    std::vector<CDir*> 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) {