From b8f9beb9c19155cdffafc511b880308fa7015b18 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Tue, 28 Jul 2026 12:42:59 +0800 Subject: [PATCH] crimson/os/seastore/transaction_manager: don't demote dirty extents Signed-off-by: Xuehan Xu --- src/crimson/os/seastore/transaction_manager.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 025a23c7900..4d0803a5859 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -604,6 +604,11 @@ TransactionManager::relocate_shadow_extent( )->template cast(); } else { extent = co_await std::move(v.get_child_fut()); + if (extent->is_stable_dirty()) { + // the extent is dirty, skip it. + DEBUGT("skipping dirty extent: {}", t, *extent); + co_return LogicalChildNodeRef(); + } cache->retire_extent(t, extent); } if (auto shadow = extent->get_shadow(); shadow) { @@ -1607,6 +1612,10 @@ TransactionManager::demote_region( if (it.has_shadow_val()) { DEBUGT("demote shadow {}", t, it); auto extent = co_await relocate_shadow_extent(t, it); + if (!extent) { + DEBUGT("{} can't be demoted", t, it); + continue; + } ret.demoted_size += extent->get_length(); auto cursor = co_await lba_manager->demote_extent( t, *it.direct_cursor, *extent);