DEBUGT("pos={}, mapping={}, laddr={}, {}~{} updateref={}",
t, pos, mapping, laddr, offset, len, updateref);
assert(offset + len <= mapping.get_length());
- struct state_t {
- LBAMapping pos;
- LBAMapping mapping;
- laddr_t laddr;
- extent_len_t offset;
- extent_len_t len;
- };
auto c = get_context(t);
- return seastar::do_with(
- std::move(mapping),
- [this, updateref, c](auto &mapping) {
- if (updateref) {
- auto fut = update_refcount_iertr::make_ready_future<
- LBACursorRef>(mapping.direct_cursor);
- if (!mapping.direct_cursor) {
- fut = resolve_indirect_cursor(c, *mapping.indirect_cursor);
- }
- return fut.si_then([this, c, &mapping](auto cursor) {
- mapping.direct_cursor = cursor;
- assert(mapping.direct_cursor->is_viewable());
- return update_refcount(c.trans, cursor.get(), 1
- ).si_then([&mapping](auto res) {
- assert(!res.mapping.is_indirect());
- mapping.direct_cursor = std::move(res.mapping.direct_cursor);
- return std::move(mapping);
- });
- });
- } else {
- return update_refcount_iertr::make_ready_future<
- LBAMapping>(std::move(mapping));
+ if (updateref) {
+ if (!mapping.direct_cursor) {
+ mapping.direct_cursor = co_await resolve_indirect_cursor(
+ c, *mapping.indirect_cursor);
}
- }).si_then([c, this, pos=std::move(pos), len,
- offset, laddr](auto mapping) mutable {
- return seastar::do_with(
- state_t{std::move(pos), std::move(mapping), laddr, offset, len},
- [this, c](auto &state) {
- return with_btree<LBABtree>(
- cache,
- c,
- [c, &state](auto &btree) mutable {
- auto &cursor = state.pos.get_effective_cursor();
- return cursor.refresh(
- ).si_then([&state, c, &btree]() mutable {
- auto &cursor = state.pos.get_effective_cursor();
- assert(state.laddr + state.len <= cursor.key);
- auto inter_key = state.mapping.is_indirect()
- ? state.mapping.get_intermediate_key()
- : state.mapping.get_key();
- inter_key = (inter_key + state.offset).checked_to_laddr();
- return btree.insert(
- c,
- btree.make_partial_iter(c, cursor),
- state.laddr,
- lba_map_val_t{state.len, inter_key, EXTENT_DEFAULT_REF_COUNT, 0});
- }).si_then([c, &state](auto p) {
- auto &[iter, inserted] = p;
- auto &leaf_node = *iter.get_leaf_node();
- leaf_node.insert_child_ptr(
- iter.get_leaf_pos(),
- get_reserved_ptr<LBALeafNode, laddr_t>(),
- leaf_node.get_size() - 1 /*the size before the insert*/);
- auto cursor = iter.get_cursor(c);
- return state.mapping.refresh(
- ).si_then([cursor=std::move(cursor)](auto mapping) mutable {
- return clone_mapping_ret_t{
- LBAMapping(mapping.direct_cursor, std::move(cursor)),
- mapping};
- });
- });
- });
- });
- }).handle_error_interruptible(
- clone_mapping_iertr::pass_further{},
- crimson::ct_error::assert_all{"unexpected error"}
- );
+ assert(mapping.direct_cursor->is_viewable());
+ auto res = co_await update_refcount(
+ c.trans, mapping.direct_cursor.get(), 1
+ ).handle_error_interruptible(
+ clone_mapping_iertr::pass_further{},
+ crimson::ct_error::assert_all{"unexpected error"}
+ );
+ assert(!res.mapping.is_indirect());
+ mapping.direct_cursor = std::move(res.mapping.direct_cursor);
+ }
+ auto btree = co_await get_btree<LBABtree>(cache, c);
+ auto &cursor = pos.get_effective_cursor();
+ co_await cursor.refresh();
+ assert(laddr + len <= cursor.key);
+ auto inter_key = mapping.is_indirect()
+ ? mapping.get_intermediate_key()
+ : mapping.get_key();
+ inter_key = (inter_key + offset).checked_to_laddr();
+ auto p = co_await btree.insert(
+ c,
+ btree.make_partial_iter(c, cursor),
+ laddr,
+ lba_map_val_t{len, inter_key, EXTENT_DEFAULT_REF_COUNT, 0});
+ auto &[iter, inserted] = p;
+ auto &leaf_node = *iter.get_leaf_node();
+ leaf_node.insert_child_ptr(
+ iter.get_leaf_pos(),
+ get_reserved_ptr<LBALeafNode, laddr_t>(),
+ leaf_node.get_size() - 1 /*the size before the insert*/);
+ mapping = co_await mapping.refresh();
+ co_return clone_mapping_ret_t{
+ LBAMapping(mapping.direct_cursor, iter.get_cursor(c)),
+ mapping};
}
BtreeLBAManager::get_cursor_ret