]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/cached_extent: treat extents under rewrite io as
authorXuehan Xu <xuxuehan@qianxin.com>
Mon, 1 Dec 2025 09:41:21 +0000 (17:41 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Tue, 10 Feb 2026 02:58:20 +0000 (10:58 +0800)
stable too

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/cached_extent.h

index 03915947e1323bda99f2b42efaed500720a2b01c..8a5a59ee3ef431a2830aaa159476cfdbd6dfd1ac 100644 (file)
@@ -1431,7 +1431,8 @@ record_t Cache::prepare_record(
   for (auto &i: t.mutated_block_list) {
     if (i->is_valid()) {
       if (i->is_mutation_pending()) {
-        i->set_io_wait(CachedExtent::extent_state_t::DIRTY);
+        i->set_io_wait(CachedExtent::extent_state_t::DIRTY,
+                       is_rewrite_transaction(t.get_src()));
         commit_replace_extent(t, i, i->prior_instance);
       } // else, is_exist_mutation_pending():
         // - it doesn't have prior_instance to replace
@@ -1575,7 +1576,8 @@ record_t Cache::prepare_record(
          i->get_length(),
          i->get_type()));
     }
-    i->set_io_wait(CachedExtent::extent_state_t::CLEAN);
+    i->set_io_wait(CachedExtent::extent_state_t::CLEAN,
+                   is_rewrite_transaction(t.get_src()));
     // Note, paddr is known until complete_commit(),
     // so add_extent() later.
     if (is_rewrite_transaction(t.get_src())) {
@@ -1591,7 +1593,7 @@ record_t Cache::prepare_record(
         committer.sync_checksum();
       }
       i->get_prior_instance()->set_io_wait(
-        CachedExtent::extent_state_t::CLEAN);
+        CachedExtent::extent_state_t::CLEAN, true);
     }
   }
 
@@ -1616,9 +1618,6 @@ record_t Cache::prepare_record(
          i->get_length(),
          i->get_type()));
     }
-    i->set_io_wait(CachedExtent::extent_state_t::CLEAN);
-    // Note, paddr is (can be) known until complete_commit(),
-    // so add_extent() later.
     if (is_rewrite_transaction(t.get_src())) {
       assert(i->get_prior_instance());
       assert(!i->committer);
@@ -1632,9 +1631,15 @@ record_t Cache::prepare_record(
       if (is_lba_backref_node(i->get_type())) {
         committer.sync_checksum();
       }
+      committer.block_trans(t);
       i->get_prior_instance()->set_io_wait(
         CachedExtent::extent_state_t::CLEAN, true);
     }
+    i->set_io_wait(CachedExtent::extent_state_t::CLEAN,
+                   is_rewrite_transaction(t.get_src()));
+    // Note, paddr is (can be) known until complete_commit(),
+    // so add_extent() later.
+
   }
 
   for (auto &i: t.inplace_ool_block_list) {
@@ -1680,7 +1685,8 @@ record_t Cache::prepare_record(
       i->state = CachedExtent::extent_state_t::CLEAN;
     } else {
       assert(i->is_exist_mutation_pending());
-      i->set_io_wait(CachedExtent::extent_state_t::DIRTY);
+      i->set_io_wait(CachedExtent::extent_state_t::DIRTY,
+                     is_rewrite_transaction(t.get_src()));
     }
 
     // exist mutation pending extents must be in t.mutated_block_list
index 547246a6972f57c8a87a94e52e449989a4913bd4..d4acc3da87dba23a3220ab92451b7dee1c1b6514 100644 (file)
@@ -1912,7 +1912,7 @@ private:
     assert(is_aligned(offset, get_block_size()));
     assert(is_aligned(length, get_block_size()));
     assert(extent->get_paddr().is_absolute());
-    extent->set_io_wait(extent->state);
+    extent->set_io_wait(extent->state, false);
     auto old_length = extent->get_loaded_length();
     load_ranges_t to_read = extent->load_ranges(offset, length);
     auto new_length = extent->get_loaded_length();
index a6fd3cb107797e3f3cd4a7689405671fc3a383a3..5c4ad192a67e566821f5144c5f9d676d97bd3534 100644 (file)
@@ -658,7 +658,7 @@ public:
 
   /// Returns true iff extent is stable and not io-pending
   bool is_stable_ready() const {
-    return is_stable() && !is_pending_io();
+    return is_stable() && (!is_pending_io() || io_wait->rewriting);
   }
 
   /// Returns true if extent can not be mutated,
@@ -968,12 +968,13 @@ private:
   struct io_wait_t {
     seastar::shared_promise<> pr;
     extent_state_t from_state;
+    bool rewriting = false;
   };
   std::optional<io_wait_t> io_wait;
 
-  void set_io_wait(extent_state_t new_state) {
+  void set_io_wait(extent_state_t new_state, bool rewriting) {
     ceph_assert(!io_wait);
-    io_wait.emplace(seastar::shared_promise<>(), state);
+    io_wait.emplace(seastar::shared_promise<>(), state, rewriting);
     state = new_state;
     assert(is_data_stable());
   }