*/
virtual ref_ret decref_extent(
Transaction &t,
- laddr_t addr) = 0;
+ laddr_t addr,
+ bool cascade_remove) = 0;
/**
* Increments ref count on extent
BtreeLBAManager::update_refcount(
Transaction &t,
laddr_t addr,
- int delta)
+ int delta,
+ bool cascade_remove)
{
LOG_PREFIX(BtreeLBAManager::update_refcount);
TRACET("laddr={}, delta={}", t, addr, delta);
return out;
},
nullptr
- ).si_then([&t, addr, delta, FNAME, this](auto result) {
+ ).si_then([&t, addr, delta, FNAME, this, cascade_remove](auto result) {
DEBUGT("laddr={}, delta={} done -- {}", t, addr, delta, result);
auto fut = ref_iertr::make_ready_future<
std::optional<std::pair<paddr_t, extent_len_t>>>();
- if (!result.refcount && result.pladdr.is_laddr()) {
+ if (!result.refcount && result.pladdr.is_laddr() && cascade_remove) {
fut = _decref_intermediate(
t,
result.pladdr.get_laddr(),
ref_ret decref_extent(
Transaction &t,
- laddr_t addr) final {
- return update_refcount(t, addr, -1);
+ laddr_t addr,
+ bool cascade_remove) final {
+ return update_refcount(t, addr, -1, cascade_remove);
}
ref_ret incref_extent(
Transaction &t,
laddr_t addr) final {
- return update_refcount(t, addr, 1);
+ return update_refcount(t, addr, 1, false);
}
ref_ret incref_extent(
update_refcount_ret update_refcount(
Transaction &t,
laddr_t addr,
- int delta);
+ int delta,
+ bool cascade_remove);
/**
* _update_mapping
{
LOG_PREFIX(TransactionManager::dec_ref);
TRACET("{}", t, *ref);
- return lba_manager->decref_extent(t, ref->get_laddr()
+ return lba_manager->decref_extent(t, ref->get_laddr(), true
).si_then([this, FNAME, &t, ref](auto result) {
DEBUGT("extent refcount is decremented to {} -- {}",
t, result.refcount, *ref);
});
}
-TransactionManager::ref_ret TransactionManager::dec_ref(
+TransactionManager::ref_ret TransactionManager::_dec_ref(
Transaction &t,
- laddr_t offset)
+ laddr_t offset,
+ bool cascade_remove)
{
- LOG_PREFIX(TransactionManager::dec_ref);
+ LOG_PREFIX(TransactionManager::_dec_ref);
TRACET("{}", t, offset);
- return lba_manager->decref_extent(t, offset
+ return lba_manager->decref_extent(t, offset, cascade_remove
).si_then([this, FNAME, offset, &t](auto result) -> ref_ret {
DEBUGT("extent refcount is decremented to {} -- {}~{}, {}",
t, result.refcount, offset, result.length, result.addr);
/// Remove refcount for offset
ref_ret dec_ref(
Transaction &t,
- laddr_t offset);
+ laddr_t offset) {
+ return _dec_ref(t, offset, true);
+ }
/// remove refcount for list of offset
using refs_ret = ref_iertr::future<std::vector<unsigned>>;
[this, &t, original_laddr, original_paddr,
original_len, intermediate_base, intermediate_key]
(auto &ret, auto &count, auto &original_bptr, auto &remaps) {
- return dec_ref(t, original_laddr
+ return _dec_ref(t, original_laddr, false
).si_then([this, &t, &original_bptr, &ret, &count,
&remaps, intermediate_base, intermediate_key,
original_laddr, original_paddr, original_len](auto) {
ExtentPlacementManager::dispatch_result_t dispatch_result,
std::optional<journal_seq_t> seq_to_trim = std::nullopt);
+ /// Remove refcount for offset
+ ref_ret _dec_ref(
+ Transaction &t,
+ laddr_t offset,
+ bool cascade_remove);
+
/**
* pin_to_extent
*
[=, this](auto &t) {
return lba_manager->decref_extent(
t,
- target->first
+ target->first,
+ true
).si_then([this, &t, target](auto result) {
EXPECT_EQ(result.refcount, target->second.refcount);
if (result.refcount == 0) {