From: myoungwon oh Date: Fri, 13 Aug 2021 03:55:17 +0000 (+0900) Subject: seastore: free allocated extent if extent is retiered X-Git-Tag: v17.1.0~606^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=a65c26a5a84ba87d4d025bc82012d8c533a0dec1;p=ceph.git seastore: free allocated extent if extent is retiered This commit frees allocated extent when the extent is retired Signed-off-by: Myoungwon Oh --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index f67614d6f41e2..f0eb8370958c5 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -947,6 +947,13 @@ record_t Cache::prepare_record(Transaction &t) get_by_ext(efforts.retire_by_ext, i->get_type()).increment(i->get_length()); retire_extent(i); + if (i->backend_type == device_type_t::RANDOM_BLOCK) { + paddr_t paddr = i->get_paddr(); + rbm_alloc_delta_t delta; + delta.op = rbm_alloc_delta_t::op_types_t::CLEAR; + delta.alloc_blk_ranges.push_back(std::make_pair(paddr, i->get_length())); + t.add_rbm_alloc_info_blocks(delta); + } } record.extents.reserve(t.inline_block_list.size()); @@ -979,6 +986,15 @@ record_t Cache::prepare_record(Transaction &t) }); } + for (auto b : t.rbm_alloc_info_blocks) { + bufferlist bl; + encode(b, bl); + delta_info_t delta; + delta.type = extent_types_t::RBM_ALLOC_INFO; + delta.bl = bl; + record.deltas.push_back(delta); + } + for (auto &i: t.ool_block_list) { ceph_assert(i->is_valid()); DEBUGT("fresh ool block {}", t, *i); diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 5b2afa5c37d2f..7ad1af4a87622 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -17,6 +17,7 @@ #include "crimson/os/seastore/cached_extent.h" #include "crimson/os/seastore/root_block.h" #include "crimson/os/seastore/segment_cleaner.h" +#include "crimson/os/seastore/random_block_manager.h" namespace crimson::os::seastore { diff --git a/src/crimson/os/seastore/random_block_manager.h b/src/crimson/os/seastore/random_block_manager.h index eb619739cd329..5208c01abd126 100644 --- a/src/crimson/os/seastore/random_block_manager.h +++ b/src/crimson/os/seastore/random_block_manager.h @@ -75,13 +75,6 @@ public: >; virtual allocate_ertr::future<> alloc_extent(Transaction &t, size_t size) = 0; // allocator, return blocks - using free_block_ertr = crimson::errorator< - crimson::ct_error::input_output_error, - crimson::ct_error::invarg - >; - // TODO: will include trim if necessary - virtual free_block_ertr::future<> free_extent(Transaction &t, blk_paddr_t from, size_t len) = 0; - using abort_allocation_ertr = crimson::errorator< crimson::ct_error::input_output_error, crimson::ct_error::invarg diff --git a/src/crimson/os/seastore/random_block_manager/nvme_manager.cc b/src/crimson/os/seastore/random_block_manager/nvme_manager.cc index 42410214c7728..6f9c89b429e5d 100644 --- a/src/crimson/os/seastore/random_block_manager/nvme_manager.cc +++ b/src/crimson/os/seastore/random_block_manager/nvme_manager.cc @@ -293,13 +293,7 @@ NVMeManager::allocate_ertr::future<> NVMeManager::alloc_extent( ); } -NVMeManager::free_block_ertr::future<> NVMeManager::free_extent( - Transaction &t, blk_paddr_t from, size_t len) -{ - return free_block_ertr::now(); -} - -NVMeManager::free_block_ertr::future<> NVMeManager::add_free_extent( +void NVMeManager::add_free_extent( std::vector& v, blk_paddr_t from, size_t len) { ceph_assert(!(len % super.block_size)); @@ -312,7 +306,6 @@ NVMeManager::free_block_ertr::future<> NVMeManager::add_free_extent( alloc_info.alloc_blk_ranges.push_back(std::make_pair(paddr, len)); alloc_info.op = rbm_alloc_delta_t::op_types_t::CLEAR; v.push_back(alloc_info); - return free_block_ertr::now(); } NVMeManager::write_ertr::future<> NVMeManager::rbm_sync_block_bitmap_by_range( diff --git a/src/crimson/os/seastore/random_block_manager/nvme_manager.h b/src/crimson/os/seastore/random_block_manager/nvme_manager.h index 04ba5d12c52f7..9842db2114b38 100644 --- a/src/crimson/os/seastore/random_block_manager/nvme_manager.h +++ b/src/crimson/os/seastore/random_block_manager/nvme_manager.h @@ -212,9 +212,6 @@ public: * add a range of free blocks to transaction * */ - // TODO: will include trim if necessary - free_block_ertr::future<> free_extent( - Transaction &t, blk_paddr_t from, size_t len) final; abort_allocation_ertr::future<> abort_allocation(Transaction &t) final; write_ertr::future<> complete_allocation(Transaction &t) final; @@ -359,7 +356,7 @@ public: write_ertr::future<> write(blk_paddr_t addr, bufferlist &bl); write_ertr::future<> sync_allocation( std::vector& alloc_blocks); - free_block_ertr::future<> add_free_extent( + void add_free_extent( std::vector& v, blk_paddr_t from, size_t len); uint32_t get_blocks_per_segment() const final { diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index 5a18676591616..226010713884a 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -1233,6 +1233,7 @@ WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::delta_info_t) WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::record_header_t) WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::extent_info_t) WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::segment_header_t) +WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::rbm_alloc_delta_t) template<> struct denc_traits { diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index 4d406db99f989..4efbeca5f8361 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -299,6 +299,17 @@ public: tree_stats_t& get_lba_tree_stats() { return lba_tree_stats; } + void add_rbm_alloc_info_blocks(rbm_alloc_delta_t &d) { + rbm_alloc_info_blocks.push_back(d); + } + void clear_rbm_alloc_info_blocks() { + if (!rbm_alloc_info_blocks.empty()) { + rbm_alloc_info_blocks.clear(); + } + } + const auto &get_rbm_alloc_info_blocks() { + return rbm_alloc_info_blocks; + } struct ool_write_stats_t { io_stat_t extents; @@ -387,6 +398,8 @@ private: on_destruct_func_t on_destruct; const src_t src; + + std::vector rbm_alloc_info_blocks; }; using TransactionRef = Transaction::Ref; diff --git a/src/test/crimson/seastore/test_randomblock_manager.cc b/src/test/crimson/seastore/test_randomblock_manager.cc index 563db420e205a..223f540293981 100644 --- a/src/test/crimson/seastore/test_randomblock_manager.cc +++ b/src/test/crimson/seastore/test_randomblock_manager.cc @@ -133,7 +133,7 @@ struct rbm_test_t : public seastar_test_suite_t, logger().debug("free_extent: start {} len {}", off * DEFAULT_BLOCK_SIZE, len * DEFAULT_BLOCK_SIZE); rbm_manager->add_free_extent(t.allocated_blocks, off * DEFAULT_BLOCK_SIZE, - len * DEFAULT_BLOCK_SIZE).unsafe_get(); + len * DEFAULT_BLOCK_SIZE); } }