paddr_t addr,
extent_len_t len)
{
- // Need to mark the space as used at startup time.
- // We do not use mark_space_used after complete_commit()
- // because alloc_extent() already reserved the space.
assert(addr.get_addr_type() == paddr_types_t::RANDOM_BLOCK);
- if (background_callback->get_state() ==
- BackgroundListener::state_t::SCAN_SPACE) {
- auto rbms = rb_group->get_rb_managers();
- for (auto rbm : rbms) {
- if (addr.get_device_id() == rbm->get_device_id()) {
- if (rbm->get_start() <= addr) {
- return rbm->mark_space_used(addr, len);
- }
+ auto rbms = rb_group->get_rb_managers();
+ for (auto rbm : rbms) {
+ if (addr.get_device_id() == rbm->get_device_id()) {
+ if (rbm->get_start() <= addr) {
+ rbm->mark_space_used(addr, len);
}
}
}
}
}
+void RBMCleaner::commit_space_used(paddr_t addr, extent_len_t len)
+{
+ auto rbms = rb_group->get_rb_managers();
+ for (auto rbm : rbms) {
+ if (addr.get_device_id() == rbm->get_device_id()) {
+ if (rbm->get_start() <= addr) {
+ rbm->complete_allocation(addr, len);
+ }
+ return;
+ }
+ }
+}
+
void RBMCleaner::reserve_projected_usage(std::size_t projected_usage)
{
assert(background_callback->is_ready());
virtual void mark_space_free(paddr_t, extent_len_t) = 0;
+ virtual void commit_space_used(paddr_t, extent_len_t) = 0;
+
virtual void reserve_projected_usage(std::size_t) = 0;
virtual void release_projected_usage(std::size_t) = 0;
void mark_space_used(paddr_t, extent_len_t) final;
void mark_space_free(paddr_t, extent_len_t) final;
+
+ void commit_space_used(paddr_t addr, extent_len_t len) final {
+ mark_space_used(addr, len);
+ }
void reserve_projected_usage(std::size_t) final;
void mark_space_free(paddr_t, extent_len_t) final;
+ void commit_space_used(paddr_t, extent_len_t) final;
+
void reserve_projected_usage(std::size_t) final;
void release_projected_usage(size_t) final;
}
efforts.mutate_delta_bytes += delta_stat.bytes;
+ for (auto &i: t.pre_alloc_list) {
+ epm.mark_space_free(i->get_paddr(), i->get_length());
+ }
+
auto& ool_stats = t.get_ool_write_stats();
efforts.fresh_ool_written.increment_stat(ool_stats.extents);
efforts.num_ool_records += ool_stats.num_records;
const auto t_src = t.get_src();
i->invalidate_hints();
add_extent(i, &t_src);
- epm.mark_space_used(i->get_paddr(), i->get_length());
+ epm.commit_space_used(i->get_paddr(), i->get_length());
if (is_backref_mapped_extent_node(i)) {
DEBUGT("backref_list new {} len {}",
t,
if (!backref_list.empty()) {
backref_batch_update(std::move(backref_list), start_seq);
}
+
+ for (auto &i: t.pre_alloc_list) {
+ if (!i->is_valid()) {
+ epm.mark_space_free(i->get_paddr(), i->get_length());
+ }
+ }
}
void Cache::init()
background_process.mark_space_free(addr, len);
}
+ void commit_space_used(paddr_t addr, extent_len_t len) {
+ return background_process.commit_space_used(addr, len);
+ }
+
seastar::future<> reserve_projected_usage(std::size_t projected_usage) {
return background_process.reserve_projected_usage(projected_usage);
}
cleaner->mark_space_free(addr, len);
}
+ void commit_space_used(paddr_t addr, extent_len_t len) {
+ if (state < state_t::SCAN_SPACE) {
+ return;
+ }
+ assert(cleaner);
+ return cleaner->commit_space_used(addr, len);
+ }
+
seastar::future<> reserve_projected_usage(std::size_t projected_usage);
void release_projected_usage(std::size_t projected_usage) {