]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: optimize function, fragset_t::simplify, to improve the efficiency of merging... 31595/head
authorsimon gao <simon29rock@gmail.com>
Wed, 13 Nov 2019 10:51:07 +0000 (05:51 -0500)
committersimon gao <simon29rock@gmail.com>
Fri, 29 Nov 2019 02:18:05 +0000 (21:18 -0500)
Signed-off-by: simon gao <simon29rock@gmail.com>
src/include/frag.h
src/mds/MDCache.cc
src/mds/Migrator.cc

index 5e8b154f12fa1d2926f5ae87d72acb6c4884a715..de532d63af4472752cc9567840c587bc7ccdf7c5 100644 (file)
@@ -159,7 +159,13 @@ public:
     decode_raw(v, p);
     _enc = v;
   }
-
+  bool operator<(const frag_t& b) const
+  {
+    if (value() != b.value())
+      return value() < b.value();
+    else
+      return bits() < b.bits();
+  }
 private:
   _frag_t _enc = 0;
 };
@@ -546,7 +552,6 @@ inline std::ostream& operator<<(std::ostream& out, const fragtree_t& ft)
   return out << ")";
 }
 
-
 /**
  * fragset_t -- a set of fragments
  */
@@ -567,29 +572,27 @@ public:
       f = f.parent();
     }
   }
-  
+
+  void insert_raw(frag_t f){
+    _set.insert(f);
+  }
   void insert(frag_t f) {
     _set.insert(f);
     simplify();
   }
 
   void simplify() {
-    while (1) {
-      bool clean = true;
-      std::set<frag_t>::iterator p = _set.begin();
-      while (p != _set.end()) {
-       if (!p->is_root() &&
-           _set.count(p->get_sibling())) {
-         _set.erase(p->get_sibling());
-         _set.insert(p->parent());
-         _set.erase(p++);
-         clean = false;
-       } else {
-         p++;
-       }
+    auto it = _set.begin();
+    while (it != _set.end()) {
+      if (!it->is_root() &&
+         _set.count(it->get_sibling())) {
+       _set.erase(it->get_sibling());
+       auto ret = _set.insert(it->parent());
+       _set.erase(it);
+       it = ret.first;
+      } else {
+       ++it;
       }
-      if (clean)
-       break;
     }
   }
 };
index 41d0411352a1be238181d38c7dbd599fb23d5d9a..0e54d2740b3e85d80aa8290355b611c91b271b71 100644 (file)
@@ -1129,11 +1129,12 @@ void MDCache::get_force_dirfrag_bound_set(const vector<dirfrag_t>& dfs, set<CDir
   // sort by ino
   map<inodeno_t, fragset_t> byino;
   for (auto& frag : dfs) {
-    byino[frag.ino].insert(frag.frag);
+    byino[frag.ino].insert_raw(frag.frag);
   }
   dout(10) << " by ino: " << byino << dendl;
 
   for (map<inodeno_t,fragset_t>::iterator p = byino.begin(); p != byino.end(); ++p) {
+    p->second.simplify();
     CInode *diri = get_inode(p->first);
     if (!diri)
       continue;
@@ -1190,13 +1191,13 @@ void MDCache::map_dirfrag_set(const list<dirfrag_t>& dfs, set<CDir*>& result)
   // group by inode
   map<inodeno_t, fragset_t> ino_fragset;
   for (const auto &df : dfs) {
-    ino_fragset[df.ino].insert(df.frag);
+    ino_fragset[df.ino].insert_raw(df.frag);
   }
-
   // get frags
   for (map<inodeno_t, fragset_t>::iterator p = ino_fragset.begin();
        p != ino_fragset.end();
        ++p) {
+    p->second.simplify();
     CInode *in = get_inode(p->first);
     if (!in)
       continue;
index a9b6b80b7f0c1a03a279c3a2f8ea789ea9727e06..c977d9b9f8425bd310737830c730f08cd9119355 100644 (file)
@@ -2483,9 +2483,8 @@ void Migrator::handle_export_prep(const cref_t<MExportDirPrep> &m, bool did_assi
   map<inodeno_t, fragset_t> import_bound_fragset;
   for (const auto &bound : m->get_bounds()) {
     dout(10) << " bound " << bound << dendl;
-    import_bound_fragset[bound.ino].insert(bound.frag);
+    import_bound_fragset[bound.ino].insert_raw(bound.frag);
   }
-
   // assimilate contents?
   if (!did_assim) {
     dout(7) << "doing assim on " << *dir << dendl;
@@ -2515,6 +2514,7 @@ void Migrator::handle_export_prep(const cref_t<MExportDirPrep> &m, bool did_assi
     for (map<inodeno_t,fragset_t>::iterator p = import_bound_fragset.begin();
         p != import_bound_fragset.end();
         ++p) {
+      p->second.simplify();
       CInode *in = cache->get_inode(p->first);
       ceph_assert(in);
       in->get_stickydirs();