From b8a9b77506ece1b9caccd3c533986d143e5ebe03 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Sat, 23 Aug 2025 13:31:40 +0800 Subject: [PATCH] crimson/os/seastore/onode: add the interface for swapping onode layouts Signed-off-by: Xuehan Xu --- src/crimson/os/seastore/onode.h | 1 + .../staged-fltree/fltree_onode_manager.h | 41 +++++++++++++++++++ .../seastore/test_object_data_handler.cc | 10 +++++ 3 files changed, 52 insertions(+) diff --git a/src/crimson/os/seastore/onode.h b/src/crimson/os/seastore/onode.h index 470578c044b91..98369424011f3 100644 --- a/src/crimson/os/seastore/onode.h +++ b/src/crimson/os/seastore/onode.h @@ -104,6 +104,7 @@ public: virtual void clear_snapset(Transaction&) = 0; virtual void set_need_cow(Transaction&) = 0; virtual void unset_need_cow(Transaction&) = 0; + virtual void swap_layout(Transaction&, Onode&) = 0; laddr_t get_metadata_hint(uint64_t block_size) const { assert(default_metadata_offset); diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h b/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h index 8a1e3710648d1..e939dc3037621 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h @@ -93,6 +93,47 @@ struct FLTreeOnode final : Onode, Value { layout_func(p.first, p.second); } + void swap_layout(Transaction &t, Onode &onode) final { + _swap_layout(t, static_cast(onode)); + } + + void _swap_layout(Transaction &t, FLTreeOnode &other) { + assert(status != status_t::DELETED); + assert(other.status != status_t::DELETED); + auto [payload_mut, recorder] = prepare_mutate_payload< + onode_layout_t, Recorder>(t); + auto &mlayout = *reinterpret_cast( + payload_mut.get_write()); + auto [o_payload_mut, o_recorder] = other.prepare_mutate_payload< + onode_layout_t, Recorder>(t); + auto &o_mlayout = *reinterpret_cast( + o_payload_mut.get_write()); + std::swap(mlayout.object_data, o_mlayout.object_data); + std::swap(mlayout.omap_root, o_mlayout.omap_root); + std::swap(mlayout.log_root, o_mlayout.log_root); + std::swap(mlayout.xattr_root, o_mlayout.xattr_root); + if (recorder) { + recorder->encode_update( + payload_mut, Recorder::delta_op_t::UPDATE_OBJECT_DATA); + recorder->encode_update( + payload_mut, Recorder::delta_op_t::UPDATE_OMAP_ROOT); + recorder->encode_update( + payload_mut, Recorder::delta_op_t::UPDATE_LOG_ROOT); + recorder->encode_update( + payload_mut, Recorder::delta_op_t::UPDATE_XATTR_ROOT); + } + if (o_recorder) { + o_recorder->encode_update( + o_payload_mut, Recorder::delta_op_t::UPDATE_OBJECT_DATA); + o_recorder->encode_update( + o_payload_mut, Recorder::delta_op_t::UPDATE_OMAP_ROOT); + o_recorder->encode_update( + o_payload_mut, Recorder::delta_op_t::UPDATE_LOG_ROOT); + o_recorder->encode_update( + o_payload_mut, Recorder::delta_op_t::UPDATE_XATTR_ROOT); + } + } + void create_default_layout(Transaction &t) { with_mutable_layout( t, diff --git a/src/test/crimson/seastore/test_object_data_handler.cc b/src/test/crimson/seastore/test_object_data_handler.cc index d1f1568e19c1e..4e86be5bd708b 100644 --- a/src/test/crimson/seastore/test_object_data_handler.cc +++ b/src/test/crimson/seastore/test_object_data_handler.cc @@ -36,6 +36,16 @@ public: bool is_alive() const final { return true; } + void swap_layout(Transaction &t, Onode& other) final { + static_cast(other).with_mutable_layout( + t, + [this](auto &o_mlayout) { + std::swap(layout.object_data, o_mlayout.object_data); + std::swap(layout.omap_root, o_mlayout.omap_root); + std::swap(layout.log_root, o_mlayout.log_root); + std::swap(layout.xattr_root, o_mlayout.xattr_root); + }); + } laddr_t get_hint() const final {return L_ADDR_MIN; } ~TestOnode() final = default; -- 2.39.5