From: Xuehan Xu Date: Mon, 1 Dec 2025 09:41:21 +0000 (+0800) Subject: crimson/os/seastore/cached_extent: treat extents under rewrite io as X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3cd8dcf14a6481320df792efeb79181c993fa5d0;p=ceph-ci.git crimson/os/seastore/cached_extent: treat extents under rewrite io as stable too Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 03915947e13..8a5a59ee3ef 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -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 diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 547246a6972..d4acc3da87d 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -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(); diff --git a/src/crimson/os/seastore/cached_extent.h b/src/crimson/os/seastore/cached_extent.h index a6fd3cb1077..5c4ad192a67 100644 --- a/src/crimson/os/seastore/cached_extent.h +++ b/src/crimson/os/seastore/cached_extent.h @@ -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; - 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()); }