using ref_ret = ref_iertr::future<ref_update_result_t>;
/**
- * Decrements ref count on extent
+ * Removes a mapping and deal with indirection
*
* @return returns resulting refcount
*/
- virtual ref_ret decref_extent(
- Transaction &t,
- laddr_t addr) = 0;
-
- /**
- * Increments ref count on extent
- *
- * @return returns resulting refcount
- */
- virtual ref_ret incref_extent(
+ virtual ref_ret remove_mapping(
Transaction &t,
laddr_t addr) = 0;
});
}
- ref_ret decref_extent(
+ ref_ret remove_mapping(
Transaction &t,
laddr_t addr) final {
return update_refcount(t, addr, -1, true
});
}
- ref_ret incref_extent(
- Transaction &t,
- laddr_t addr) final {
- return update_refcount(t, addr, 1, false
- ).si_then([](auto res) {
- return std::move(res.ref_update_res);
- });
- }
-
remap_ret remap_mappings(
Transaction &t,
LBAMappingRef orig_mapping,
});
}
-#ifdef UNIT_TESTS_BUILT
-TransactionManager::ref_ret TransactionManager::inc_ref(
- Transaction &t,
- LogicalChildNodeRef &ref)
-{
- LOG_PREFIX(TransactionManager::inc_ref);
- TRACET("{}", t, *ref);
- return lba_manager->incref_extent(t, ref->get_laddr()
- ).si_then([FNAME, ref, &t](auto result) {
- DEBUGT("extent refcount is incremented to {} -- {}",
- t, result.refcount, *ref);
- return result.refcount;
- }).handle_error_interruptible(
- ref_iertr::pass_further{},
- ct_error::assert_all{"unhandled error, TODO"});
-}
-
-TransactionManager::ref_ret TransactionManager::inc_ref(
- Transaction &t,
- laddr_t offset)
-{
- LOG_PREFIX(TransactionManager::inc_ref);
- TRACET("{}", t, offset);
- return lba_manager->incref_extent(t, offset
- ).si_then([FNAME, offset, &t](auto result) {
- DEBUGT("extent refcount is incremented to {} -- {}~0x{:x}, {}",
- t, result.refcount, offset, result.length, result.addr);
- return result.refcount;
- });
-}
-#endif
-
TransactionManager::ref_ret TransactionManager::remove(
Transaction &t,
LogicalChildNodeRef &ref)
{
LOG_PREFIX(TransactionManager::remove);
DEBUGT("{} ...", t, *ref);
- return lba_manager->decref_extent(t, ref->get_laddr()
+ return lba_manager->remove_mapping(t, ref->get_laddr()
).si_then([this, FNAME, &t, ref](auto result) {
if (result.refcount == 0) {
cache->retire_extent(t, ref);
{
LOG_PREFIX(TransactionManager::remove);
DEBUGT("{} ...", t, offset);
- return lba_manager->decref_extent(t, offset
+ return lba_manager->remove_mapping(t, offset
).si_then([this, FNAME, offset, &t](auto result) -> ref_ret {
auto fut = ref_iertr::now();
if (result.refcount == 0) {
using ref_iertr = LBAManager::ref_iertr;
using ref_ret = ref_iertr::future<extent_ref_count_t>;
-#ifdef UNIT_TESTS_BUILT
- /// Add refcount for ref
- ref_ret inc_ref(
- Transaction &t,
- LogicalChildNodeRef &ref);
-
- /// Add refcount for offset
- ref_ret inc_ref(
- Transaction &t,
- laddr_t offset);
-#endif
-
/**
* remove
*
(void) with_trans_intr(
*t.t,
[=, this](auto &t) {
- return lba_manager->decref_extent(
+ return lba_manager->remove_mapping(
t,
target->first
).si_then([this, &t, target](auto result) {
}
}
- auto incref_mapping(
- test_transaction_t &t,
- laddr_t addr) {
- return incref_mapping(t, t.mappings.find(addr));
- }
-
- void incref_mapping(
- test_transaction_t &t,
- test_lba_mapping_t::iterator target) {
- ceph_assert(target->second.refcount > 0);
- target->second.refcount++;
- auto refcnt = with_trans_intr(
- *t.t,
- [=, this](auto &t) {
- return lba_manager->incref_extent(
- t,
- target->first);
- }).unsafe_get().refcount;
- EXPECT_EQ(refcnt, target->second.refcount);
- }
-
std::vector<laddr_t> get_mapped_addresses() {
std::vector<laddr_t> addresses;
addresses.reserve(test_lba_mappings.size());
check_mappings(t);
check_mappings();
}
- for (auto &ret : rets) {
- incref_mapping(t, ret->get_key());
- decref_mapping(t, ret->get_key());
- }
}
logger().debug("submitting transaction");
submit_test_transaction(std::move(t));
auto t = create_transaction();
for (unsigned i = 0; i != addresses.size(); ++i) {
if (i % 2 == 0) {
- incref_mapping(t, addresses[i]);
- decref_mapping(t, addresses[i]);
decref_mapping(t, addresses[i]);
}
logger().debug("submitting transaction");
auto addresses = get_mapped_addresses();
auto t = create_transaction();
for (unsigned i = 0; i != addresses.size(); ++i) {
- incref_mapping(t, addresses[i]);
- decref_mapping(t, addresses[i]);
decref_mapping(t, addresses[i]);
}
check_mappings(t);
return pin;
}
- void inc_ref(test_transaction_t &t, laddr_t offset) {
- ceph_assert(test_mappings.contains(offset, t.mapping_delta));
- ceph_assert(test_mappings.get(offset, t.mapping_delta).refcount > 0);
-
- auto refcnt = with_trans_intr(*(t.t), [&](auto& trans) {
- return tm->inc_ref(trans, offset);
- }).unsafe_get();
- auto check_refcnt = test_mappings.inc_ref(offset, t.mapping_delta);
- EXPECT_EQ(refcnt, check_refcnt);
- }
-
- void dec_ref(test_transaction_t &t, laddr_t offset) {
+ void remove(test_transaction_t &t, laddr_t offset) {
ceph_assert(test_mappings.contains(offset, t.mapping_delta));
ceph_assert(test_mappings.get(offset, t.mapping_delta).refcount > 0);
'a');
ASSERT_EQ(ADDR, extent->get_laddr());
check_mappings(t);
- dec_ref(t, ADDR);
+ remove(t, ADDR);
check_mappings(t);
extent = alloc_extent(
{
auto t = create_transaction();
for (unsigned i = 0; i < 240; ++i) {
- dec_ref(
+ remove(
t,
get_laddr_hint(i * SIZE));
}
});
}
-TEST_P(tm_single_device_test_t, inc_dec_ref)
-{
- constexpr size_t SIZE = 4096;
- run_async([this] {
- laddr_t ADDR = get_laddr_hint(0xFF * SIZE);
- {
- auto t = create_transaction();
- auto extent = alloc_extent(
- t,
- ADDR,
- SIZE,
- 'a');
- ASSERT_EQ(ADDR, extent->get_laddr());
- check_mappings(t);
- check();
- submit_transaction(std::move(t));
- check();
- }
- replay();
- {
- auto t = create_transaction();
- inc_ref(t, ADDR);
- check_mappings(t);
- check();
- submit_transaction(std::move(t));
- check();
- }
- {
- auto t = create_transaction();
- dec_ref(t, ADDR);
- check_mappings(t);
- check();
- submit_transaction(std::move(t));
- check();
- }
- replay();
- {
- auto t = create_transaction();
- dec_ref(t, ADDR);
- check_mappings(t);
- check();
- submit_transaction(std::move(t));
- check();
- }
- });
-}
-
TEST_P(tm_single_device_test_t, cause_lba_split)
{
constexpr size_t SIZE = 4096;
get_laddr_hint(TOTAL + (k * PADDING_SIZE)),
PADDING_SIZE);
for (auto &padding : paddings) {
- dec_ref(t, padding->get_laddr());
+ remove(t, padding->get_laddr());
}
}
submit_transaction(std::move(t));