From: Yingxin Cheng Date: Tue, 22 Dec 2020 01:58:32 +0000 (+0800) Subject: crimson/onode-staged-tree: cleanup onode_t interfaces X-Git-Tag: v16.1.0~63^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6b9f9ef4178e11723e4c08c3f2c3e05ce0a512c7;p=ceph.git crimson/onode-staged-tree: cleanup onode_t interfaces Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/tree_types.h b/src/crimson/os/seastore/onode_manager/staged-fltree/tree_types.h index 5eaa0f31b52a..1973fd6cd147 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/tree_types.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/tree_types.h @@ -29,7 +29,13 @@ struct onode_t { onode_t ret{size, id}; return ret; } - static std::unique_ptr allocate(onode_t config) { + static void validate_tail_magic(const onode_t& onode) { + auto p_target = (const char*)&onode + onode.size - sizeof(uint32_t); + uint32_t target; + std::memcpy(&target, p_target, sizeof(uint32_t)); + ceph_assert(target == onode.size * 137); + } + static std::unique_ptr allocate(const onode_t& config) { ceph_assert(config.size >= sizeof(onode_t) + sizeof(uint32_t)); auto ret = std::make_unique(config.size); @@ -40,6 +46,7 @@ struct onode_t { uint32_t tail_magic = config.size * 137; p_mem += (config.size - sizeof(uint32_t)); std::memcpy(p_mem, &tail_magic, sizeof(uint32_t)); + validate_tail_magic(*p_onode); return ret; } diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h b/src/crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h index e904e0cb6c67..2afe6ec9f1f0 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h @@ -39,26 +39,15 @@ class Onodes { } } - ~Onodes() { - std::for_each(tracked_onodes.begin(), tracked_onodes.end(), - [] (onode_t* onode) { - std::free(onode); - }); - } + ~Onodes() = default; const onode_t& create(size_t size) { - ceph_assert(size >= sizeof(onode_t) + sizeof(uint32_t)); - uint32_t target = size * 137; - auto p_mem = (char*)std::malloc(size); - std::memset(p_mem, 0, size); - auto p_onode = (onode_t*)p_mem; - tracked_onodes.push_back(p_onode); - p_onode->size = size; - p_onode->id = id++; - p_mem += (size - sizeof(uint32_t)); - std::memcpy(p_mem, &target, sizeof(uint32_t)); - validate(*p_onode); - return *p_onode; + ceph_assert(size <= std::numeric_limits::max()); + onode_t config{static_cast(size), id++}; + auto onode = onode_t::allocate(config); + auto p_onode = onode.get(); + tracked_onodes.push_back(std::move(onode)); + return *reinterpret_cast(p_onode); } const onode_t& pick() const { @@ -77,21 +66,14 @@ class Onodes { ceph_assert(cursor.value()); ceph_assert(cursor.value() != &onode); ceph_assert(*cursor.value() == onode); - validate(*cursor.value()); + onode_t::validate_tail_magic(*cursor.value()); } private: - static void validate(const onode_t& node) { - auto p_target = (const char*)&node + node.size - sizeof(uint32_t); - uint32_t target; - std::memcpy(&target, p_target, sizeof(uint32_t)); - ceph_assert(target == node.size * 137); - } - uint16_t id = 0; mutable std::random_device rd; std::vector onodes; - std::vector tracked_onodes; + std::vector> tracked_onodes; }; class KVPool {