]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache: replace backref_cache_ref by backref_entryrefs_by_seq_t
authorYingxin Cheng <yingxin.cheng@intel.com>
Wed, 3 Aug 2022 01:20:05 +0000 (09:20 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Fri, 5 Aug 2022 06:44:58 +0000 (14:44 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/backref/btree_backref_manager.cc
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cache.h

index eb14681786b80f691665476460acef97cf3e4c78..b82db7e3092a3f94e966c848ee7a1e0f43626b13 100644 (file)
@@ -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<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));
   });
index 5ae8a5205e1082c1e2b16f4c153cbc3ed24ee49e..47ba0363ef9916bb8aed69f30320504ff148a61a 100644 (file)
@@ -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<backref_cache_t>();
-  }
 
   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();
index 01e163afe35339e8f66eca47d214095ca211da4a..c46f9e138fe5b2241379ac19c658b9cbe5de1a50 100644 (file)
@@ -131,10 +131,7 @@ struct backref_buf_t {
   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
@@ -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<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;