});
}
+BtreeBackrefManager::check_child_trackers_ret
+BtreeBackrefManager::check_child_trackers(
+ Transaction &t) {
+ auto c = get_context(t);
+ return with_btree<BackrefBtree>(
+ cache, c,
+ [c](auto &btree) {
+ return btree.check_child_trackers(c);
+ });
+}
+
BtreeBackrefManager::scan_mapped_space_ret
BtreeBackrefManager::scan_mapped_space(
Transaction &t,
BackrefBtree::mapped_space_visitor_t f =
[&scan_visitor, block_size, FNAME, c](
paddr_t paddr, paddr_t key, extent_len_t len,
- depth_t depth, extent_types_t type) {
+ depth_t depth, extent_types_t type, BackrefBtree::iterator&) {
TRACET("tree node {}~{} {}, depth={} used",
c.trans, paddr, len, type, depth);
ceph_assert(paddr.is_absolute());
Transaction &t,
paddr_t offset) final;
+ check_child_trackers_ret check_child_trackers(Transaction &t) final;
+
scan_mapped_space_ret scan_mapped_space(
Transaction &t,
scan_mapped_space_func_t &&f) final;
Transaction &t,
paddr_t offset) = 0;
+ using check_child_trackers_ret = base_iertr::future<>;
+ virtual check_child_trackers_ret check_child_trackers(Transaction &t) = 0;
+
/**
* scan all extents in both tree and cache,
* including backref extents, logical extents and lba extents,
using iterator_fut = base_iertr::future<iterator>;
using mapped_space_visitor_t = std::function<
- void(paddr_t, node_key_t, extent_len_t, depth_t, extent_types_t)>;
+ void(paddr_t, node_key_t, extent_len_t, depth_t, extent_types_t, iterator&)>;
class iterator {
public:
root_node->get_node_meta().begin,
root_node->get_length(),
get_root().get_depth(),
- internal_node_t::TYPE);
+ internal_node_t::TYPE,
+ iter);
return lookup_root_iertr::now();
};
auto on_found_leaf =
root_node->get_node_meta().begin,
root_node->get_length(),
get_root().get_depth(),
- leaf_node_t::TYPE);
+ leaf_node_t::TYPE,
+ iter);
return lookup_root_iertr::now();
};
node->get_node_meta().begin,
node->get_length(),
depth,
- node->get_type());
+ node->get_type(),
+ iter);
return seastar::now();
};
node->get_node_meta().begin,
node->get_length(),
1,
- node->get_type());
+ node->get_type(),
+ iter);
return seastar::now();
};
namespace crimson::os::seastore {
+template <
+ typename node_key_t,
+ typename node_val_t,
+ typename internal_node_t,
+ typename leaf_node_t,
+ typename pin_t,
+ size_t node_size,
+ bool leaf_has_children>
+class FixedKVBtree;
class BackrefManager;
class SegmentProvider;
}
}
+ template <
+ typename node_key_t,
+ typename node_val_t,
+ typename internal_node_t,
+ typename leaf_node_t,
+ typename pin_t,
+ size_t node_size,
+ bool leaf_has_children>
+ friend class FixedKVBtree;
};
using CacheRef = std::unique_ptr<Cache>;
private:
laddr_t laddr = L_ADDR_NULL;
-
- template <
- typename node_key_t,
- typename node_val_t,
- typename internal_node_t,
- typename leaf_node_t,
- typename pin_t,
- size_t node_size,
- bool leaf_has_children>
- friend class FixedKVBtree;
};
using LogicalCachedExtentRef = TCachedExtentRef<LogicalCachedExtent>;
Transaction &t,
CachedExtentRef e) = 0;
+ using check_child_trackers_ret = base_iertr::future<>;
+ virtual check_child_trackers_ret check_child_trackers(Transaction &t) = 0;
+
/**
* Calls f for each mapping in [begin, end)
*/
});
}
+BtreeLBAManager::check_child_trackers_ret
+BtreeLBAManager::check_child_trackers(
+ Transaction &t) {
+ auto c = get_context(t);
+ return with_btree<LBABtree>(
+ cache, c,
+ [c](auto &btree) {
+ return btree.check_child_trackers(c);
+ });
+}
+
BtreeLBAManager::scan_mappings_ret
BtreeLBAManager::scan_mappings(
Transaction &t,
Transaction &t,
CachedExtentRef e) final;
+ check_child_trackers_ret check_child_trackers(Transaction &t) final;
+
scan_mappings_ret scan_mappings(
Transaction &t,
laddr_t begin,
}
void check_mappings(test_transaction_t &t) {
+ (void)with_trans_intr(
+ *t.t,
+ [=, this](auto &t) {
+ return lba_manager->check_child_trackers(t);
+ }).unsafe_get0();
for (auto &&i: t.mappings) {
auto laddr = i.first;
auto len = i.second.len;
++iter;
});
}).unsafe_get0();
+ (void)with_trans_intr(
+ *t.t,
+ [=, this](auto &t) {
+ return lba_manager->check_child_trackers(t);
+ }).unsafe_get0();
}
bool try_submit_transaction(test_transaction_t t) {