]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: fix lack of extent demotion in StupidAllocator::init_rm_free
authorIgor Fedotov <ifed@mail.ru>
Mon, 23 Oct 2017 16:32:23 +0000 (09:32 -0700)
committerIgor Fedotov <ifedotov@suse.com>
Tue, 6 Feb 2018 19:51:14 +0000 (22:51 +0300)
Signed-off-by: Igor Fedotov <ifedotov@suse.com>
src/include/interval_set.h
src/os/bluestore/StupidAllocator.cc

index 181fb29f39c18cc69503f4902cfe45551ecaa385..26e7a9d78393cf2bd5e42de5d369168866b8b80b 100644 (file)
@@ -520,7 +520,8 @@ class interval_set {
     erase(val, 1);
   }
 
-  void erase(T start, T len) {
+  void erase(T start, T len, 
+    std::function<bool(T, T)> post_process = {}) {
     typename Map::iterator p = find_inc_m(start);
 
     _size -= len;
@@ -532,16 +533,16 @@ class interval_set {
     T before = start - p->first;
     assert(p->second >= before+len);
     T after = p->second - before - len;
-    
-    if (before) 
+    if (before && (post_process ? post_process(p->first, before) : true)) {
       p->second = before;        // shorten bit before
-    else
+    } else {
       m.erase(p);
-    if (after)
-      m[start+len] = after;
+    }
+    if (after && (post_process ? post_process(start + len, after) : true)) {
+      m[start + len] = after;
+    }
   }
 
-
   void subtract(const interval_set &a) {
     for (typename Map::const_iterator p = a.m.begin();
          p != a.m.end();
index 0dd52a87c62b779ce507f23aad26d35e26fc833c..39f31e0e09bba8ff6f81b9327a5ee9414f4be037 100644 (file)
@@ -300,7 +300,26 @@ void StupidAllocator::init_rm_free(uint64_t offset, uint64_t length)
     if (!overlap.empty()) {
       ldout(cct, 20) << __func__ << " bin " << i << " rm 0x" << std::hex << overlap
                     << std::dec << dendl;
-      free[i].subtract(overlap);
+      auto it = overlap.begin();
+      auto it_end = overlap.end();
+      while (it != it_end) {
+        auto o = it.get_start();
+        auto l = it.get_len();
+
+        free[i].erase(o, l,
+          [&](uint64_t off, uint64_t len) {
+            unsigned newbin = _choose_bin(len);
+            if (newbin != i) {
+              ldout(cct, 30) << __func__ << " demoting1 0x" << std::hex << off << "~" << len
+                             << std::dec << " to bin " << newbin << dendl;
+              _insert_free(off, len);
+              return false;
+            }
+            return true;
+          });
+        ++it;
+      }
+
       rm.subtract(overlap);
     }
   }