]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: track uncached released extents
authorSamuel Just <sjust@redhat.com>
Thu, 18 Mar 2021 22:20:36 +0000 (15:20 -0700)
committerSamuel Just <sjust@redhat.com>
Wed, 24 Mar 2021 05:41:11 +0000 (22:41 -0700)
We need to properly release the space after commit.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/lba_manager.h
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc
src/crimson/os/seastore/transaction.h
src/crimson/os/seastore/transaction_manager.cc

index e976d9bb6604e0e44d7f699ff3c4c1ef1c37aaa0..619971bf2bb9c5ea5162f3e8ea7a433acb5bab67 100644 (file)
@@ -33,7 +33,7 @@ Cache::~Cache()
 }
 
 Cache::retire_extent_ret Cache::retire_extent_if_cached(
-  Transaction &t, paddr_t addr)
+  Transaction &t, paddr_t addr, extent_len_t length)
 {
   if (auto ext = t.write_set.find_offset(addr); ext != t.write_set.end()) {
     logger().debug("{}: found {} in t.write_set", __func__, addr);
@@ -47,6 +47,7 @@ Cache::retire_extent_ret Cache::retire_extent_if_cached(
       return retire_extent_ertr::now();
     });
   } else {
+    t.add_to_retired_uncached(addr, length);
     return retire_extent_ertr::now();
   }
 }
@@ -332,6 +333,11 @@ void Cache::complete_commit(
        i->get_paddr(),
        i->get_length());
     }
+    for (auto &i: t.retired_uncached) {
+      cleaner->mark_space_free(
+       i.first,
+       i.second);
+    }
   }
 
   for (auto &i: t.mutated_block_list) {
index 08b71f315cc718bcbc3779ef8465d106640d5578..3bf112840ff48876371cbe18c4a50100a571f4f7 100644 (file)
@@ -110,7 +110,7 @@ public:
   using retire_extent_ertr = base_ertr;
   using retire_extent_ret = retire_extent_ertr::future<>;
   retire_extent_ret retire_extent_if_cached(
-    Transaction &t, paddr_t addr);
+    Transaction &t, paddr_t addr, extent_len_t length);
 
   /**
    * get_root
index 2622a76ff74a018791cd16f82a65a07863296b2e..26646ff0546bddad1096338145ddc670e6285080 100644 (file)
@@ -90,6 +90,7 @@ public:
   struct ref_update_result_t {
     unsigned refcount = 0;
     paddr_t addr;
+    extent_len_t length = 0;
   };
   using ref_ertr = base_ertr::extend<
     crimson::ct_error::enoent>;
index a0540b38666a1102c8932b39951c9be5f8170e59..b227e8e6e3a5ee1ab7cca289ba52ff79b26c4519 100644 (file)
@@ -522,7 +522,11 @@ BtreeLBAManager::update_refcount_ret BtreeLBAManager::update_refcount(
       out.refcount += delta;
       return out;
     }).safe_then([](auto result) {
-      return ref_update_result_t{result.refcount, result.paddr};
+      return ref_update_result_t{
+       result.refcount,
+       result.paddr,
+       result.len
+       };
     });
 }
 
index a2ad59825ccac3a69d6226c3260c9b6145e94543..e487fa6d42ad5eea06d1b826914ef12a29d2b7bc 100644 (file)
@@ -61,6 +61,10 @@ public:
     }
   }
 
+  void add_to_retired_uncached(paddr_t addr, extent_len_t length) {
+    retired_uncached.emplace_back(std::make_pair(addr, length));
+  }
+
   void add_to_read_set(CachedExtentRef ref) {
     if (is_weak()) return;
 
@@ -133,6 +137,8 @@ private:
   ///< if != NULL_SEG_ID, release this segment after completion
   segment_id_t to_release = NULL_SEG_ID;
 
+  std::vector<std::pair<paddr_t, extent_len_t>> retired_uncached;
+
 public:
   Transaction(
     OrderingHandle &&handle,
index d1b97d913c10ca6e95950e2da3f9a37b9a26e609..3e530869349276150b9fc9d3d553aec2244dd99e 100644 (file)
@@ -160,7 +160,9 @@ TransactionManager::ref_ret TransactionManager::dec_ref(
       logger().debug(
        "TransactionManager::dec_ref: offset {} refcount 0",
        offset);
-      return cache->retire_extent_if_cached(t, result.addr).safe_then([] {
+      return cache->retire_extent_if_cached(
+       t, result.addr, result.length
+      ).safe_then([] {
        return ref_ret(
          ref_ertr::ready_future_marker{},
          0);