From: Zhang Song Date: Tue, 26 Aug 2025 03:34:37 +0000 (+0800) Subject: crimson/os/seastore/Onode: adapt new get hint approach X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9fa0f4e9832d25148adc71a13d41038f1a8e37a9;p=ceph.git crimson/os/seastore/Onode: adapt new get hint approach Signed-off-by: Zhang Song Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/onode.h b/src/crimson/os/seastore/onode.h index 82e2b37f994e..793e229fda6d 100644 --- a/src/crimson/os/seastore/onode.h +++ b/src/crimson/os/seastore/onode.h @@ -75,8 +75,36 @@ class Onode : public boost::intrusive_ref_counter< boost::thread_unsafe_counter> { protected: - virtual laddr_t get_hint() const = 0; + virtual laddr_hint_t init_hint( + extent_len_t block_size, + bool is_metadata) const = 0; + virtual laddr_hint_t generate_clone_hint( + local_object_id_t object_id, + extent_len_t block_size, + bool is_metadata) const = 0; + laddr_hint_t get_hint(extent_len_t block_size, bool is_metadata) const { + assert(block_size >= laddr_t::UNIT_SIZE); + auto prefix = get_clone_prefix(); + if (prefix) { + if (is_metadata) { + return laddr_hint_t::create_object_md_hint(*prefix, block_size); + } else { + return laddr_hint_t::create_object_data_hint(*prefix, block_size); + } + } else if (sibling_object_id) { + return generate_clone_hint( + *sibling_object_id, block_size, is_metadata); + } else { + return init_hint(block_size, is_metadata); + } + } + laddr_hint_t get_clone_hint(extent_len_t block_size, bool is_metadata) const { + return generate_clone_hint( + get_clone_prefix()->get_local_object_id(), block_size, is_metadata); + } const hobject_t hobj; + std::optional sibling_object_id; + public: explicit Onode(const hobject_t &hobj) : hobj(hobj) {} @@ -108,11 +136,19 @@ public: virtual void unset_need_cow(Transaction&) = 0; virtual void swap_layout(Transaction&, Onode&) = 0; - laddr_t get_metadata_hint(uint64_t block_size) const { - return get_hint(); + laddr_t get_metadata_hint(uint64_t block_size = laddr_t::UNIT_SIZE) const { + // TODO: return laddr_hint_t + return get_hint(block_size, /*is_metadata*/true).addr; + } + laddr_t get_data_hint(uint64_t block_size = laddr_t::UNIT_SIZE) const { + // TODO: return laddr_hint_t + return get_hint(block_size, /*is_metadata*/false).addr; + } + laddr_hint_t get_metadata_clone_hint(uint64_t block_size = laddr_t::UNIT_SIZE) const { + return get_clone_hint(block_size, /*is_metadata*/true); } - laddr_t get_data_hint() const { - return get_hint(); + laddr_hint_t get_data_clone_hint(uint64_t block_size = laddr_t::UNIT_SIZE) const { + return get_clone_hint(block_size, /*is_metadata*/false); } const omap_root_le_t& get_root(omap_type_t type) const { return get_layout().get_root(type); 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 c2d6e9ff7938..2d234eeb7638 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 @@ -296,8 +296,16 @@ struct FLTreeOnode final : Onode, Value { status = status_t::DELETED; } - laddr_t get_hint() const final { - return Value::get_hint(); + laddr_hint_t init_hint( + extent_len_t block_size, + bool is_metadata) const final { + return Value::init_hint(block_size, is_metadata); + } + laddr_hint_t generate_clone_hint( + local_object_id_t object_id, + extent_len_t block_size, + bool is_metadata) const final { + return Value::generate_clone_hint(object_id, block_size, is_metadata); } ~FLTreeOnode() final {} }; diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h index 8cbcb61641fc..f4a82b088dc3 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/key_layout.h @@ -42,15 +42,6 @@ template<> struct _full_key_type { using type = key_hobj_t; }; template using full_key_t = typename _full_key_type::type; -static laddr_t get_lba_hint(shard_t shard, pool_t pool, crush_hash_t crush) { - // FIXME: It is possible that PGs from different pools share the same prefix - // if the mask 0xFF is not long enough, result in unexpected transaction - // conflicts. - return laddr_t::from_raw_uint((uint64_t)(shard & 0xFF)<<56 | - (uint64_t)(pool & 0xFF)<<48 | - (uint64_t)(crush )<<16); -} - struct node_offset_packed_t { node_offset_t value; } __attribute__((packed)); @@ -439,8 +430,32 @@ class key_hobj_t { // Note: this is the reversed version of the object hash return ghobj.hobj.get_bitwise_key_u32(); } - laddr_t get_hint() const { - return get_lba_hint(shard(), pool(), crush()); + laddr_hint_t create_onode_hint( + extent_len_t block_size = laddr_t::UNIT_SIZE) const { + return laddr_hint_t::create_onode_hint( + shard(), pool(), crush(), block_size); + } + laddr_hint_t create_fresh_object_data_hint( + extent_len_t block_size) const { + return laddr_hint_t::create_fresh_object_data_hint( + shard(), pool(), crush(), block_size); + } + laddr_hint_t create_fresh_object_md_hint( + extent_len_t block_size) const { + return laddr_hint_t::create_fresh_object_md_hint( + shard(), pool(), crush(), block_size); + } + laddr_hint_t create_clone_object_data_hint( + local_object_id_t object_id, + extent_len_t block_size) const { + return laddr_hint_t::create_clone_object_data_hint( + shard(), pool(), crush(), object_id, block_size); + } + laddr_hint_t create_clone_object_md_hint( + local_object_id_t object_id, + extent_len_t block_size) const { + return laddr_hint_t::create_clone_object_md_hint( + shard(), pool(), crush(), object_id, block_size); } std::string_view nspace() const { // TODO(cross-node string dedup) @@ -532,8 +547,32 @@ class key_view_t { inline shard_t shard() const; inline pool_t pool() const; inline crush_hash_t crush() const; - laddr_t get_hint() const { - return get_lba_hint(shard(), pool(), crush()); + laddr_hint_t create_onode_hint( + extent_len_t block_size = laddr_t::UNIT_SIZE) const { + return laddr_hint_t::create_onode_hint( + shard(), pool(), crush(), block_size); + } + laddr_hint_t create_fresh_object_data_hint( + extent_len_t block_size) const { + return laddr_hint_t::create_fresh_object_data_hint( + shard(), pool(), crush(), block_size); + } + laddr_hint_t create_fresh_object_md_hint( + extent_len_t block_size) const { + return laddr_hint_t::create_fresh_object_md_hint( + shard(), pool(), crush(), block_size); + } + laddr_hint_t create_clone_object_data_hint( + local_object_id_t object_id, + extent_len_t block_size) const { + return laddr_hint_t::create_clone_object_data_hint( + shard(), pool(), crush(), object_id, block_size); + } + laddr_hint_t create_clone_object_md_hint( + local_object_id_t object_id, + extent_len_t block_size) const { + return laddr_hint_t::create_clone_object_md_hint( + shard(), pool(), crush(), object_id, block_size); } std::string_view nspace() const { // TODO(cross-node string dedup) diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/value.cc b/src/crimson/os/seastore/onode_manager/staged-fltree/value.cc index e949aa931a00..d875037b5f7a 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/value.cc +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/value.cc @@ -82,9 +82,31 @@ Value::do_prepare_mutate_payload(Transaction& t) return p_cursor->prepare_mutate_value_payload(get_context(t)); } -laddr_t Value::get_hint() const +laddr_hint_t Value::init_hint( + extent_len_t block_size, + bool is_metadata) const { - return p_cursor->get_key_view(vb.get_header_magic()).get_hint(); + if (is_metadata) { + return p_cursor->get_key_view(vb.get_header_magic()) + .create_fresh_object_md_hint(block_size); + } else { + return p_cursor->get_key_view(vb.get_header_magic()) + .create_fresh_object_data_hint(block_size); + } +} + +laddr_hint_t Value::generate_clone_hint( + local_object_id_t object_id, + extent_len_t block_size, + bool is_metadata) const +{ + if (is_metadata) { + return p_cursor->get_key_view(vb.get_header_magic()) + .create_clone_object_md_hint(object_id, block_size); + } else { + return p_cursor->get_key_view(vb.get_header_magic()) + .create_clone_object_data_hint(object_id, block_size); + } } std::unique_ptr diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/value.h b/src/crimson/os/seastore/onode_manager/staged-fltree/value.h index bf6fc87175c1..33ef0970c130 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/value.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/value.h @@ -201,7 +201,13 @@ class Value { return read_value_header()->payload_size; } - laddr_t get_hint() const; + laddr_hint_t init_hint( + extent_len_t block_size, + bool is_metadata) const; + laddr_hint_t generate_clone_hint( + local_object_id_t object_id, + extent_len_t block_size, + bool is_metadata) const; bool operator==(const Value& v) const { return p_cursor == v.p_cursor; } bool operator!=(const Value& v) const { return !(*this == v); } diff --git a/src/test/crimson/seastore/test_object_data_handler.cc b/src/test/crimson/seastore/test_object_data_handler.cc index dd3a6cb552b3..fa94bcf31260 100644 --- a/src/test/crimson/seastore/test_object_data_handler.cc +++ b/src/test/crimson/seastore/test_object_data_handler.cc @@ -43,7 +43,25 @@ public: std::swap(layout.xattr_root, o_mlayout.xattr_root); }); } - laddr_t get_hint() const final {return L_ADDR_MIN; } + laddr_hint_t get_hint() const { + laddr_hint_t hint; + hint.addr = laddr_t::from_byte_offset(0); + hint.condition = laddr_conflict_condition_t::all_at_object_content; + hint.policy = laddr_conflict_policy_t::linear_search; + hint.block_size = laddr_t::UNIT_SIZE; + return hint; + } + laddr_hint_t init_hint( + extent_len_t block_size, + bool is_metadata) const final { + return get_hint(); + } + laddr_hint_t generate_clone_hint( + local_object_id_t object_id, + extent_len_t block_size, + bool is_metadata) const final { + return get_hint(); + } ~TestOnode() final = default; void set_need_cow(Transaction &t) final {