laddr_t addr) = 0;
virtual void complete_transaction(
- Transaction &t) = 0;
+ Transaction &t,
+ std::vector<CachedExtentRef> &to_clear, ///< extents whose pins are to be cleared,
+ // as the results of their retirements
+ std::vector<CachedExtentRef> &to_link ///< fresh extents whose pins are to be inserted
+ // into backref manager's pin set
+ ) = 0;
/**
* Should be called after replay on each cached extent.
}
void BtreeLBAManager::complete_transaction(
- Transaction &t)
+ Transaction &t,
+ std::vector<CachedExtentRef> &to_clear,
+ std::vector<CachedExtentRef> &to_link)
{
LOG_PREFIX(BtreeLBAManager::complete_transaction);
DEBUGT("start", t);
- std::vector<CachedExtentRef> to_clear;
- to_clear.reserve(t.get_retired_set().size());
- for (auto &e: t.get_retired_set()) {
- if (e->is_logical() || is_lba_node(*e))
- to_clear.push_back(e);
- }
// need to call check_parent from leaf->parent
std::sort(
to_clear.begin(), to_clear.end(),
pin_set.retire(pin);
}
- // ...but add_pin from parent->leaf
- std::vector<CachedExtentRef> to_link;
- to_link.reserve(t.get_fresh_block_stats().num);
- t.for_each_fresh_block([&](auto &e) {
- if (e->is_valid() && (is_lba_node(*e) || e->is_logical()))
- to_link.push_back(e);
- });
-
std::sort(
to_link.begin(), to_link.end(),
[](auto &l, auto &r) -> bool { return get_depth(*l) > get_depth(*r); });
}
void complete_transaction(
- Transaction &t) final;
+ Transaction &t,
+ std::vector<CachedExtentRef> &,
+ std::vector<CachedExtentRef> &) final;
/**
* init_cached_extent
submit_result.record_block_base,
start_seq,
segment_cleaner.get());
- lba_manager->complete_transaction(tref);
+
+ std::vector<CachedExtentRef> lba_to_clear;
+ std::vector<CachedExtentRef> backref_to_clear;
+ lba_to_clear.reserve(tref.get_retired_set().size());
+ backref_to_clear.reserve(tref.get_retired_set().size());
+ for (auto &e: tref.get_retired_set()) {
+ if (e->is_logical() || is_lba_node(e->get_type()))
+ lba_to_clear.push_back(e);
+ else if (is_backref_node(e->get_type()))
+ backref_to_clear.push_back(e);
+ }
+
+ // ...but add_pin from parent->leaf
+ std::vector<CachedExtentRef> lba_to_link;
+ std::vector<CachedExtentRef> backref_to_link;
+ lba_to_link.reserve(tref.get_fresh_block_stats().num);
+ backref_to_link.reserve(tref.get_fresh_block_stats().num);
+ tref.for_each_fresh_block([&](auto &e) {
+ if (e->is_valid()) {
+ if (is_lba_node(e->get_type()) || e->is_logical())
+ lba_to_link.push_back(e);
+ else if (is_backref_node(e->get_type()))
+ backref_to_link.push_back(e);
+ }
+ });
+
+ lba_manager->complete_transaction(tref, lba_to_clear, lba_to_link);
+ backref_manager->complete_transaction(tref, backref_to_clear, backref_to_link);
+
segment_cleaner->update_journal_tail_target(
cache->get_oldest_dirty_from().value_or(start_seq));
return segment_cleaner->maybe_release_segment(tref);
btree_lba_manager_test() = default;
void complete_commit(Transaction &t) final {
- lba_manager->complete_transaction(t);
+ std::vector<CachedExtentRef> lba_to_clear;
+ lba_to_clear.reserve(t.get_retired_set().size());
+ for (auto &e: t.get_retired_set()) {
+ if (e->is_logical() || is_lba_node(e->get_type()))
+ lba_to_clear.push_back(e);
+ }
+ std::vector<CachedExtentRef> lba_to_link;
+ lba_to_link.reserve(t.get_fresh_block_stats().num);
+ t.for_each_fresh_block([&](auto &e) {
+ if (e->is_valid() &&
+ (is_lba_node(e->get_type()) || e->is_logical()))
+ lba_to_link.push_back(e);
+ });
+
+ lba_manager->complete_transaction(t, lba_to_clear, lba_to_link);
}
LBAManager::mkfs_ret test_structure_setup(Transaction &t) final {