limit,
JOURNAL_SEQ_NULL,
[this, &t, max](auto &limit, auto &inserted_to) {
- auto &backref_buffer = cache.get_backref_buffer();
- if (backref_buffer) {
- return seastar::do_with(
- backref_buffer->backrefs_by_seq.begin(),
- JOURNAL_SEQ_NULL,
- [this, &t, &limit, &backref_buffer, max](auto &iter, auto &inserted_to) {
- return trans_intr::repeat(
- [&iter, this, &t, &limit, &backref_buffer, max, &inserted_to]()
- -> merge_cached_backrefs_iertr::future<seastar::stop_iteration> {
- if (iter == backref_buffer->backrefs_by_seq.end())
- return seastar::make_ready_future<seastar::stop_iteration>(
- seastar::stop_iteration::yes);
- auto &seq = iter->first;
- auto &backref_list = iter->second.br_list;
- LOG_PREFIX(BtreeBackrefManager::merge_cached_backrefs);
- DEBUGT("seq {}, limit {}, num_fresh_backref {}"
- , t, seq, limit, t.get_num_fresh_backref());
- if (seq <= limit && t.get_num_fresh_backref() * BACKREF_NODE_SIZE < max) {
- inserted_to = seq;
- return trans_intr::do_for_each(
- backref_list,
- [this, &t](auto &backref) {
- LOG_PREFIX(BtreeBackrefManager::merge_cached_backrefs);
- if (backref.laddr != L_ADDR_NULL) {
- DEBUGT("new mapping: {}~{} -> {}",
- t, backref.paddr, backref.len, backref.laddr);
- return new_mapping(
- t,
- backref.paddr,
- backref.len,
- backref.laddr,
- backref.type).si_then([](auto &&pin) {
- return seastar::now();
- });
- } else {
- DEBUGT("remove mapping: {}", t, backref.paddr);
- return remove_mapping(
- t,
- backref.paddr).si_then([](auto&&) {
- return seastar::now();
- }).handle_error_interruptible(
- crimson::ct_error::input_output_error::pass_further(),
- crimson::ct_error::assert_all("no enoent possible")
- );
- }
- }).si_then([&iter] {
- iter++;
- return seastar::make_ready_future<seastar::stop_iteration>(
- seastar::stop_iteration::no);
- });
- }
- return seastar::make_ready_future<seastar::stop_iteration>(
- seastar::stop_iteration::yes);
- }).si_then([&inserted_to] {
- return seastar::make_ready_future<journal_seq_t>(
- std::move(inserted_to));
- });
+ auto &backref_entryrefs_by_seq = cache.get_backref_entryrefs_by_seq();
+ return seastar::do_with(
+ backref_entryrefs_by_seq.begin(),
+ JOURNAL_SEQ_NULL,
+ [this, &t, &limit, &backref_entryrefs_by_seq, max](auto &iter, auto &inserted_to) {
+ return trans_intr::repeat(
+ [&iter, this, &t, &limit, &backref_entryrefs_by_seq, max, &inserted_to]()
+ -> merge_cached_backrefs_iertr::future<seastar::stop_iteration> {
+ if (iter == backref_entryrefs_by_seq.end()) {
+ return seastar::make_ready_future<seastar::stop_iteration>(
+ seastar::stop_iteration::yes);
+ }
+ auto &seq = iter->first;
+ auto &backref_list = iter->second.br_list;
+ LOG_PREFIX(BtreeBackrefManager::merge_cached_backrefs);
+ DEBUGT("seq {}, limit {}, num_fresh_backref {}"
+ , t, seq, limit, t.get_num_fresh_backref());
+ if (seq <= limit && t.get_num_fresh_backref() * BACKREF_NODE_SIZE < max) {
+ inserted_to = seq;
+ return trans_intr::do_for_each(
+ backref_list,
+ [this, &t](auto &backref) {
+ LOG_PREFIX(BtreeBackrefManager::merge_cached_backrefs);
+ if (backref.laddr != L_ADDR_NULL) {
+ DEBUGT("new mapping: {}~{} -> {}",
+ t, backref.paddr, backref.len, backref.laddr);
+ return new_mapping(
+ t,
+ backref.paddr,
+ backref.len,
+ backref.laddr,
+ backref.type).si_then([](auto &&pin) {
+ return seastar::now();
+ });
+ } else {
+ DEBUGT("remove mapping: {}", t, backref.paddr);
+ return remove_mapping(
+ t,
+ backref.paddr).si_then([](auto&&) {
+ return seastar::now();
+ }).handle_error_interruptible(
+ crimson::ct_error::input_output_error::pass_further(),
+ crimson::ct_error::assert_all("no enoent possible")
+ );
+ }
+ }).si_then([&iter] {
+ iter++;
+ return seastar::make_ready_future<seastar::stop_iteration>(
+ seastar::stop_iteration::no);
+ });
+ }
+ return seastar::make_ready_future<seastar::stop_iteration>(
+ seastar::stop_iteration::yes);
+ }).si_then([&inserted_to] {
+ return seastar::make_ready_future<journal_seq_t>(
+ std::move(inserted_to));
});
- }
+ });
return merge_cached_backrefs_iertr::make_ready_future<journal_seq_t>(
std::move(inserted_to));
});
backref_buf_entry_t::list_t br_list;
};
-struct backref_cache_t {
- std::map<journal_seq_t, backref_buf_t> backrefs_by_seq;
-};
-using backref_cache_ref = std::unique_ptr<backref_cache_t>;
+using backref_entryrefs_by_seq_t = std::map<journal_seq_t, backref_buf_t>;
/**
* Cache
}
}
- backref_cache_ref backref_buffer;
+ backref_entryrefs_by_seq_t backref_entryrefs_by_seq;
backref_set_t backref_set; // in cache backrefs indexed by paddr_t
using backref_buf_entry_query_set_t =
return backref_set;
}
- backref_cache_ref& get_backref_buffer() {
- return backref_buffer;
+ backref_entryrefs_by_seq_t& get_backref_entryrefs_by_seq() {
+ return backref_entryrefs_by_seq;
}
public:
void trim_backref_bufs(const journal_seq_t &trim_to) {
LOG_PREFIX(Cache::trim_backref_bufs);
SUBDEBUG(seastore_cache, "trimming to {}", trim_to);
- if (backref_buffer && !backref_buffer->backrefs_by_seq.empty()) {
- SUBDEBUG(seastore_cache, "backrefs {} ~ {}, size={}",
- backref_buffer->backrefs_by_seq.rbegin()->first,
- backref_buffer->backrefs_by_seq.begin()->first,
- backref_buffer->backrefs_by_seq.size());
- assert(backref_buffer->backrefs_by_seq.rbegin()->first >= trim_to);
- auto iter = backref_buffer->backrefs_by_seq.upper_bound(trim_to);
- backref_buffer->backrefs_by_seq.erase(
- backref_buffer->backrefs_by_seq.begin(), iter);
+ if (!backref_entryrefs_by_seq.empty()) {
+ SUBDEBUG(seastore_cache, "backref_entryrefs_by_seq {} ~ {}, size={}",
+ backref_entryrefs_by_seq.rbegin()->first,
+ backref_entryrefs_by_seq.begin()->first,
+ backref_entryrefs_by_seq.size());
+ assert(backref_entryrefs_by_seq.rbegin()->first >= trim_to);
+ auto iter = backref_entryrefs_by_seq.upper_bound(trim_to);
+ backref_entryrefs_by_seq.erase(backref_entryrefs_by_seq.begin(), iter);
}
- if (!backref_buffer || backref_buffer->backrefs_by_seq.empty()) {
- SUBDEBUG(seastore_cache, "backref_buffer all trimmed");
+ if (backref_entryrefs_by_seq.empty()) {
+ SUBDEBUG(seastore_cache, "backref_entryrefs_by_seq all trimmed");
}
}
/// returns std::nullopt if no pending alloc-infos
std::optional<journal_seq_t> get_oldest_backref_dirty_from() const {
LOG_PREFIX(Cache::get_oldest_backref_dirty_from);
- if (!backref_buffer || backref_buffer->backrefs_by_seq.empty()) {
+ if (backref_entryrefs_by_seq.empty()) {
SUBDEBUG(seastore_cache, "backref_oldest: null");
return std::nullopt;
}
- auto oldest = backref_buffer->backrefs_by_seq.begin()->first;
+ auto oldest = backref_entryrefs_by_seq.begin()->first;
SUBDEBUG(seastore_cache, "backref_oldest: {}", oldest);
ceph_assert(oldest != JOURNAL_SEQ_NULL);
return oldest;