From: myoungwon oh Date: Mon, 24 May 2021 14:29:29 +0000 (+0900) Subject: seastore: continous range based free_extent() X-Git-Tag: v17.1.0~1638^2~24 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=0b35d5a8647b0f16aefdb319feb637f2d098c875;p=ceph-ci.git seastore: continous range based free_extent() Signed-off-by: Myoungwon Oh --- diff --git a/src/crimson/os/seastore/randomblock_manager.cc b/src/crimson/os/seastore/randomblock_manager.cc index c73b4a3770d..b312abc7749 100644 --- a/src/crimson/os/seastore/randomblock_manager.cc +++ b/src/crimson/os/seastore/randomblock_manager.cc @@ -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 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 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<> diff --git a/src/crimson/os/seastore/randomblock_manager.h b/src/crimson/os/seastore/randomblock_manager.h index 6fb79218728..3bd764b0d7b 100644 --- a/src/crimson/os/seastore/randomblock_manager.h +++ b/src/crimson/os/seastore/randomblock_manager.h @@ -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,