From: Igor Fedotov Date: Fri, 4 Mar 2022 13:44:49 +0000 (+0300) Subject: os/bluestore: refactor bluefs get_block_extents interface X-Git-Tag: v18.0.0~1198^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e374b971fe45b285559b8e463c096905327189f5;p=ceph.git os/bluestore: refactor bluefs get_block_extents interface Signed-off-by: Igor Fedotov --- diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index 0b9bb0bba8e9..62300171c1da 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -530,7 +530,9 @@ void BlueFS::dump_block_extents(ostream& out) } } -int BlueFS::get_block_extents(unsigned id, interval_set *extents) +void BlueFS::foreach_block_extents( + unsigned id, + std::function fn) { std::lock_guard nl(nodes.lock); dout(10) << __func__ << " bdev " << id << dendl; @@ -538,11 +540,10 @@ int BlueFS::get_block_extents(unsigned id, interval_set *extents) for (auto& p : nodes.file_map) { for (auto& q : p.second->fnode.extents) { if (q.bdev == id) { - extents->insert(q.offset, q.length); + fn(q.offset, q.length); } } } - return 0; } int BlueFS::mkfs(uuid_d osd_uuid, const bluefs_layout_t& layout) diff --git a/src/os/bluestore/BlueFS.h b/src/os/bluestore/BlueFS.h index 4307507d13b9..5427426fe960 100644 --- a/src/os/bluestore/BlueFS.h +++ b/src/os/bluestore/BlueFS.h @@ -560,7 +560,9 @@ public: void dump_block_extents(std::ostream& out); /// get current extents that we own for given block device - int get_block_extents(unsigned id, interval_set *extents); + void foreach_block_extents( + unsigned id, + std::function cb); int open_for_write( std::string_view dir, diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index d1a0fe4897cc..80f44ba2b314 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -9128,16 +9128,17 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair) if (bluefs) { interval_set bluefs_extents; - int r = bluefs->get_block_extents(bluefs_layout.shared_bdev, &bluefs_extents); - ceph_assert(r == 0); - for (auto [start, len] : bluefs_extents) { - apply_for_bitset_range(start, len, alloc_size, used_blocks, - [&](uint64_t pos, mempool_dynamic_bitset& bs) { - ceph_assert(pos < bs.size()); - bs.set(pos); - } - ); - } + bluefs->foreach_block_extents( + bluefs_layout.shared_bdev, + [&](uint64_t start, uint32_t len) { + apply_for_bitset_range(start, len, alloc_size, used_blocks, + [&](uint64_t pos, mempool_dynamic_bitset& bs) { + ceph_assert(pos < bs.size()); + bs.set(pos); + } + ); + } + ); } bluefs_used_blocks = used_blocks; @@ -18231,36 +18232,6 @@ int BlueStore::invalidate_allocation_file_on_bluefs() return 0; } -//----------------------------------------------------------------------------------- -// load bluefs extents into bluefs_extents_vec -int load_bluefs_extents(BlueFS *bluefs, - bluefs_layout_t *bluefs_layout, - CephContext* cct, - const std::string &path, - std::vector &bluefs_extents_vec, - uint64_t min_alloc_size) -{ - if (! bluefs) { - dout(5) << "No BlueFS device found!!" << dendl; - return 0; - } - - interval_set bluefs_extents; - int ret = bluefs->get_block_extents(bluefs_layout->shared_bdev, &bluefs_extents); - if (ret < 0) { - derr << "failed bluefs->get_block_extents()!!" << dendl; - return ret; - } - - for (auto itr = bluefs_extents.begin(); itr != bluefs_extents.end(); itr++) { - extent_t e = { .offset = itr.get_start(), .length = itr.get_len() }; - bluefs_extents_vec.push_back(e); - } - - dout(5) << "BlueFS extent_count=" << bluefs_extents_vec.size() << dendl; - return 0; -} - //----------------------------------------------------------------------------------- int BlueStore::copy_allocator(Allocator* src_alloc, Allocator* dest_alloc, uint64_t* p_num_entries) { @@ -19044,15 +19015,13 @@ int BlueStore::add_existing_bluefs_allocation(Allocator* allocator, read_alloc_s // then add space used by bluefs to store rocksdb unsigned extent_count = 0; if (bluefs) { - interval_set bluefs_extents; - int ret = bluefs->get_block_extents(bluefs_layout.shared_bdev, &bluefs_extents); - if (ret < 0) { - return ret; - } - for (auto itr = bluefs_extents.begin(); itr != bluefs_extents.end(); extent_count++, itr++) { - allocator->init_rm_free(itr.get_start(), itr.get_len()); - stats.extent_count++; - } + bluefs->foreach_block_extents( + bluefs_layout.shared_bdev, + [&](uint64_t start, uint32_t len) { + allocator->init_rm_free(start, len); + stats.extent_count++; + } + ); } dout(5) << "bluefs extent_count=" << extent_count << dendl; @@ -19142,13 +19111,12 @@ Allocator* BlueStore::clone_allocator_without_bluefs(Allocator *src_allocator) // BlueFS stores its internal allocation outside RocksDB (FM) so we should not destage them to the allcoator-file // we are going to hide bluefs allocation during allocator-destage as they are stored elsewhere { - std::vector bluefs_extents_vec; - // load current bluefs internal allocation into a vector - load_bluefs_extents(bluefs, &bluefs_layout, cct, path, bluefs_extents_vec, min_alloc_size); - // then remove them from the shared allocator before dumping it to disk (bluefs stored them internally) - for (auto itr = bluefs_extents_vec.begin(); itr != bluefs_extents_vec.end(); ++itr) { - allocator->init_add_free(itr->offset, itr->length); - } + bluefs->foreach_block_extents( + bluefs_layout.shared_bdev, + [&] (uint64_t start, uint32_t len) { + allocator->init_add_free(start, len); + } + ); } return allocator;