}
}
+using resolve_cursor_to_mapping_iertr = base_iertr;
+resolve_cursor_to_mapping_iertr::future<LBAMapping>
+TransactionManager::resolve_cursor_to_mapping(
+ Transaction &t,
+ LBACursorRef cursor)
+{
+ LOG_PREFIX(TransactionManager::resolve_cursor_to_mapping);
+ if (cursor->is_end() || !cursor->is_indirect()) {
+ auto ret = co_await LBAMapping::create_direct(cursor).refresh();
+ DEBUGT("{} -> {}", t, *cursor, ret);
+ co_return ret;
+ }
+
+ assert(cursor->val->refcount == EXTENT_DEFAULT_REF_COUNT);
+ assert(cursor->val->checksum == 0);
+
+ auto direct_cursors = co_await lba_manager->get_cursors(
+ t,
+ cursor->get_intermediate_key(),
+ cursor->get_length()
+ );
+
+ ceph_assert(direct_cursors.size() == 1);
+ auto& direct_cursor = direct_cursors.front();
+ auto intermediate_key = cursor->get_intermediate_key();
+ assert(!direct_cursor->is_indirect());
+ assert(direct_cursor->get_laddr() <= intermediate_key);
+ assert(direct_cursor->get_laddr() + direct_cursor->get_length()
+ >= intermediate_key + cursor->get_length());
+ auto ret = co_await LBAMapping::create_indirect(
+ std::move(direct_cursor),
+ cursor).refresh();
+ DEBUGT("{} -> {}", t, *cursor, ret);
+ co_return ret;
+}
+
TransactionManager::refs_ret TransactionManager::remove(
Transaction &t,
std::vector<laddr_t> offsets)
shard_stats_t& shard_stats;
+ using resolve_cursor_to_mapping_iertr = base_iertr;
+ resolve_cursor_to_mapping_iertr::future<LBAMapping>
+ resolve_cursor_to_mapping(
+ Transaction &t,
+ LBACursorRef cursor);
+
using LBALeafNode = lba::LBALeafNode;
struct unlinked_child_t {
LBAMapping mapping;