]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/onode-staged-tree: cleanup onode_t interfaces
authorYingxin Cheng <yingxin.cheng@intel.com>
Tue, 22 Dec 2020 01:58:32 +0000 (09:58 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Thu, 24 Dec 2020 03:45:48 +0000 (11:45 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/onode_manager/staged-fltree/tree_types.h
src/crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h

index 5eaa0f31b52aa61bcc2918f19af59e0996ed7aae..1973fd6cd14728e997c891456bed61fd779ac30f 100644 (file)
@@ -29,7 +29,13 @@ struct onode_t {
     onode_t ret{size, id};
     return ret;
   }
-  static std::unique_ptr<char[]> 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<char[]> allocate(const onode_t& config) {
     ceph_assert(config.size >= sizeof(onode_t) + sizeof(uint32_t));
 
     auto ret = std::make_unique<char[]>(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;
   }
index e904e0cb6c67665ea1f1b3bad876b7a29e4a8390..2afe6ec9f1f06beee233a472267153b2510df482 100644 (file)
@@ -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<uint16_t>::max());
+    onode_t config{static_cast<uint16_t>(size), id++};
+    auto onode = onode_t::allocate(config);
+    auto p_onode = onode.get();
+    tracked_onodes.push_back(std::move(onode));
+    return *reinterpret_cast<onode_t*>(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<const onode_t*> onodes;
-  std::vector<onode_t*> tracked_onodes;
+  std::vector<std::unique_ptr<char[]>> tracked_onodes;
 };
 
 class KVPool {