*
*/
return find_free_block(t, size
- ).safe_then([] (auto alloc_extent) mutable
+ ).safe_then([this] (auto alloc_extent) mutable
-> allocate_ertr::future<> {
logger().debug("after find_free_block: allocated {}", alloc_extent);
if (!alloc_extent.empty()) {
- rbm_alloc_delta_t alloc_info {
- extent_types_t::RBM_ALLOC_INFO,
- alloc_extent,
- rbm_alloc_delta_t::op_types_t::SET
- };
+ rbm_alloc_delta_t alloc_info;
+ for (auto p : alloc_extent) {
+ paddr_t paddr = convert_blk_paddr_to_paddr(
+ p.first * super.block_size,
+ super.block_size,
+ super.blocks_per_segment,
+ 0);
+ size_t len = p.second * super.block_size;
+ alloc_info.alloc_blk_ranges.push_back(std::make_pair(paddr, len));
+ alloc_info.op = rbm_alloc_delta_t::op_types_t::SET;
+ }
// TODO: add alloc info to delta
} else {
return crimson::ct_error::enospc::make();
std::vector<rbm_alloc_delta_t>& v, blk_paddr_t from, size_t len)
{
ceph_assert(!(len % super.block_size));
- blk_id_t blk_id_start = from / super.block_size;
-
- interval_set<blk_id_t> free_extent;
- free_extent.insert(blk_id_start, len / super.block_size);
- rbm_alloc_delta_t alloc_info {
- extent_types_t::RBM_ALLOC_INFO,
- free_extent,
- rbm_alloc_delta_t::op_types_t::CLEAR
- };
+ paddr_t paddr = convert_blk_paddr_to_paddr(
+ from,
+ super.block_size,
+ super.blocks_per_segment,
+ 0);
+ rbm_alloc_delta_t alloc_info;
+ 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();
}
[&, this] (auto &alloc_blocks) mutable {
return crimson::do_for_each(alloc_blocks,
[this](auto &alloc) {
- return crimson::do_for_each(alloc.alloc_blk_ids,
+ return crimson::do_for_each(alloc.alloc_blk_ranges,
[this, &alloc] (auto &range) -> write_ertr::future<> {
logger().debug("range {} ~ {}", range.first, range.second);
bitmap_op_types_t op =
(alloc.op == rbm_alloc_delta_t::op_types_t::SET) ?
bitmap_op_types_t::ALL_SET :
bitmap_op_types_t::ALL_CLEAR;
- return rbm_sync_block_bitmap_by_range(
+ blk_paddr_t addr = convert_paddr_to_blk_paddr(
range.first,
- range.first + range.second - 1,
+ super.block_size,
+ super.blocks_per_segment);
+ blk_id_t start = addr / super.block_size;
+ blk_id_t end = start +
+ (round_up_to(range.second, super.block_size)) / super.block_size
+ - 1;
+ return rbm_sync_block_bitmap_by_range(
+ start,
+ end,
op);
});
}).safe_then([this, &alloc_blocks]() mutable {
int alloc_block_count = 0;
for (const auto& b : alloc_blocks) {
- for (interval_set<blk_id_t>::const_iterator r = b.alloc_blk_ids.begin();
- r != b.alloc_blk_ids.end(); ++r) {
+ for (auto r : b.alloc_blk_ranges) {
if (b.op == rbm_alloc_delta_t::op_types_t::SET) {
- alloc_block_count += r.get_len();
+ alloc_block_count +=
+ round_up_to(r.second, super.block_size) / super.block_size;
logger().debug(" complete alloc block: start {} len {} ",
- r.get_start(), r.get_len());
+ r.first, r.second);
} else {
- alloc_block_count -= r.get_len();
- logger().debug(" complete free block: start {} len {} ",
- r.get_start(), r.get_len());
+ alloc_block_count -=
+ round_up_to(r.second, super.block_size) / super.block_size;
+ logger().debug(" complete alloc block: start {} len {} ",
+ r.first, r.second);
}
}
}
auto tt = create_mutate_transaction(); // dummy transaction
auto extent = rbm_manager->find_free_block(*tt, size).unsafe_get0();
if (!extent.empty()) {
- rbm_alloc_delta_t alloc_info {
- extent_types_t::RBM_ALLOC_INFO,
- extent,
- rbm_alloc_delta_t::op_types_t::SET
- };
+ rbm_alloc_delta_t alloc_info;
+ for (auto p : extent) {
+ paddr_t paddr = convert_blk_paddr_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));
+ alloc_info.op = rbm_alloc_delta_t::op_types_t::SET;
+ }
t.add_rbm_allocated_blocks(alloc_info);
}
}
auto allocated_blocks = t.get_rbm_allocated_blocks();
interval_set<blk_id_t> alloc_ids;
for (auto p : allocated_blocks) {
- alloc_ids.insert(p.alloc_blk_ids);
+ for (auto b : p.alloc_blk_ranges) {
+ blk_paddr_t addr =
+ convert_paddr_to_blk_paddr(
+ b.first,
+ block_size,
+ config.blocks_per_segment);
+ alloc_ids.insert(addr / block_size, b.second / block_size);
+ }
}
logger().debug(" get allocated blockid {}", alloc_ids);
return alloc_ids;