]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: destroy Transaction only when no other reference 68630/head
authorXuehan Xu <xuxuehan@qianxin.com>
Mon, 27 Apr 2026 09:10:06 +0000 (17:10 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Wed, 29 Apr 2026 09:23:33 +0000 (17:23 +0800)
exists

Fixes: https://tracker.ceph.com/issues/76268
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/transaction.h
src/crimson/os/seastore/transaction_interruptor.h

index c6d4564b3d471fb96ef92e26f016036eab7f89ef..e1682f835cdd0415362a0ca1c187de8dd6719aaf 100644 (file)
@@ -1021,6 +1021,7 @@ void Cache::invalidate_extent(
 
   LOG_PREFIX(Cache::invalidate_extent);
   bool do_conflict_log = true;
+  std::vector<Transaction*> invalidated_trans;
   for (auto &&i: extent.read_transactions) {
     if (!i.t->conflicted) {
       if (do_conflict_log) {
@@ -1030,8 +1031,15 @@ void Cache::invalidate_extent(
       assert(!i.t->is_weak());
       account_conflict(t.get_src(), i.t->get_src());
       mark_transaction_conflicted(*i.t, extent);
+      invalidated_trans.emplace_back(i.t);
     }
   }
+  for (auto trans : invalidated_trans) {
+    trans->clear_read_set();
+    trans->invalidate_clear_write_set();
+    trans->retired_set.clear();
+    trans->views.clear();
+  }
   extent.set_invalid(t);
 }
 
index b290670151657de5c9f5a87d28a0f92fc5c87645..eeb45adaca30881aa374fb5ec24367fed3ca871a 100644 (file)
@@ -121,7 +121,7 @@ public:
 
     ++(get_by_src(stats.trans_created_by_src, src));
 
-    auto ret = std::make_unique<Transaction>(
+    auto ret = boost::intrusive_ptr(new Transaction(
       get_dummy_ordering_handle(),
       is_weak,
       src,
@@ -129,7 +129,7 @@ public:
         return on_transaction_destruct(t);
       },
       ++next_id,
-      cache_hint
+      cache_hint)
     );
     SUBDEBUGT(seastore_t, "created name={}, source={}, is_weak={}",
               *ret, name, src, is_weak);
index 7b0a4433c5130708e7d651acaf16d2e57464b7be..b5191ce541113cfd4ae538353603ada1fa4973d5 100644 (file)
@@ -114,9 +114,10 @@ struct rbm_pending_ool_t {
  * - TRACE: DEBUG details
  * - seastore_cache logs
  */
-class Transaction {
+class Transaction : public boost::intrusive_ref_counter<
+  Transaction, boost::thread_unsafe_counter> {
 public:
-  using Ref = std::unique_ptr<Transaction>;
+  using Ref = boost::intrusive_ptr<Transaction>;
   using on_destruct_func_t = std::function<void(Transaction&)>;
   enum class get_extent_ret {
     PRESENT,
@@ -926,13 +927,13 @@ using TransactionRef = Transaction::Ref;
 /// Should only be used with dummy staged-fltree node extent manager
 inline TransactionRef make_test_transaction() {
   static transaction_id_t next_id = 0;
-  return std::make_unique<Transaction>(
+  return boost::intrusive_ptr(new Transaction(
     get_dummy_ordering_handle(),
     false,
     Transaction::src_t::MUTATE,
     [](Transaction&) {},
     ++next_id,
-    CACHE_HINT_TOUCH
+    CACHE_HINT_TOUCH)
   );
 }
 
index 848c8525642cd4e2e4de23530a4fa70ead60c864..c79cce9932b712092e9248b0b56654b0628d1bdd 100644 (file)
@@ -24,7 +24,7 @@ struct TransactionConflictCondition {
   };
 
 public:
-  TransactionConflictCondition(Transaction &t) : t(t) {}
+  TransactionConflictCondition(Transaction &t) : t(t), tref(&t) {}
 
   template <typename Fut>
   std::optional<Fut> may_interrupt() {
@@ -49,6 +49,7 @@ private:
   bool is_conflicted() const;
 
   Transaction &t;
+  TransactionRef tref;
 };
 
 using trans_intr = crimson::interruptible::interruptor<