]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore: update logical bucket cache
authorZhang Song <zhangsong02@qianxin.com>
Fri, 8 Aug 2025 07:50:52 +0000 (15:50 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Tue, 7 Jul 2026 08:15:30 +0000 (16:15 +0800)
Signed-off-by: Zhang Song <zhangsong02@qianxin.com>
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/common/hobject.h
src/crimson/os/seastore/object_data_handler.cc
src/crimson/os/seastore/transaction.h
src/crimson/os/seastore/transaction_manager.cc
src/crimson/os/seastore/transaction_manager.h

index 2dbd2e298e0de63cb8415380ad993636ac80fb56..cb37b00cd8cf2e343f4ec306fb7a1528767d0ef5 100644 (file)
@@ -60,6 +60,12 @@ public:
   static bool is_meta_pool(int64_t pool) {
     return pool == POOL_META;
   }
+  static int64_t get_logical_pool(int64_t pool) {
+    if (is_temp_pool(pool))
+      return get_temp_pool(pool);  // it's reversible
+    else
+      return pool;
+  }
 
 public:
   object_t oid;
@@ -114,10 +120,7 @@ public:
     return is_meta_pool(pool);
   }
   int64_t get_logical_pool() const {
-    if (is_temp_pool(pool))
-      return get_temp_pool(pool);  // it's reversible
-    else
-      return pool;
+    return get_logical_pool(pool);
   }
 
   hobject_t() : snap(0), hash(0), max(false), pool(INT64_MIN) {
index dd61539506074d70b99cce295c36f3e6814ebd5a..1e7796a358fc941c3823164359953ca06f29149e 100644 (file)
@@ -1590,6 +1590,8 @@ ObjectDataHandler::read_ret ObjectDataHandler::read(
       "ObjectDataHandler::read hit invalid error"
     )
   );
+  auto prefix = l_start.get_laddr().get_object_prefix();
+  bool all_cold = true;
   for (auto &pin : rpins) {
     if (pin.mapping.is_zero_reserved()) {
       ret.append_zero(pin.unaligned_len);
@@ -1608,6 +1610,12 @@ ObjectDataHandler::read_ret ObjectDataHandler::read(
       assert(pin.unaligned_start_offset == 0);
       ret.append(std::move(aligned_bl));
     }
+    auto paddr = maybe_indirect_extent.extent->get_paddr();
+    all_cold &= ctx.tm.is_cold_device(paddr.get_device_id());
+  }
+  if (!all_cold) {
+    assert(ctx.tm.is_prefix_cached(prefix));
+    ctx.tm.update_logical_bucket_for_read(prefix);
   }
   co_return std::move(ret);
 }
index 5302e91450d7b1941ae1fecd5744e1e68ce224fd..03191ee571677ee320fb8b57a362cdbda0ff85d3 100644 (file)
@@ -557,6 +557,7 @@ public:
     views.clear();
     copied_lba_keys.clear();
     update_copied_lba_key = nullptr;
+    touched_prefix.clear();
   }
 
   bool did_reset() const {
@@ -667,6 +668,14 @@ public:
     return cache_hint;
   }
 
+  void touch_laddr_prefix(laddr_t laddr) {
+    touched_prefix.insert(laddr.get_object_prefix());
+  }
+
+  std::unordered_set<laddr_t> &get_touched_laddr_prefix() {
+    return touched_prefix;
+  }
+
   btree_cursor_stats_t cursor_stats;
 
   bool need_wait_visibility = false;
@@ -894,6 +903,8 @@ private:
    */
   retired_extent_set_t retired_set;
 
+  std::unordered_set<laddr_t> touched_prefix;
+
   /// stats to collect when commit or invalidate
   tree_stats_t onode_tree_stats;
   tree_stats_t omap_tree_stats; // exclude omap tree depth
index e2bf66ef39523d27a68a5ffb8d93676eadc905c0..55273bc79ae8ff007611297bc6ba4ed1780e7e4f 100644 (file)
@@ -162,6 +162,10 @@ TransactionManager::mount()
             assert(paddr.is_absolute());
             cache->update_tree_extents_num(type, 1);
             epm->mark_space_used(paddr, len);
+            if (support_logical_bucket() &&
+                !epm->is_cold_device(paddr.get_device_id())) {
+              logical_bucket->move_to_top(laddr.get_object_prefix());
+            }
           });
         } else {
           return backref_manager->scan_mapped_space(
@@ -188,6 +192,10 @@ TransactionManager::mount()
               assert(backref_key == P_ADDR_NULL);
               cache->update_tree_extents_num(type, 1);
               epm->mark_space_used(paddr, len);
+              if (support_logical_bucket() &&
+                !epm->is_cold_device(paddr.get_device_id())) {
+                logical_bucket->move_to_top(laddr.get_object_prefix());
+              }
             }
           });
         }
@@ -756,6 +764,11 @@ TransactionManager::do_submit_transaction(
     journal->get_trimmer().update_journal_tails(
       cache->get_oldest_dirty_from().value_or(start_seq),
       cache->get_oldest_backref_dirty_from().value_or(start_seq));
+    if (support_logical_bucket()) {
+      for (auto &prefix : tref.get_touched_laddr_prefix()) {
+       logical_bucket->move_to_top(prefix.get_object_prefix());
+      }
+    }
     }).handle_error(
       submit_transaction_iertr::pass_further{},
       crimson::ct_error::assert_all("Hit error submitting to journal")
@@ -1164,6 +1177,7 @@ TransactionManager::promote_extent(
       placement_hint_t::HOT,
       INIT_GENERATION,
       true);
+    t.touch_laddr_prefix(orig_ext->get_laddr().get_object_prefix());
 
     promoted_extents.reserve(promoted_raw_extents.size());
 
@@ -1214,6 +1228,7 @@ TransactionManager::promote_extent(
     lext->rewrite(t, *orig_ext, 0);
     assert(!extent->get_paddr().is_absolute() ||
            !cache->is_on_cold_tier(lext->get_paddr()));
+    t.touch_laddr_prefix(orig_ext->get_laddr().get_object_prefix());
     //TODO: this memory copy should be saved
     orig_ext->get_bptr().copy_out(
       0,
index 76c8b30cab4cce93607624b73e172d25f756e37f..7636f36ba50fb850edfddf2cbdd560647d5c0181 100644 (file)
@@ -625,6 +625,17 @@ public:
          exts.begin(), exts.end()),
        EXTENT_DEFAULT_REF_COUNT);
     }
+    auto &front = exts.front();
+    if (front->get_write_policy() != write_policy_t::WRITE_THROUGH &&
+        front->get_rewrite_generation() <= epm->get_max_hot_gen()) {
+      auto prefix = front->get_laddr().get_object_prefix();
+      t.touch_laddr_prefix(prefix);
+      if (auto pool = prefix.get_pool();
+          unlikely(hobject_t::is_temp_pool(pool))) {
+        prefix.set_pool(hobject_t::get_logical_pool(pool));
+        t.touch_laddr_prefix(prefix);
+      }
+    }
     for (auto &ext : exts) {
       SUBDEBUGT(seastore_tm, "allocated {}", t, *ext);
     }
@@ -851,6 +862,24 @@ public:
      });
   }
 
+  // non-trivial method, should only be used in DEBUG build
+  bool is_prefix_cached(laddr_t prefix) {
+    if (!logical_bucket) {
+      return true;
+    }
+    return logical_bucket->is_cached(prefix);
+  }
+
+  void update_logical_bucket_for_read(laddr_t prefix) {
+    if (logical_bucket) {
+      logical_bucket->move_to_top(prefix.get_object_prefix());
+    }
+  }
+
+  bool is_cold_device(device_id_t id) const {
+    return epm->is_cold_device(id);
+  }
+
   /**
    * submit_transaction
    *
@@ -1299,7 +1328,7 @@ public:
   }
 
   bool support_logical_bucket() const {
-    return logical_bucket != nullptr;
+    return epm->has_cold_tier() && logical_bucket != nullptr;
   }
 
   ~TransactionManager();