if (bluefs) {
interval_set<uint64_t> 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;
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<extent_t> &bluefs_extents_vec,
- uint64_t min_alloc_size)
-{
- if (! bluefs) {
- dout(5) << "No BlueFS device found!!" << dendl;
- return 0;
- }
-
- interval_set<uint64_t> 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)
{
// then add space used by bluefs to store rocksdb
unsigned extent_count = 0;
if (bluefs) {
- interval_set<uint64_t> 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;
// 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<extent_t> 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;