});
}
-BtreeLBAManager::complete_lba_mapping_ret
-BtreeLBAManager::complete_indirect_lba_mapping(
- Transaction &t,
- LBAMapping mapping)
-{
- assert(mapping.is_viewable());
- assert(mapping.is_indirect());
- if (mapping.is_complete_indirect()) {
- return complete_lba_mapping_iertr::make_ready_future<
- LBAMapping>(std::move(mapping));
- }
- auto c = get_context(t);
- return with_btree_state<LBABtree, LBAMapping>(
- cache,
- c,
- std::move(mapping),
- [this, c](auto &btree, auto &mapping) {
- return resolve_indirect_cursor(c, btree, *mapping.indirect_cursor
- ).si_then([&mapping](auto cursor) {
- mapping.direct_cursor = std::move(cursor);
- });
- });
-}
-
void BtreeLBAManager::register_metrics()
{
LOG_PREFIX(BtreeLBAManager::register_metrics);
laddr_t laddr,
extent_len_t len) final;
- complete_lba_mapping_ret complete_indirect_lba_mapping(
- Transaction &t,
- LBAMapping mapping) final;
-
private:
Cache &cache;
laddr_t laddr,
extent_len_t len) = 0;
- using complete_lba_mapping_iertr = get_mappings_iertr;
- using complete_lba_mapping_ret =
- complete_lba_mapping_iertr::future<LBAMapping>;
- /*
- * Completes an incomplete indirect mappings
- *
- * No effect if the indirect mapping is already complete
- */
- virtual complete_lba_mapping_ret complete_indirect_lba_mapping(
- Transaction &t,
- LBAMapping mapping) = 0;
-
virtual ~LBAManager() {}
};
using LBAManagerRef = std::unique_ptr<LBAManager>;
LBAMapping mapping)
{
LOG_PREFIX(TransactionManager::_remove_indirect_mapping);
- mapping = co_await lba_manager->complete_indirect_lba_mapping(t, std::move(mapping)
- );
+ mapping = co_await complete_mapping(t, std::move(mapping));
auto ret = get_extent_if_linked(t, *(mapping.direct_cursor));
if (ret.has_child()) {
auto extent = co_await ret.template get_child_fut_as<LogicalChildNode>();
co_await pin.co_refresh();
if (pin.is_indirect()) {
- pin = co_await lba_manager->complete_indirect_lba_mapping(
- t, std::move(pin));
+ pin = co_await complete_mapping(t, std::move(pin));
}
extent_len_t direct_partial_off = partial_off;
Transaction &t,
LBACursorRef cursor);
+ using complete_mapping_iertr = base_iertr;
+ using complete_mapping_ret = complete_mapping_iertr::future<LBAMapping>;
+ complete_mapping_ret complete_mapping(
+ Transaction &t,
+ LBAMapping mapping) {
+ if (mapping.is_complete()) {
+ co_return co_await mapping.refresh();
+ } else {
+ ceph_assert(mapping.indirect_cursor);
+ co_return co_await resolve_cursor_to_mapping(
+ t,
+ std::move(mapping.indirect_cursor));
+ }
+ }
+
using LBALeafNode = lba::LBALeafNode;
get_child_ret_t<LBALeafNode, LogicalChildNode> get_extent_if_linked(
Transaction &t,
SUBDEBUGT(seastore_tm, "{} into {} remaps ...",
t, pin, remaps.size());
co_await pin.co_refresh();
- pin = co_await lba_manager->complete_indirect_lba_mapping(t, pin);
+ pin = co_await complete_mapping(t, std::move(pin));
} else {
laddr_t original_laddr = pin.get_key();
extent_len_t original_len = pin.get_length();