diff options
author | myoungwon oh <myoungwon.oh@samsung.com> | 2021-11-19 16:56:16 +0900 |
---|---|---|
committer | myoungwon oh <ohmyoungwon@gmail.com> | 2022-01-19 01:32:18 +0900 |
commit | 2745fd1ab138b255b4a060183739de3703f02658 (patch) | |
tree | 9ef6dfd4109940ef1803272773a4c6c36dd0459b | |
parent | 374c60e2a0658247f7d6164deb0f457d9ed5b861 (diff) | |
download | ceph-2745fd1ab138b255b4a060183739de3703f02658.tar.gz |
seastore: changes due to adding blk_paddr_t
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
4 files changed, 63 insertions, 70 deletions
diff --git a/src/crimson/os/seastore/random_block_manager.h b/src/crimson/os/seastore/random_block_manager.h index ee707478a2b..05d90205a89 100644 --- a/src/crimson/os/seastore/random_block_manager.h +++ b/src/crimson/os/seastore/random_block_manager.h @@ -100,5 +100,15 @@ public: virtual ~RandomBlockManager() {} }; using RandomBlockManagerRef = std::unique_ptr<RandomBlockManager>; +using blk_no_t = uint64_t; +using rbm_abs_addr = uint64_t; +inline rbm_abs_addr convert_paddr_to_abs_addr(paddr_t& paddr) { + blk_paddr_t& blk_addr = paddr.as_blk_paddr(); + return blk_addr.get_block_off(); +} + +inline paddr_t convert_abs_addr_to_paddr(rbm_abs_addr addr, device_id_t d_id) { + return paddr_t::make_blk_paddr(d_id, addr); +} } 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 4906cad30bc..ef5eca19cc9 100644 --- a/src/crimson/os/seastore/random_block_manager/nvme_manager.cc +++ b/src/crimson/os/seastore/random_block_manager/nvme_manager.cc @@ -21,7 +21,7 @@ namespace { namespace crimson::os::seastore { NVMeManager::write_ertr::future<> NVMeManager::rbm_sync_block_bitmap( - rbm_bitmap_block_t &block, blk_id_t block_no) + rbm_bitmap_block_t &block, blk_no_t block_no) { bufferptr bptr; try { @@ -67,7 +67,7 @@ NVMeManager::mkfs_ertr::future<> NVMeManager::initialize_blk_alloc_area() { /* initialize bitmap blocks as unused */ auto max = max_block_by_bitmap_block(); auto max_block = super.size / super.block_size; - blk_id_t end = round_up_to(max_block, max) - 1; + blk_no_t end = round_up_to(max_block, max) - 1; logger().debug(" init start {} end {} ", start, end); return rbm_sync_block_bitmap_by_range( start, @@ -123,10 +123,8 @@ NVMeManager::mkfs_ertr::future<> NVMeManager::mkfs(mkfs_config_t config) { logger().debug("path {}", path); return _open_device(path).safe_then([this, &config]() { - blk_paddr_t addr = convert_paddr_to_blk_paddr( - config.start, - config.block_size, - config.blocks_per_segment); + rbm_abs_addr addr = convert_paddr_to_abs_addr( + config.start); return read_rbm_header(addr).safe_then([](auto super) { logger().debug(" already exists "); return mkfs_ertr::now(); @@ -134,14 +132,10 @@ NVMeManager::mkfs_ertr::future<> NVMeManager::mkfs(mkfs_config_t config) crimson::ct_error::enoent::handle([this, &config] (auto) { super.uuid = uuid_d(); // TODO super.magic = 0xFF; // TODO - super.start = convert_paddr_to_blk_paddr( - config.start, - config.block_size, - config.blocks_per_segment); - super.end = convert_paddr_to_blk_paddr( - config.end, - config.block_size, - config.blocks_per_segment); + super.start = convert_paddr_to_abs_addr( + config.start); + super.end = convert_paddr_to_abs_addr( + config.end); super.block_size = config.block_size; super.size = config.total_size; super.free_block_count = config.total_size/config.block_size - 2; @@ -187,7 +181,7 @@ NVMeManager::find_block_ret NVMeManager::find_free_block(Transaction &t, size_t auto bp = bufferptr(ceph::buffer::create_page_aligned(super.block_size)); return seastar::do_with(uint64_t(0), uint64_t(super.start_alloc_area), - interval_set<blk_id_t>(), + interval_set<blk_no_t>(), bp, [&, this] (auto &allocated, auto &addr, auto &alloc_extent, auto &bp) mutable { return crimson::repeat( @@ -275,10 +269,8 @@ NVMeManager::allocate_ret NVMeManager::alloc_extent( if (!alloc_extent.empty()) { rbm_alloc_delta_t alloc_info; for (auto p : alloc_extent) { - paddr_t paddr = convert_blk_paddr_to_paddr( + paddr_t paddr = convert_abs_addr_to_paddr( p.first * super.block_size, - super.block_size, - super.blocks_per_segment, super.device_id); size_t len = p.second * super.block_size; alloc_info.alloc_blk_ranges.push_back(std::make_pair(paddr, len)); @@ -288,10 +280,8 @@ NVMeManager::allocate_ret NVMeManager::alloc_extent( } else { return crimson::ct_error::enospc::make(); } - paddr_t paddr = convert_blk_paddr_to_paddr( + paddr_t paddr = convert_abs_addr_to_paddr( alloc_extent.range_start() * super.block_size, - super.block_size, - super.blocks_per_segment, super.device_id); return allocate_ret( allocate_ertr::ready_future_marker{}, @@ -306,13 +296,11 @@ NVMeManager::allocate_ret NVMeManager::alloc_extent( } void NVMeManager::add_free_extent( - std::vector<rbm_alloc_delta_t>& v, blk_paddr_t from, size_t len) + std::vector<rbm_alloc_delta_t>& v, rbm_abs_addr from, size_t len) { ceph_assert(!(len % super.block_size)); - paddr_t paddr = convert_blk_paddr_to_paddr( + paddr_t paddr = convert_abs_addr_to_paddr( from, - super.block_size, - super.blocks_per_segment, super.device_id); rbm_alloc_delta_t alloc_info; alloc_info.alloc_blk_ranges.push_back(std::make_pair(paddr, len)); @@ -321,7 +309,7 @@ void NVMeManager::add_free_extent( } NVMeManager::write_ertr::future<> NVMeManager::rbm_sync_block_bitmap_by_range( - blk_id_t start, blk_id_t end, bitmap_op_types_t op) + blk_no_t start, blk_no_t end, bitmap_op_types_t op) { auto addr = super.start_alloc_area + (start / max_block_by_bitmap_block()) @@ -455,12 +443,10 @@ NVMeManager::write_ertr::future<> NVMeManager::sync_allocation( (alloc.op == rbm_alloc_delta_t::op_types_t::SET) ? bitmap_op_types_t::ALL_SET : bitmap_op_types_t::ALL_CLEAR; - blk_paddr_t addr = convert_paddr_to_blk_paddr( - range.first, - super.block_size, - super.blocks_per_segment); - blk_id_t start = addr / super.block_size; - blk_id_t end = start + + rbm_abs_addr addr = convert_paddr_to_abs_addr( + range.first); + blk_no_t start = addr / super.block_size; + blk_no_t end = start + (round_up_to(range.second, super.block_size)) / super.block_size - 1; return rbm_sync_block_bitmap_by_range( @@ -498,10 +484,7 @@ NVMeManager::open_ertr::future<> NVMeManager::open( { logger().debug("open: path{}", path); - blk_paddr_t addr = convert_paddr_to_blk_paddr( - paddr, - super.block_size, - super.blocks_per_segment); + rbm_abs_addr addr = convert_paddr_to_abs_addr(paddr); return _open_device(path ).safe_then([this, addr]() { return read_rbm_header(addr).safe_then([&](auto s) @@ -524,7 +507,7 @@ NVMeManager::open_ertr::future<> NVMeManager::open( } NVMeManager::write_ertr::future<> NVMeManager::write( - blk_paddr_t addr, + rbm_abs_addr addr, bufferptr &bptr) { ceph_assert(device); @@ -538,7 +521,7 @@ NVMeManager::write_ertr::future<> NVMeManager::write( } NVMeManager::read_ertr::future<> NVMeManager::read( - blk_paddr_t addr, + rbm_abs_addr addr, bufferptr &bptr) { ceph_assert(device); @@ -590,7 +573,7 @@ NVMeManager::write_ertr::future<> NVMeManager::write_rbm_header() } NVMeManager::read_ertr::future<rbm_metadata_header_t> NVMeManager::read_rbm_header( - blk_paddr_t addr) + rbm_abs_addr addr) { ceph_assert(device); bufferptr bptr = @@ -679,7 +662,7 @@ NVMeManager::check_bitmap_blocks_ertr::future<> NVMeManager::check_bitmap_blocks } NVMeManager::write_ertr::future<> NVMeManager::write( - blk_paddr_t addr, + rbm_abs_addr addr, bufferlist &bl) { ceph_assert(device); 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 fa94cfea272..f0f500c72be 100644 --- a/src/crimson/os/seastore/random_block_manager/nvme_manager.h +++ b/src/crimson/os/seastore/random_block_manager/nvme_manager.h @@ -218,7 +218,7 @@ public: write_ertr::future<> complete_allocation(Transaction &t) final; open_ertr::future<> _open_device(const std::string path); - read_ertr::future<rbm_metadata_header_t> read_rbm_header(blk_paddr_t addr); + read_ertr::future<rbm_metadata_header_t> read_rbm_header(rbm_abs_addr addr); write_ertr::future<> write_rbm_header(); size_t get_size() const final { return super.size; }; @@ -229,7 +229,7 @@ public: return (super.block_size - ceph::encoded_sizeof_bounded<rbm_bitmap_block_t>()) * 8; } - uint64_t convert_block_no_to_bitmap_block(blk_id_t block_no) + uint64_t convert_block_no_to_bitmap_block(blk_no_t block_no) { ceph_assert(super.block_size); return block_no / max_block_by_bitmap_block(); @@ -240,7 +240,7 @@ public: * * return block id using address where freebitmap is stored and offset */ - blk_id_t convert_bitmap_block_no_to_block_id(uint64_t offset, blk_paddr_t addr) + blk_no_t convert_bitmap_block_no_to_block_id(uint64_t offset, rbm_abs_addr addr) { ceph_assert(super.block_size); // freebitmap begins at block 1 @@ -261,7 +261,7 @@ public: using find_block_ertr = crimson::errorator< crimson::ct_error::input_output_error, crimson::ct_error::enoent>; - using find_block_ret = find_block_ertr::future<interval_set<blk_id_t>>; + using find_block_ret = find_block_ertr::future<interval_set<blk_no_t>>; /* * find_free_block * @@ -282,7 +282,7 @@ public: * */ write_ertr::future<> rbm_sync_block_bitmap( - rbm_bitmap_block_t &block, blk_id_t block_no); + rbm_bitmap_block_t &block, blk_no_t block_no); using check_bitmap_blocks_ertr = crimson::errorator< crimson::ct_error::input_output_error, @@ -328,11 +328,11 @@ public: b_block.buf.append(bitmap_blk); } - blk_paddr_t get_blk_paddr_by_block_no(blk_id_t id) { + rbm_abs_addr get_blk_paddr_by_block_no(blk_no_t id) { return (id * super.block_size) + super.start; } - int num_block_between_blk_ids(blk_id_t start, blk_id_t end) { + int num_block_between_blk_ids(blk_no_t start, blk_no_t end) { auto max = max_block_by_bitmap_block(); auto block_start = start / max; auto block_end = end / max; @@ -340,7 +340,7 @@ public: } write_ertr::future<> rbm_sync_block_bitmap_by_range( - blk_id_t start, blk_id_t end, bitmap_op_types_t op); + blk_no_t start, blk_no_t end, bitmap_op_types_t op); void add_cont_bitmap_blocks_to_buf( bufferlist& buf, int num_block, bitmap_op_types_t op) { rbm_bitmap_block_t b_block(super.block_size); @@ -355,11 +355,11 @@ public: } } - write_ertr::future<> write(blk_paddr_t addr, bufferlist &bl); + write_ertr::future<> write(rbm_abs_addr addr, bufferlist &bl); write_ertr::future<> sync_allocation( std::vector<rbm_alloc_delta_t>& alloc_blocks); void add_free_extent( - std::vector<rbm_alloc_delta_t>& v, blk_paddr_t from, size_t len); + std::vector<rbm_alloc_delta_t>& v, rbm_abs_addr from, size_t len); uint32_t get_blocks_per_segment() const final { return super.blocks_per_segment; diff --git a/src/test/crimson/seastore/test_randomblock_manager.cc b/src/test/crimson/seastore/test_randomblock_manager.cc index 02f266454da..39c37f63297 100644 --- a/src/test/crimson/seastore/test_randomblock_manager.cc +++ b/src/test/crimson/seastore/test_randomblock_manager.cc @@ -55,10 +55,12 @@ struct rbm_test_t : seastar::future<> set_up_fut() final { device.reset(new nvme_device::TestMemory(DEFAULT_TEST_SIZE)); rbm_manager.reset(new NVMeManager(device.get(), std::string())); - config.start = paddr_t::make_seg_paddr(0, 0, 0); - config.end = paddr_t::make_seg_paddr(0, 0, DEFAULT_TEST_SIZE); + device_id_t d_id = 1 << (std::numeric_limits<device_id_t>::digits - 1); + config.start = paddr_t::make_blk_paddr(d_id, 0); + config.end = paddr_t::make_blk_paddr(d_id, DEFAULT_TEST_SIZE); config.block_size = DEFAULT_BLOCK_SIZE; config.total_size = DEFAULT_TEST_SIZE; + config.device_id = d_id; return tm_setup(); } @@ -73,10 +75,9 @@ struct rbm_test_t : } auto read_rbm_header() { - blk_paddr_t addr = convert_paddr_to_blk_paddr( + rbm_abs_addr addr = convert_paddr_to_abs_addr( config.start, - config.block_size, - config.blocks_per_segment); + config.block_size); return rbm_manager->read_rbm_header(addr).unsafe_get0(); } @@ -102,10 +103,9 @@ struct rbm_test_t : if (!extent.empty()) { rbm_alloc_delta_t alloc_info; for (auto p : extent) { - paddr_t paddr = convert_blk_paddr_to_paddr( + paddr_t paddr = convert_abs_addr_to_paddr( p.first * block_size, block_size, - config.blocks_per_segment, 0); size_t len = p.second * block_size; alloc_info.alloc_blk_ranges.push_back(std::make_pair(paddr, len)); @@ -115,7 +115,7 @@ struct rbm_test_t : } } - void free_extent(rbm_transaction &t, interval_set<blk_id_t> range) { + void free_extent(rbm_transaction &t, interval_set<blk_no_t> range) { for (auto [off, len] : range) { logger().debug("free_extent: start {} len {}", off * DEFAULT_BLOCK_SIZE, len * DEFAULT_BLOCK_SIZE); @@ -124,16 +124,15 @@ struct rbm_test_t : } } - interval_set<blk_id_t> get_allocated_blk_ids(rbm_transaction &t) { + interval_set<blk_no_t> get_allocated_blk_ids(rbm_transaction &t) { auto allocated_blocks = t.get_rbm_allocated_blocks(); - interval_set<blk_id_t> alloc_ids; + interval_set<blk_no_t> alloc_ids; for (auto p : allocated_blocks) { for (auto b : p.alloc_blk_ranges) { - blk_paddr_t addr = - convert_paddr_to_blk_paddr( + rbm_abs_addr addr = + convert_paddr_to_abs_addr( b.first, - block_size, - config.blocks_per_segment); + block_size); alloc_ids.insert(addr / block_size, b.second / block_size); } } @@ -141,10 +140,10 @@ struct rbm_test_t : return alloc_ids; } - bool check_ids_are_allocated(interval_set<blk_id_t> &ids, bool allocated = true) { + bool check_ids_are_allocated(interval_set<blk_no_t> &ids, bool allocated = true) { bool ret = true; for (auto r : ids) { - for (blk_id_t id = r.first; id < r.first + r.second; id++) { + for (blk_no_t id = r.first; id < r.first + r.second; id++) { auto addr = rbm_manager->get_start_block_alloc_area() + (id / rbm_manager->max_block_by_bitmap_block()) * DEFAULT_BLOCK_SIZE; @@ -287,15 +286,16 @@ TEST_F(rbm_test_t, block_alloc_free_test) TEST_F(rbm_test_t, many_block_alloc) { run_async([this] { - config.start = paddr_t::make_seg_paddr(0, 0, 0); - config.end = paddr_t::make_seg_paddr(0, 0, DEFAULT_TEST_SIZE * 1024); + device_id_t d_id = 1 << (std::numeric_limits<device_id_t>::digits - 1); + config.start = paddr_t::make_blk_paddr(d_id, 0); + config.end = paddr_t::make_blk_paddr(d_id, (DEFAULT_TEST_SIZE * 1024)); config.block_size = DEFAULT_BLOCK_SIZE; config.total_size = DEFAULT_TEST_SIZE * 1024; mkfs(); open(); auto max = rbm_manager->max_block_by_bitmap_block(); rbm_manager->rbm_sync_block_bitmap_by_range(max + 10, max + 14, bitmap_op_types_t::ALL_SET).unsafe_get0(); - interval_set<blk_id_t> alloc_ids; + interval_set<blk_no_t> alloc_ids; alloc_ids.insert(max + 12, 2); ASSERT_TRUE(check_ids_are_allocated(alloc_ids)); alloc_ids.clear(); @@ -349,7 +349,7 @@ TEST_F(rbm_test_t, check_free_blocks) rbm_manager->check_bitmap_blocks().unsafe_get0(); ASSERT_TRUE(rbm_manager->get_free_blocks() == DEFAULT_TEST_SIZE/DEFAULT_BLOCK_SIZE - 5); auto free = rbm_manager->get_free_blocks(); - interval_set<blk_id_t> alloc_ids; + interval_set<blk_no_t> alloc_ids; auto t = create_rbm_transaction(); alloc_extent(*t, DEFAULT_BLOCK_SIZE * 4); alloc_ids = get_allocated_blk_ids(*t); |