We need to properly release the space after commit.
Signed-off-by: Samuel Just <sjust@redhat.com>
}
Cache::retire_extent_ret Cache::retire_extent_if_cached(
- Transaction &t, paddr_t addr)
+ Transaction &t, paddr_t addr, extent_len_t length)
{
if (auto ext = t.write_set.find_offset(addr); ext != t.write_set.end()) {
logger().debug("{}: found {} in t.write_set", __func__, addr);
return retire_extent_ertr::now();
});
} else {
+ t.add_to_retired_uncached(addr, length);
return retire_extent_ertr::now();
}
}
i->get_paddr(),
i->get_length());
}
+ for (auto &i: t.retired_uncached) {
+ cleaner->mark_space_free(
+ i.first,
+ i.second);
+ }
}
for (auto &i: t.mutated_block_list) {
using retire_extent_ertr = base_ertr;
using retire_extent_ret = retire_extent_ertr::future<>;
retire_extent_ret retire_extent_if_cached(
- Transaction &t, paddr_t addr);
+ Transaction &t, paddr_t addr, extent_len_t length);
/**
* get_root
struct ref_update_result_t {
unsigned refcount = 0;
paddr_t addr;
+ extent_len_t length = 0;
};
using ref_ertr = base_ertr::extend<
crimson::ct_error::enoent>;
out.refcount += delta;
return out;
}).safe_then([](auto result) {
- return ref_update_result_t{result.refcount, result.paddr};
+ return ref_update_result_t{
+ result.refcount,
+ result.paddr,
+ result.len
+ };
});
}
}
}
+ void add_to_retired_uncached(paddr_t addr, extent_len_t length) {
+ retired_uncached.emplace_back(std::make_pair(addr, length));
+ }
+
void add_to_read_set(CachedExtentRef ref) {
if (is_weak()) return;
///< if != NULL_SEG_ID, release this segment after completion
segment_id_t to_release = NULL_SEG_ID;
+ std::vector<std::pair<paddr_t, extent_len_t>> retired_uncached;
+
public:
Transaction(
OrderingHandle &&handle,
logger().debug(
"TransactionManager::dec_ref: offset {} refcount 0",
offset);
- return cache->retire_extent_if_cached(t, result.addr).safe_then([] {
+ return cache->retire_extent_if_cached(
+ t, result.addr, result.length
+ ).safe_then([] {
return ref_ret(
ref_ertr::ready_future_marker{},
0);