]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/cached_extent: add on_invalidated interface
authorXuehan Xu <xxhdx1985126@gmail.com>
Tue, 16 Aug 2022 09:05:52 +0000 (17:05 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Sat, 6 May 2023 05:37:30 +0000 (13:37 +0800)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cached_extent.cc
src/crimson/os/seastore/cached_extent.h
src/crimson/os/seastore/transaction.h

index ebeb123cf5e43d370f322a9c99af97d0195ac83b..f0c02b08b12a22f74963c84f219c602b4400ec12 100644 (file)
@@ -812,7 +812,7 @@ void Cache::invalidate_extent(
 {
   if (!extent.may_conflict()) {
     assert(extent.transactions.empty());
-    extent.state = CachedExtent::extent_state_t::INVALID;
+    extent.set_invalid(t);
     return;
   }
 
@@ -829,7 +829,7 @@ void Cache::invalidate_extent(
       mark_transaction_conflicted(*i.t, extent);
     }
   }
-  extent.state = CachedExtent::extent_state_t::INVALID;
+  extent.set_invalid(t);
 }
 
 void Cache::mark_transaction_conflicted(
index 84f5f89c99b251ef5f56fb9e61323661f5175175..c84475344517d0d60cb5de8da58902d124315d7a 100644 (file)
@@ -90,6 +90,14 @@ std::ostream &LogicalCachedExtent::print_detail(std::ostream &out) const
   return print_detail_l(out);
 }
 
+void CachedExtent::set_invalid(Transaction &t) {
+  state = extent_state_t::INVALID;
+  if (trans_view_hook.is_linked()) {
+    trans_view_hook.unlink();
+  }
+  on_invalidated(t);
+}
+
 std::ostream &operator<<(std::ostream &out, const LBAPin &rhs)
 {
   return out << "LBAPin(" << rhs.get_key() << "~" << rhs.get_length()
index 0245044955139b2bb23c9133d510f419c025837a..4603d5a2cd8c38b446c1d428b3a056bdf055f29a 100644 (file)
@@ -242,6 +242,16 @@ public:
    * completes.
    */
   virtual void on_replace_prior(Transaction &t) {}
+
+  /**
+   * on_invalidated
+   *
+   * Called after the extent is invalidated, either by Cache::invalidate_extent
+   * or Transaction::add_to_retired_set. Implementation may use this
+   * call to adjust states that must be changed immediately once
+   * invalidated.
+   */
+  virtual void on_invalidated(Transaction &t) {}
   /**
    * get_type
    *
@@ -489,6 +499,8 @@ public:
     return ret;
   }
 
+  void set_invalid(Transaction &t);
+
 private:
   template <typename T>
   friend class read_set_item_t;
index e7eef11427a81c9c62cba5e3285c3628458e816f..14ba61cee07dfb500b57fee7dbb6312e803adc25 100644 (file)
@@ -117,13 +117,13 @@ public:
     if (ref->is_exist_clean() ||
        ref->is_exist_mutation_pending()) {
       existing_block_stats.dec(ref);
-      ref->state = CachedExtent::extent_state_t::INVALID;
+      ref->set_invalid(*this);
       write_set.erase(*ref);
     } else if (ref->is_initial_pending()) {
-      ref->state = CachedExtent::extent_state_t::INVALID;
+      ref->set_invalid(*this);
       write_set.erase(*ref);
     } else if (ref->is_mutation_pending()) {
-      ref->state = CachedExtent::extent_state_t::INVALID;
+      ref->set_invalid(*this);
       write_set.erase(*ref);
       assert(ref->prior_instance);
       retired_set.insert(ref->prior_instance);
@@ -348,7 +348,7 @@ public:
 
   void invalidate_clear_write_set() {
     for (auto &&i: write_set) {
-      i.state = CachedExtent::extent_state_t::INVALID;
+      i.set_invalid(*this);
     }
     write_set.clear();
   }