From d308625c9bb926ecaaf1b06ea3c9b8c4e96f51c1 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 13 May 2016 17:07:10 -0400 Subject: [PATCH] os/bluestore/bluestore_types: add onode_t::compress_extent_map() Signed-off-by: Sage Weil --- src/os/bluestore/bluestore_types.cc | 23 ++++++++++++++ src/os/bluestore/bluestore_types.h | 3 ++ src/test/objectstore/test_bluestore_types.cc | 32 ++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/src/os/bluestore/bluestore_types.cc b/src/os/bluestore/bluestore_types.cc index b9c007771c8b9..7669e0afd6bb9 100644 --- a/src/os/bluestore/bluestore_types.cc +++ b/src/os/bluestore/bluestore_types.cc @@ -652,6 +652,29 @@ void bluestore_onode_t::generate_test_instances(list& 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, diff --git a/src/os/bluestore/bluestore_types.h b/src/os/bluestore/bluestore_types.h index e934569c587b1..e979cf5b11ddf 100644 --- a/src/os/bluestore/bluestore_types.h +++ b/src/os/bluestore/bluestore_types.h @@ -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]; diff --git a/src/test/objectstore/test_bluestore_types.cc b/src/test/objectstore/test_bluestore_types.cc index 340297426002b..68fba229e4c9f 100644 --- a/src/test/objectstore/test_bluestore_types.cc +++ b/src/test/objectstore/test_bluestore_types.cc @@ -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 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; -- 2.39.5