]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore/bluestore_types: add blob_t::has_any_lextents
authorSage Weil <sage@redhat.com>
Tue, 10 May 2016 18:49:15 +0000 (14:49 -0400)
committerSage Weil <sage@redhat.com>
Wed, 1 Jun 2016 15:38:45 +0000 (11:38 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/bluestore_types.h
src/test/objectstore/test_bluestore_types.cc

index 8c98faa190708b2f62af2d19ecea111d2fbf6a52..9d9136886a471d45fdbb5e727e7654bf36c2b1c7 100644 (file)
@@ -524,6 +524,21 @@ struct bluestore_onode_t {
     return fp;
   }
 
+  bool has_any_lextents(uint64_t offset, uint64_t length) {
+    map<uint64_t,bluestore_lextent_t>::iterator fp =
+      extent_map.lower_bound(offset);
+    if (fp != extent_map.begin()) {
+      --fp;
+      if (fp->first + fp->second.length <= offset) {
+       ++fp;
+      }
+    }
+    if (fp == extent_map.end() || fp->first >= offset + length) {
+      return false;
+    }
+    return true;
+  }
+
   bluestore_blob_t *add_blob(int64_t *id) {
     *id = blob_map.empty() ? 1 : blob_map.rbegin()->first + 1;
     return &blob_map[*id];
index d721e6c0a3ffb8b2672027504871a1d0c866bb2f..340297426002b2c568916c33d0083d2f6b3b8dcd 100644 (file)
@@ -271,6 +271,47 @@ TEST(bluestore_onode_t, seek_lextent)
   ASSERT_EQ(d, on.seek_lextent(499));
   ASSERT_EQ(on.extent_map.end(), on.seek_lextent(500));
 }
+
+TEST(bluestore_onode_t, has_any_lextents)
+{
+  bluestore_onode_t on;
+  ASSERT_FALSE(on.has_any_lextents(0, 0));
+  ASSERT_FALSE(on.has_any_lextents(0, 1000));
+  ASSERT_FALSE(on.has_any_lextents(1000, 1000));
+
+  on.extent_map[100] = bluestore_lextent_t(1, 0, 100, 0);
+  ASSERT_FALSE(on.has_any_lextents(0, 50));
+  ASSERT_FALSE(on.has_any_lextents(0, 100));
+  ASSERT_FALSE(on.has_any_lextents(50, 50));
+  ASSERT_TRUE(on.has_any_lextents(50, 51));
+  ASSERT_TRUE(on.has_any_lextents(50, 100051));
+  ASSERT_TRUE(on.has_any_lextents(100, 100));
+  ASSERT_TRUE(on.has_any_lextents(100, 1));
+  ASSERT_TRUE(on.has_any_lextents(199, 1));
+  ASSERT_TRUE(on.has_any_lextents(199, 2));
+  ASSERT_FALSE(on.has_any_lextents(200, 2));
+
+  on.extent_map[200] = bluestore_lextent_t(2, 0, 100, 0);
+  ASSERT_TRUE(on.has_any_lextents(199, 1));
+  ASSERT_TRUE(on.has_any_lextents(199, 2));
+  ASSERT_TRUE(on.has_any_lextents(200, 2));
+  ASSERT_TRUE(on.has_any_lextents(200, 200));
+  ASSERT_TRUE(on.has_any_lextents(299, 1));
+  ASSERT_FALSE(on.has_any_lextents(300, 1));
+
+  on.extent_map[400] = bluestore_lextent_t(4, 0, 100, 0);
+  ASSERT_TRUE(on.has_any_lextents(0, 10000));
+  ASSERT_TRUE(on.has_any_lextents(199, 1));
+  ASSERT_FALSE(on.has_any_lextents(300, 1));
+  ASSERT_FALSE(on.has_any_lextents(300, 100));
+  ASSERT_FALSE(on.has_any_lextents(399, 1));
+  ASSERT_TRUE(on.has_any_lextents(400, 1));
+  ASSERT_TRUE(on.has_any_lextents(400, 100));
+  ASSERT_TRUE(on.has_any_lextents(400, 1000));
+  ASSERT_TRUE(on.has_any_lextents(499, 1000));
+  ASSERT_FALSE(on.has_any_lextents(500, 1000));
+}
+
 TEST(bluestore_onode_t, punch_hole)
 {
   bluestore_onode_t on;