]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
os/bluestore/bluestore_types: add onode_t::compress_extent_map()
authorSage Weil <sage@redhat.com>
Fri, 13 May 2016 21:07:10 +0000 (17:07 -0400)
committerSage Weil <sage@redhat.com>
Wed, 1 Jun 2016 15:38:46 +0000 (11:38 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/bluestore_types.cc
src/os/bluestore/bluestore_types.h
src/test/objectstore/test_bluestore_types.cc

index b9c007771c8b969615af47da880fd0711c99821b..7669e0afd6bb918e2eac49a921d96865026cd4fd 100644 (file)
@@ -652,6 +652,29 @@ void bluestore_onode_t::generate_test_instances(list<bluestore_onode_t*>& o)
   // FIXME
 }
 
+int bluestore_onode_t::compress_extent_map()
+{
+  if (extent_map.empty())
+    return 0;
+  int removed = 0;
+  auto p = extent_map.begin();
+  auto n = p;
+  for (++n; n != extent_map.end(); p = n++) {
+    while (n != extent_map.end() &&
+          p->first + p->second.length == n->first &&
+          p->second.blob == n->second.blob &&
+          p->second.offset + p->second.length == n->second.offset) {
+      p->second.length += n->second.length;
+      extent_map.erase(n++);
+      ++removed;
+    }
+    if (n == extent_map.end()) {
+      break;
+    }
+  }
+  return removed;
+}
+
 void bluestore_onode_t::punch_hole(
   uint64_t offset,
   uint64_t length,
index e934569c587b16289c80982dc2f4e68d5d3c81ec..e979cf5b11ddf2797b05d86e2f55e7e25afd13e6 100644 (file)
@@ -557,6 +557,9 @@ struct bluestore_onode_t {
     return true;
   }
 
+  /// consolidate adjacent lextents in extent_map
+  int compress_extent_map();
+
   bluestore_blob_t *add_blob(int64_t *id) {
     *id = blob_map.empty() ? 1 : blob_map.rbegin()->first + 1;
     return &blob_map[*id];
index 340297426002b2c568916c33d0083d2f6b3b8dcd..68fba229e4c9fdb5b6a7ee4a75320c295e574611 100644 (file)
@@ -312,6 +312,38 @@ TEST(bluestore_onode_t, has_any_lextents)
   ASSERT_FALSE(on.has_any_lextents(500, 1000));
 }
 
+TEST(bluestore_onode_t, compress_extent_map)
+{
+  bluestore_onode_t on;
+  vector<bluestore_lextent_t> r;
+  on.extent_map[0] = bluestore_lextent_t(1, 0, 100, 0);
+  on.extent_map[100] = bluestore_lextent_t(2, 0, 100, 0);
+  ASSERT_EQ(0, on.compress_extent_map());
+  ASSERT_EQ(2u, on.extent_map.size());
+
+  on.extent_map[200] = bluestore_lextent_t(2, 100, 100, 0);
+  on.extent_map[300] = bluestore_lextent_t(2, 200, 100, 0);
+  ASSERT_EQ(2, on.compress_extent_map());
+  ASSERT_EQ(2u, on.extent_map.size());
+
+  on.extent_map[200] = bluestore_lextent_t(3, 100, 100, 0);
+  on.extent_map[300] = bluestore_lextent_t(2, 200, 100, 0);
+  ASSERT_EQ(0, on.compress_extent_map());
+  ASSERT_EQ(4u, on.extent_map.size());
+
+  on.extent_map[400] = bluestore_lextent_t(2, 300, 100, 0);
+  on.extent_map[500] = bluestore_lextent_t(2, 500, 100, 0);
+  on.extent_map[600] = bluestore_lextent_t(2, 600, 100, 0);
+  ASSERT_EQ(2, on.compress_extent_map());
+  ASSERT_EQ(5u, on.extent_map.size());
+
+  on.extent_map[400] = bluestore_lextent_t(2, 300, 100, 0);
+  on.extent_map[500] = bluestore_lextent_t(2, 400, 100, 0);
+  on.extent_map[700] = bluestore_lextent_t(2, 500, 100, 0);
+  ASSERT_EQ(1, on.compress_extent_map());
+  ASSERT_EQ(6u, on.extent_map.size());
+}
+
 TEST(bluestore_onode_t, punch_hole)
 {
   bluestore_onode_t on;