From 042f21d6db78a693c1eee484c589201bfe2a8309 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Wed, 6 Sep 2023 14:56:51 +0800 Subject: [PATCH] crimson/os/seastore/onode_manager: populate value recorders of onodes to be erased Otherwise, the following modification sequence with the same transaction might lead to onode extents' crc inconsistency during journal replay: 1. modify the last mapping in an onode extent; 2. erase the last mapping in that onode extent. During journal replay, if the first modification is not recorded in the delta, the onode extent's content would be inconsistent with that before the system reboot Signed-off-by: Xuehan Xu (cherry picked from commit 6c236bb63a9a49c7f9e2dab03a5fe0bb016560f0) --- .../onode_manager/staged-fltree/fltree_onode_manager.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc b/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc index ba78cbf0b0b32..bff27ab651786 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc @@ -120,6 +120,10 @@ FLTreeOnodeManager::erase_onode_ret FLTreeOnodeManager::erase_onode( OnodeRef &onode) { auto &flonode = static_cast(*onode); + assert(flonode.is_alive()); + if (flonode.status == FLTreeOnode::status_t::MUTATED) { + flonode.populate_recorder(trans); + } flonode.mark_delete(); return tree.erase(trans, flonode); } -- 2.39.5