]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/lba_manager: don't increase intermediate mappings'
authorXuehan Xu <xuxuehan@qianxin.com>
Sat, 4 May 2024 04:21:13 +0000 (12:21 +0800)
committerMatan Breizman <mbreizma@redhat.com>
Thu, 13 Jun 2024 12:25:49 +0000 (15:25 +0300)
refcount if LBAManager::clone_mapping() is called to remap mappings

TransactionManager::remap_pin() will increase the refcount itself

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
(cherry picked from commit 0cac72adc175404a013e86e450c58e9fb3f94af4)

src/crimson/os/seastore/lba_manager.h
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h
src/crimson/os/seastore/transaction_manager.h

index e46298dd44f3dfc0ded70db72a19cbbfeb8f3f41..b4d34c93616cb58c1b74de541b036526c02e24dd 100644 (file)
@@ -101,7 +101,8 @@ public:
     laddr_t hint,
     extent_len_t len,
     laddr_t intermediate_key,
-    laddr_t intermediate_base) = 0;
+    laddr_t intermediate_base,
+    bool inc_ref) = 0;
 
   virtual alloc_extent_ret reserve_region(
     Transaction &t,
index c43d60dcb5b0b3ed9721b51d5a0018c28e9d5c9c..c4124bcf0f5e81e4d33e8c38e2c7321618e870f5 100644 (file)
@@ -250,7 +250,8 @@ public:
     laddr_t hint,
     extent_len_t len,
     laddr_t intermediate_key,
-    laddr_t intermediate_base) final
+    laddr_t intermediate_base,
+    bool inc_ref) final
   {
     assert(intermediate_key != L_ADDR_NULL);
     assert(intermediate_base != L_ADDR_NULL);
@@ -263,27 +264,41 @@ public:
        nullptr}};
     return seastar::do_with(
       std::move(alloc_infos),
-      [this, &t, intermediate_base, hint](auto &alloc_infos) {
+      [this, &t, intermediate_base, hint, inc_ref](auto &alloc_infos) {
       return _alloc_extents(
        t,
        hint,
        alloc_infos,
        EXTENT_DEFAULT_REF_COUNT
-      ).si_then([&t, this, intermediate_base](auto mappings) {
+      ).si_then([&t, this, intermediate_base, inc_ref](auto mappings) {
        assert(mappings.size() == 1);
        auto indirect_mapping = std::move(mappings.front());
        assert(indirect_mapping->is_indirect());
-       return update_refcount(t, intermediate_base, 1, false
-       ).si_then([imapping=std::move(indirect_mapping)](auto p) mutable {
-         auto mapping = std::move(p.mapping);
+       auto to_indirect = [](auto &mapping, const auto &imapping) mutable {
          ceph_assert(mapping->is_stable());
          mapping->make_indirect(
            imapping->get_key(),
            imapping->get_length(),
            imapping->get_intermediate_key());
-         return seastar::make_ready_future<
-           LBAMappingRef>(std::move(mapping));
-       });
+       };
+       if (inc_ref) {
+         return update_refcount(t, intermediate_base, 1, false
+         ).si_then([imapping=std::move(indirect_mapping),
+                    to_indirect=std::move(to_indirect)](auto p) mutable {
+           auto mapping = std::move(p.mapping);
+           to_indirect(mapping, imapping);
+           return seastar::make_ready_future<
+             LBAMappingRef>(std::move(mapping));
+         });
+       } else {
+         return _get_mapping(t, intermediate_base
+         ).si_then([imapping=std::move(indirect_mapping),
+                    to_indirect=std::move(to_indirect)](auto mapping) mutable {
+           to_indirect(mapping, imapping);
+           return seastar::make_ready_future<
+             LBAMappingRef>(std::move(mapping));
+         });
+       }
       }).handle_error_interruptible(
        crimson::ct_error::input_output_error::pass_further{},
        crimson::ct_error::assert_all{"unexpect enoent"}
index c7e4121263a9002c9efdc1c2f3cac37daa03837f..862bd9fa12f9747bcdd9f2e244f1953c37ca4e32 100644 (file)
@@ -593,7 +593,8 @@ public:
       hint,
       mapping.get_length(),
       intermediate_key,
-      intermediate_base
+      intermediate_base,
+      true
     );
   }
 
@@ -1023,7 +1024,8 @@ private:
        remap_laddr,
        remap_length,
        intermediate_key,
-       intermediate_base);
+       intermediate_base,
+       false);
     }
     return fut.si_then([remap_laddr, remap_length, remap_paddr](auto &&ref) {
       assert(ref->get_key() == remap_laddr);