]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cached_extent: unify extent ptr creation
authorYingxin Cheng <yingxin.cheng@intel.com>
Wed, 23 Oct 2024 06:56:01 +0000 (14:56 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Thu, 28 Nov 2024 01:32:50 +0000 (09:32 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/cached_extent.h
src/crimson/os/seastore/extent_placement_manager.h

index c37d9c5c7cd39920730ce58d05ce6c100a95cf7e..cd65d82fe5a85b8895470ede7e2872ae2431a74e 100644 (file)
@@ -411,7 +411,7 @@ public:
        assert(!ret->is_mutable());
         SUBDEBUGT(seastore_cache, "{} {}~{} is present on t without been \
           fully loaded, reading ... {}", t, T::TYPE, offset, length, *ret);
-        auto bp = alloc_cache_buf(ret->get_length());
+        auto bp = create_extent_ptr_rand(ret->get_length());
         ret->set_bptr(std::move(bp));
         return read_extent<T>(
           ret->cast<T>());
@@ -592,7 +592,7 @@ public:
         "{} {}~{} is present without been fully loaded, reading ... -- {}",
         p_extent->get_type(), p_extent->get_paddr(),p_extent->get_length(),
         *p_extent);
-      auto bp = alloc_cache_buf(p_extent->get_length());
+      auto bp = create_extent_ptr_rand(p_extent->get_length());
       p_extent->set_bptr(std::move(bp));
       return read_extent<CachedExtent>(CachedExtentRef(p_extent));
     }
@@ -647,7 +647,7 @@ private:
     auto cached = query_cache(offset);
     if (!cached) {
       auto ret = CachedExtent::make_cached_extent_ref<T>(
-        alloc_cache_buf(length));
+        create_extent_ptr_rand(length));
       ret->init(CachedExtent::extent_state_t::CLEAN_PENDING,
                 offset,
                 PLACEMENT_HINT_NULL,
@@ -667,7 +667,7 @@ private:
     // extent PRESENT in cache
     if (is_retired_placeholder_type(cached->get_type())) {
       auto ret = CachedExtent::make_cached_extent_ref<T>(
-        alloc_cache_buf(length));
+        create_extent_ptr_rand(length));
       ret->init(CachedExtent::extent_state_t::CLEAN_PENDING,
                 offset,
                 PLACEMENT_HINT_NULL,
@@ -695,7 +695,7 @@ private:
       SUBDEBUG(seastore_cache,
         "{} {}~{} is present without been fully loaded, reading ... -- {}",
         T::TYPE, offset, length, *ret);
-      auto bp = alloc_cache_buf(length);
+      auto bp = create_extent_ptr_rand(length);
       ret->set_bptr(std::move(bp));
       return read_extent<T>(
         std::move(ret));
@@ -791,7 +791,7 @@ private:
        assert(!ret->is_mutable());
         SUBDEBUGT(seastore_cache, "{} {}~{} {} is present on t without been \
                   fully loaded, reading ...", t, type, offset, length, laddr);
-        auto bp = alloc_cache_buf(ret->get_length());
+        auto bp = create_extent_ptr_rand(ret->get_length());
         ret->set_bptr(std::move(bp));
         return read_extent<CachedExtent>(
           std::move(ret));
@@ -1763,15 +1763,6 @@ private:
   seastar::metrics::metric_group metrics;
   void register_metrics();
 
-  /// alloc buffer for cached extent
-  bufferptr alloc_cache_buf(size_t size) {
-    // TODO: memory pooling etc
-    auto bp = ceph::bufferptr(
-      buffer::create_page_aligned(size));
-    bp.zero();
-    return bp;
-  }
-
   void backref_batch_update(
     std::vector<backref_entry_ref> &&,
     const journal_seq_t &);
index 6025725aa337d6f79e4acc07d8884aec1bd40cb5..8443c99b90a92b0c541741e9b0214e4d9a14fc8e 100644 (file)
@@ -41,6 +41,18 @@ void intrusive_ptr_release(CachedExtent *);
 
 #endif
 
+inline ceph::bufferptr create_extent_ptr_rand(extent_len_t len) {
+  assert(is_aligned(len, CEPH_PAGE_SIZE));
+  assert(len > 0);
+  return ceph::bufferptr(buffer::create_page_aligned(len));
+}
+
+inline ceph::bufferptr create_extent_ptr_zero(extent_len_t len) {
+  auto bp = create_extent_ptr_rand(len);
+  bp.zero();
+  return bp;
+}
+
 template <typename T>
 using TCachedExtentRef = boost::intrusive_ptr<T>;
 
@@ -762,7 +774,7 @@ protected:
       poffset(other.poffset) {
       assert((length % CEPH_PAGE_SIZE) == 0);
       if (other.is_fully_loaded()) {
-        ptr.emplace(buffer::create_page_aligned(length));
+        ptr = create_extent_ptr_rand(length);
         other.ptr->copy_out(0, length, ptr->c_str());
       } else {
         // the extent must be fully loaded before CoW
index c4e98a5f4a1b79806eed490ccf41b1e02ff0089f..d400a9bbdc7354b7f7a4f4e208500758c4181d2b 100644 (file)
@@ -371,9 +371,7 @@ public:
 
     // XXX: bp might be extended to point to different memory (e.g. PMem)
     // according to the allocator.
-    auto bp = ceph::bufferptr(
-      buffer::create_page_aligned(length));
-    bp.zero();
+    auto bp = create_extent_ptr_zero(length);
 
     return alloc_result_t{addr, std::move(bp), gen};
   }
@@ -405,9 +403,7 @@ public:
 #ifdef UNIT_TESTS_BUILT
     if (unlikely(external_paddr.has_value())) {
       assert(external_paddr->is_fake());
-      auto bp = ceph::bufferptr(
-        buffer::create_page_aligned(length));
-      bp.zero();
+      auto bp = create_extent_ptr_zero(length);
       allocs.emplace_back(alloc_result_t{*external_paddr, std::move(bp), gen});
     } else {
 #else
@@ -419,8 +415,7 @@ public:
         auto left = ext.len;
         while (left > 0) {
           auto len = std::min(max_data_allocation_size, left);
-          auto bp = ceph::bufferptr(buffer::create_page_aligned(len));
-          bp.zero();
+          auto bp = create_extent_ptr_zero(len);
           auto start = ext.start.is_delayed()
                         ? ext.start
                         : ext.start + (ext.len - left);