]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
seastore: continous range based free_extent()
authormyoungwon oh <ohmyoungwon@gmail.com>
Mon, 24 May 2021 14:29:29 +0000 (23:29 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Tue, 15 Jun 2021 02:09:06 +0000 (11:09 +0900)
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
src/crimson/os/seastore/randomblock_manager.cc
src/crimson/os/seastore/randomblock_manager.h

index c73b4a3770d929332b2aa648048fc09e6d1f05b3..b312abc7749e020fa9f828eebe8295e3c2618e06 100644 (file)
@@ -266,47 +266,20 @@ RandomBlockManager::alloc_extent(Transaction &t, size_t size)
 }
 
 RandomBlockManager::free_block_ertr::future<>
-RandomBlockManager::free_extent(Transaction &t, blk_paddr_t blk_paddr)
+RandomBlockManager::free_extent(Transaction &t, blk_paddr_t from, blk_paddr_t to)
 {
-
-  blk_id_t block_no = blk_paddr / super.block_size;
-  auto addr = (super.start_alloc_area +
-             block_no / max_block_by_bitmap_block())
-             * super.block_size;
-  auto bp = bufferptr(ceph::buffer::create_page_aligned(super.block_size));
-  return device->read(
-      addr,
-      bp
-      ).safe_then([&, this]() {
-       logger().debug("free_extent: addr {}", addr);
-       rbm_bitmap_block_t b_block(super.block_size);
-       bufferlist bl_bitmap_block;
-       bl_bitmap_block.append(bp);
-       encode(b_block, bl_bitmap_block);
-
-       auto remain_offset = block_no % max_block_by_bitmap_block();
-       b_block.clear_bit(remain_offset);
-       bufferlist bl;
-       encode(b_block, bl);
-       logger().debug("free_extent: free block no {}",
-                      convert_bitmap_block_no_to_block_id(remain_offset, addr));
-       std::vector<blk_id_t> ids;
-       ids.push_back(convert_bitmap_block_no_to_block_id(remain_offset, addr));
-       rbm_extent_t extent{
-         extent_types_t::RBM_ALLOC_INFO,
-         ids,
-         addr,
-         bl
-       };
-       t.add_rbm_allocated_blocks(extent);
-       return free_block_ertr::now();
-       }
-  ).handle_error(
-    free_block_ertr::pass_further{},
-    crimson::ct_error::assert_all{
-      "Invalid error in RandomBlockManager::free_extent"
-    }
-    );
+  blk_id_t blk_id_start = from / super.block_size;
+  blk_id_t blk_id_end = to / super.block_size;
+
+  interval_set<blk_id_t> free_extent;
+  free_extent.insert(blk_id_start, blk_id_end - blk_id_start + 1);
+  rbm_alloc_delta_t alloc_info {
+    extent_types_t::RBM_ALLOC_INFO,
+    free_extent,
+    rbm_alloc_delta_t::op_types_t::CLEAR
+  };
+  t.add_rbm_allocated_blocks(alloc_info);
+  return free_block_ertr::now();
 }
 
 RandomBlockManager::write_ertr::future<>
index 6fb7921872892a96b28fb4043ac6025e5067a52b..3bd764b0d7b334ed98800c6a54a953bc7d935555 100644 (file)
@@ -249,7 +249,13 @@ public:
     crimson::ct_error::input_output_error,
     crimson::ct_error::invarg
     >;
-  free_block_ertr::future<> free_extent(Transaction &t, blk_paddr_t blk_paddr); // TODO: will include trim if necessary
+  /*
+   * free_extent
+   *
+   * add a range of free blocks to transaction
+   *
+   */
+  free_block_ertr::future<> free_extent(Transaction &t, blk_paddr_t from, blk_paddr_t to); // TODO: will include trim if necessary
 
   using complete_allocation_ertr = crimson::errorator<
     crimson::ct_error::input_output_error,