]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: new extent state: EXIST_CLEAN and EXIST_MUTATION_PENDING
authorZhang Song <zhangsong325@gmail.com>
Mon, 13 Jun 2022 02:37:52 +0000 (10:37 +0800)
committerZhang Song <zhangsong325@gmail.com>
Mon, 11 Jul 2022 01:59:16 +0000 (09:59 +0800)
Signed-off-by: Zhang Song <zhangsong325@gmail.com>
src/crimson/os/seastore/cached_extent.cc
src/crimson/os/seastore/cached_extent.h

index a4f7423f5f32a6660c0ef887c940cba45f4593f3..dc7b8e6165b85b9fc454323ee3e3d87f56160311 100644 (file)
@@ -54,6 +54,10 @@ std::ostream &operator<<(std::ostream &out, CachedExtent::extent_state_t state)
     return out << "CLEAN";
   case CachedExtent::extent_state_t::DIRTY:
     return out << "DIRTY";
+  case CachedExtent::extent_state_t::EXIST_CLEAN:
+    return out << "EXIST_CLEAN";
+  case CachedExtent::extent_state_t::EXIST_MUTATION_PENDING:
+    return out << "EXIST_MUTATION_PENDING";
   case CachedExtent::extent_state_t::INVALID:
     return out << "INVALID";
   default:
index 91e0d0ad915878ad6a5f948db5d528e068b9d692..83f223f5d42e0a3ff47148e16e08f445c14c53fc 100644 (file)
@@ -88,6 +88,17 @@ class CachedExtent : public boost::intrusive_ref_counter<
                            //  during write, contents match disk, version == 0
     DIRTY,                 // Same as CLEAN, but contents do not match disk,
                            //  version > 0
+    EXIST_CLEAN,           // Similar to CLEAN, but its metadata not yet
+                          //  persisted to disk.
+                          //  In Transaction::write_set and existing_block_list.
+                          //  After transaction commits, state becomes CLEAN
+                          //  and add extent to Cache. Modifing such extents
+                          //  will cause state turn to EXIST_MUTATION_PENDING.
+    EXIST_MUTATION_PENDING,// Similar to MUTATION_PENDING, but its prior_instance
+                          //  is empty.
+                          //  In Transaction::write_set, existing_block_list and
+                          //  mutated_block_list. State becomes DIRTY and it is
+                          //  added to Cache after transaction commits.
     INVALID                // Part of no ExtentIndex set
   } state = extent_state_t::INVALID;
   friend std::ostream &operator<<(std::ostream &, extent_state_t);
@@ -268,7 +279,8 @@ public:
   /// Returns true if extent is part of an open transaction
   bool is_pending() const {
     return state == extent_state_t::INITIAL_WRITE_PENDING ||
-      state == extent_state_t::MUTATION_PENDING;
+      state == extent_state_t::MUTATION_PENDING ||
+      state == extent_state_t::EXIST_MUTATION_PENDING;
   }
 
   /// Returns true if extent has a pending delta
@@ -286,7 +298,18 @@ public:
     ceph_assert(is_valid());
     return state == extent_state_t::INITIAL_WRITE_PENDING ||
            state == extent_state_t::CLEAN ||
-           state == extent_state_t::CLEAN_PENDING;
+           state == extent_state_t::CLEAN_PENDING ||
+           state == extent_state_t::EXIST_CLEAN;
+  }
+
+  /// Ruturns true if data is persisted while metadata isn't
+  bool is_exist_clean() const {
+    return state == extent_state_t::EXIST_CLEAN;
+  }
+
+  /// Returns true if the extent with EXTIST_CLEAN is modified
+  bool is_exist_mutation_pending() const {
+    return state == extent_state_t::EXIST_MUTATION_PENDING;
   }
 
   /// Returns true if extent is dirty (has deltas on disk)
@@ -838,8 +861,11 @@ protected:
   virtual void logical_on_delta_write() {}
 
   void on_delta_write(paddr_t record_block_offset) final {
-    assert(get_prior_instance());
-    pin->take_pin(*(get_prior_instance()->cast<LogicalCachedExtent>()->pin));
+    assert(is_exist_mutation_pending() ||
+          get_prior_instance());
+    if (get_prior_instance()) {
+      pin->take_pin(*(get_prior_instance()->cast<LogicalCachedExtent>()->pin));
+    }
     logical_on_delta_write();
   }