ceph_assert(extents_index.empty());
}
-// TODO: this method can probably be removed in the future
-Cache::retire_extent_ret Cache::retire_extent_addr(
- Transaction &t, paddr_t paddr, extent_len_t length)
-{
- LOG_PREFIX(Cache::retire_extent_addr);
- TRACET("retire {}~0x{:x}", t, paddr, length);
-
- assert(paddr.is_real_location());
-
- CachedExtentRef ext;
- auto result = t.get_extent(paddr, &ext);
- if (result == Transaction::get_extent_ret::PRESENT) {
- DEBUGT("retire {}~0x{:x} on t -- {}",
- t, paddr, length, *ext);
- t.add_present_to_retired_set(ext);
- return retire_extent_iertr::now();
- } else if (result == Transaction::get_extent_ret::RETIRED) {
- ERRORT("retire {}~0x{:x} failed, already retired -- {}",
- t, paddr, length, *ext);
- ceph_abort();
- }
-
- // any record-relative or delayed paddr must have been on the transaction
- assert(paddr.is_absolute());
-
- // absent from transaction
- // retiring is not included by the cache hit metrics
- ext = query_cache(paddr);
- if (ext) {
- DEBUGT("retire {}~0x{:x} in cache -- {}", t, paddr, length, *ext);
- } else {
- // add a new placeholder to Cache
- ext = CachedExtent::make_cached_extent_ref<
- RetiredExtentPlaceholder>(length);
- ext->init(
- CachedExtent::extent_state_t::CLEAN, paddr,
- PLACEMENT_HINT_NULL, NULL_GENERATION, TRANS_ID_NULL);
- DEBUGT("retire {}~0x{:x} as placeholder, add extent -- {}",
- t, paddr, length, *ext);
- add_extent(ext);
- }
- t.add_absent_to_retired_set(ext);
- return retire_extent_iertr::now();
-}
-
CachedExtentRef Cache::retire_absent_extent_addr_by_type(
Transaction &t,
laddr_t laddr,
t.add_present_to_retired_set(ref);
}
- /// Declare paddr retired in t
- using retire_extent_iertr = base_iertr;
- using retire_extent_ret = base_iertr::future<>;
- retire_extent_ret retire_extent_addr(
- Transaction &t, paddr_t addr, extent_len_t length);
-
template <typename T, typename Func>
TCachedExtentRef<T> retire_absent_extent_addr(
Transaction &t,
auto refcount = cursor->get_refcount() - 1;
auto paddr = cursor->get_paddr();
auto length = cursor->get_length();
+ if (refcount == 0) {
+ auto p = cursor->parent->template cast<LBALeafNode>();
+ auto v = p->template get_child<TestBlock>(
+ t, cursor->ctx.cache, cursor->get_pos(), cursor->key);
+ if (v.has_child()) {
+ auto extent = co_await v.template get_child_fut_as<TestBlock>();
+ ceph_assert(extent);
+ cache->retire_extent(t, std::move(extent));
+ } else {
+ auto &child_pos = v.get_child_pos();
+ cache->retire_absent_extent_addr_by_type(
+ t,
+ cursor->key,
+ paddr,
+ length,
+ cursor->get_extent_type(),
+ [&child_pos, &t, laddr=cursor->key, this](auto &extent) {
+ auto lextent = extent.template cast<LogicalChildNode>();
+ assert(extent.is_logical());
+ assert(lextent->has_laddr());
+ assert(!extent.has_been_invalidated());
+ child_pos.link_child(lextent.get());
+ child_pos.invalidate_retired_placeholder(t, *cache, extent);
+ lextent->set_laddr(laddr);
+ });
+ }
+ }
co_await lba_manager->update_mapping_refcount(
t,
cursor,
-1
);
EXPECT_EQ(refcount, target->second.refcount);
- if (refcount == 0) {
- co_await cache->retire_extent_addr(
- t, paddr, length);
- }
})).unsafe_get();
if (target->second.refcount == 0) {
t.mappings.erase(target);