From: Yingxin Cheng Date: Wed, 3 Aug 2022 01:20:05 +0000 (+0800) Subject: crimson/os/seastore/cache: replace backref_cache_ref by backref_entryrefs_by_seq_t X-Git-Tag: v18.0.0~318^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1392bdb48913903c5cec8fdfd53d0b38c3fdd16a;p=ceph.git crimson/os/seastore/cache: replace backref_cache_ref by backref_entryrefs_by_seq_t Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/backref/btree_backref_manager.cc b/src/crimson/os/seastore/backref/btree_backref_manager.cc index eb14681786b8..b82db7e3092a 100644 --- a/src/crimson/os/seastore/backref/btree_backref_manager.cc +++ b/src/crimson/os/seastore/backref/btree_backref_manager.cc @@ -215,65 +215,64 @@ BtreeBackrefManager::merge_cached_backrefs( 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 { - if (iter == backref_buffer->backrefs_by_seq.end()) - return seastar::make_ready_future( - 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::no); - }); - } - return seastar::make_ready_future( - seastar::stop_iteration::yes); - }).si_then([&inserted_to] { - return seastar::make_ready_future( - 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 { + if (iter == backref_entryrefs_by_seq.end()) { + return seastar::make_ready_future( + 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::no); + }); + } + return seastar::make_ready_future( + seastar::stop_iteration::yes); + }).si_then([&inserted_to] { + return seastar::make_ready_future( + std::move(inserted_to)); }); - } + }); return merge_cached_backrefs_iertr::make_ready_future( std::move(inserted_to)); }); diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 5ae8a5205e10..47ba0363ef99 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -1391,18 +1391,14 @@ void Cache::backref_batch_update( LOG_PREFIX(Cache::backref_batch_update); DEBUG("inserting {} entries at {}", list.size(), seq); ceph_assert(seq != JOURNAL_SEQ_NULL); - if (!backref_buffer) { - backref_buffer = std::make_unique(); - } for (auto &ent : list) { backref_set.insert(*ent); } - auto iter = backref_buffer->backrefs_by_seq.find(seq); - if (iter == backref_buffer->backrefs_by_seq.end()) { - backref_buffer->backrefs_by_seq.emplace( - seq, std::move(list)); + auto iter = backref_entryrefs_by_seq.find(seq); + if (iter == backref_entryrefs_by_seq.end()) { + backref_entryrefs_by_seq.emplace(seq, std::move(list)); } else { for (auto &ref : list) { iter->second.br_list.push_back(*ref); @@ -1623,7 +1619,7 @@ Cache::close_ertr::future<> Cache::close() intrusive_ptr_release(ptr); } backref_extents.clear(); - backref_buffer.reset(); + backref_entryrefs_by_seq.clear(); assert(stats.dirty_bytes == 0); lru.clear(); return close_ertr::now(); diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 01e163afe353..c46f9e138fe5 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -131,10 +131,7 @@ struct backref_buf_t { backref_buf_entry_t::list_t br_list; }; -struct backref_cache_t { - std::map backrefs_by_seq; -}; -using backref_cache_ref = std::unique_ptr; +using backref_entryrefs_by_seq_t = std::map; /** * Cache @@ -564,7 +561,7 @@ private: } } - 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 = @@ -594,8 +591,8 @@ private: 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: @@ -636,18 +633,17 @@ 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"); } } @@ -902,11 +898,11 @@ public: /// returns std::nullopt if no pending alloc-infos std::optional 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;