]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
os/bluestore: optimize compress_extent_map
authorSage Weil <sage@redhat.com>
Fri, 2 Sep 2016 18:08:48 +0000 (14:08 -0400)
committerSage Weil <sage@redhat.com>
Wed, 7 Sep 2016 15:26:06 +0000 (11:26 -0400)
Only examine the range we just wrote to (and to the left
and right).

Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h

index a17980082b94b880d090bf2bcf7ac3607242642d..2f0bb4a7d47c5048b28a1c7b3816c98e63f2126d 100644 (file)
@@ -1904,14 +1904,20 @@ bool BlueStore::ExtentMap::has_any_lextents(uint64_t offset, uint64_t length)
   return true;
 }
 
-int BlueStore::ExtentMap::compress_extent_map()
+int BlueStore::ExtentMap::compress_extent_map(uint64_t offset, uint64_t length)
 {
   if (extent_map.empty())
     return 0;
   int removed = 0;
-  auto p = extent_map.begin();
+  auto p = seek_lextent(offset);
+  if (p != extent_map.begin()) {
+    --p;  // start to the left of offset
+  }
   auto n = p;
   for (++n; n != extent_map.end(); p = n++) {
+    if (n->logical_offset > offset + length) {
+      break;  // stop after end
+    }
     while (n != extent_map.end() &&
           p->logical_offset + p->length == n->logical_offset &&
           p->blob == n->blob &&
@@ -7313,8 +7319,6 @@ void BlueStore::_wctx_finish(
       }
     }
   }
-
-  o->extent_map.compress_extent_map();
 }
 
 int BlueStore::_do_write(
@@ -7422,6 +7426,8 @@ int BlueStore::_do_write(
 
   _wctx_finish(txc, c, o, &wctx);
 
+  o->extent_map.compress_extent_map(offset, length);
+
   o->extent_map.dirty_range(txc->t, offset, length);
 
   if (end > o->onode.size) {
index 424e5f5a6e2bee41a78ae14531bc155570d10195..3c8ab011e129a16f04f62d494c16e8e3fd25009b 100644 (file)
@@ -582,7 +582,7 @@ public:
     bool has_any_lextents(uint64_t offset, uint64_t length);
 
     /// consolidate adjacent lextents in extent_map
-    int compress_extent_map();
+    int compress_extent_map(uint64_t offset, uint64_t length);
 
     /// punch a logical hole.  add lextents to deref to target list.
     void punch_hole(uint64_t offset, uint64_t length,