]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/async_cleaner: cleanup gc_reclaim_space()
authorYingxin Cheng <yingxin.cheng@intel.com>
Thu, 11 Aug 2022 05:56:43 +0000 (13:56 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Mon, 15 Aug 2022 03:34:51 +0000 (11:34 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/async_cleaner.cc
src/crimson/os/seastore/async_cleaner.h
src/crimson/os/seastore/backref/btree_backref_manager.cc
src/crimson/os/seastore/backref/btree_backref_manager.h
src/crimson/os/seastore/backref_manager.h

index 70e83bb4f88e2d54e741fc2245d4b43ecea28043..99307cb3fa9d3931605880df5f431b9a48195ca5 100644 (file)
@@ -900,22 +900,6 @@ AsyncCleaner::_retrieve_live_extents(
   });
 }
 
-AsyncCleaner::retrieve_backref_mappings_ret
-AsyncCleaner::retrieve_backref_mappings(
-  paddr_t start_paddr,
-  paddr_t end_paddr)
-{
-  // Backref-tree doesn't support tree-read during tree-updates with parallel
-  // transactions.  So, concurrent transactions between trim and reclaim are
-  // not allowed right now.
-  return ecb->with_transaction_weak(
-      "backref_get_mappings",
-      [this, start_paddr, end_paddr](auto &t) {
-    return backref_manager.get_mappings(
-      t, start_paddr, end_paddr);
-  });
-}
-
 AsyncCleaner::gc_reclaim_space_ret AsyncCleaner::gc_reclaim_space()
 {
   LOG_PREFIX(AsyncCleaner::gc_reclaim_space);
@@ -939,110 +923,114 @@ AsyncCleaner::gc_reclaim_space_ret AsyncCleaner::gc_reclaim_space()
   double pavail_ratio = get_projected_available_ratio();
   sea_time_point start = seastar::lowres_system_clock::now();
 
-  return seastar::do_with(
-    (size_t)0,
-    (size_t)0,
-    [this, pavail_ratio, start](
-      auto &reclaimed,
-      auto &runs) {
-    return retrieve_backref_mappings(
+  // Backref-tree doesn't support tree-read during tree-updates with parallel
+  // transactions.  So, concurrent transactions between trim and reclaim are
+  // not allowed right now.
+  return ecb->with_transaction_weak(
+      "backref_get_mappings",
+      [this](auto &t) {
+    return backref_manager.get_mappings(
+      t,
       reclaim_state->start_pos,
-      reclaim_state->end_pos
-    ).safe_then([this, &reclaimed, &runs](auto pin_list) {
-      return seastar::do_with(
-       std::move(pin_list),
-       [this, &reclaimed, &runs](auto &pin_list) {
-       return repeat_eagain(
-         [this, &reclaimed, &runs, &pin_list]() mutable {
-         reclaimed = 0;
-         runs++;
-         return ecb->with_transaction_intr(
-           Transaction::src_t::CLEANER_RECLAIM,
-           "reclaim_space",
-           [this, &reclaimed, &pin_list](auto &t) {
-           return seastar::do_with(
-             std::vector<CachedExtentRef>(),
-             [this, &reclaimed, &t, &pin_list]
-             (auto &extents) {
-             return backref_manager.retrieve_backref_extents(
-               t,
-               backref_manager.get_cached_backref_extents_in_range(
-                 reclaim_state->start_pos, reclaim_state->end_pos),
-               extents
-             ).si_then([this, &extents, &t, &pin_list] {
-               // calculate live extents
-               auto cached_backrefs = 
-                 backref_manager.get_cached_backref_entries_in_range(
-                   reclaim_state->start_pos, reclaim_state->end_pos);
-               std::set<
-                 backref_entry_t,
-                 backref_entry_t::cmp_t> backrefs;
-               for (auto &pin : pin_list) {
-                 backrefs.emplace(pin->get_key(), pin->get_val(),
-                   pin->get_length(), pin->get_type(), journal_seq_t());
-               }
-               for (auto &backref : cached_backrefs) {
-                 if (backref.laddr == L_ADDR_NULL) {
-                   auto it = backrefs.find(backref.paddr);
-                   assert(it->len == backref.len);
-                   backrefs.erase(it);
-                 } else {
-                   backrefs.emplace(backref.paddr, backref.laddr,
-                     backref.len, backref.type, backref.seq);
-                 }
-               }
-               return _retrieve_live_extents(
-                 t, std::move(backrefs), extents);
-             }).si_then([&extents, this, &t, &reclaimed] {
-               auto modify_time = segments[reclaim_state->get_segment_id()].modify_time;
-               return trans_intr::do_for_each(
-                 extents,
-                 [this, modify_time, &t, &reclaimed](auto &ext) {
-                 reclaimed += ext->get_length();
-                 return ecb->rewrite_extent(
-                     t, ext, reclaim_state->target_generation, modify_time);
-               });
-             });
-           }).si_then([this, &t] {
-             return ecb->submit_transaction_direct(t);
-           });
-         });
-       });
-      });
-    }).safe_then(
-      [&reclaimed, this, pavail_ratio, start, &runs] {
-      LOG_PREFIX(AsyncCleaner::gc_reclaim_space);
-      stats.reclaiming_bytes += reclaimed;
-      auto d = seastar::lowres_system_clock::now() - start;
-      DEBUG("duration: {}, pavail_ratio before: {}, repeats: {}", d, pavail_ratio, runs);
-      if (reclaim_state->is_complete()) {
-        auto segment_to_release = reclaim_state->get_segment_id();
-        INFO("reclaim {} finish, reclaimed alive/total={}",
-             segment_to_release,
-             stats.reclaiming_bytes/(double)segments.get_segment_size());
-       stats.reclaimed_bytes += stats.reclaiming_bytes;
-       stats.reclaimed_segment_bytes += segments.get_segment_size();
-       stats.reclaiming_bytes = 0;
-       reclaim_state.reset();
-        return sm_group->release_segment(segment_to_release
-        ).safe_then([this, FNAME, segment_to_release] {
-          auto old_usage = calc_utilization(segment_to_release);
-          if(unlikely(old_usage != 0)) {
-            space_tracker->dump_usage(segment_to_release);
-            ERRORT("segment {} old_usage {} != 0",
-                   segment_to_release, old_usage);
-            ceph_abort();
-          }
-          segments.mark_empty(segment_to_release);
-          auto new_usage = calc_utilization(segment_to_release);
-          adjust_segment_util(old_usage, new_usage);
-          INFO("released {}, {}",
-               segment_to_release, gc_stat_printer_t{this, false});
-          maybe_wake_gc_blocked_io();
+      reclaim_state->end_pos);
+  }).safe_then([this, FNAME, pavail_ratio, start](auto pin_list) {
+    return seastar::do_with(
+      std::move(pin_list),
+      (size_t)0,
+      (size_t)0,
+      [this, FNAME, pavail_ratio, start](
+        auto &pin_list, auto &reclaimed, auto &runs)
+    {
+      return repeat_eagain([this, &reclaimed, &runs, &pin_list]() mutable {
+        reclaimed = 0;
+        runs++;
+        return ecb->with_transaction_intr(
+          Transaction::src_t::CLEANER_RECLAIM,
+          "reclaim_space",
+          [this, &reclaimed, &pin_list](auto &t)
+        {
+          return seastar::do_with(
+            std::vector<CachedExtentRef>(),
+            [this, &reclaimed, &t, &pin_list](auto &extents)
+          {
+            return backref_manager.retrieve_backref_extents_in_range(
+              t,
+              reclaim_state->start_pos,
+              reclaim_state->end_pos
+            ).si_then([this, &extents, &t, &pin_list](auto backref_extents) {
+              extents.insert(extents.end(),
+                             std::make_move_iterator(backref_extents.begin()),
+                             std::make_move_iterator(backref_extents.end()));
+              // calculate live extents
+              auto cached_backrefs =
+                backref_manager.get_cached_backref_entries_in_range(
+                  reclaim_state->start_pos, reclaim_state->end_pos);
+              std::set<
+                backref_entry_t,
+                backref_entry_t::cmp_t> backrefs;
+              for (auto &pin : pin_list) {
+                backrefs.emplace(pin->get_key(), pin->get_val(),
+                  pin->get_length(), pin->get_type(), journal_seq_t());
+              }
+              for (auto &backref : cached_backrefs) {
+                if (backref.laddr == L_ADDR_NULL) {
+                  auto it = backrefs.find(backref.paddr);
+                  assert(it->len == backref.len);
+                  backrefs.erase(it);
+                } else {
+                  backrefs.emplace(backref.paddr, backref.laddr,
+                    backref.len, backref.type, backref.seq);
+                }
+              }
+              return _retrieve_live_extents(t, std::move(backrefs), extents);
+            }).si_then([&extents, this, &t, &reclaimed] {
+              auto modify_time = segments[reclaim_state->get_segment_id()].modify_time;
+              return trans_intr::do_for_each(
+                extents,
+                [this, modify_time, &t, &reclaimed](auto &ext)
+              {
+                reclaimed += ext->get_length();
+                return ecb->rewrite_extent(
+                    t, ext, reclaim_state->target_generation, modify_time);
+              });
+            });
+          }).si_then([this, &t] {
+            return ecb->submit_transaction_direct(t);
+          });
         });
-      } else {
-        return SegmentManager::release_ertr::now();
-      }
+      }).safe_then([this, FNAME, pavail_ratio, start, &reclaimed, &runs] {
+        stats.reclaiming_bytes += reclaimed;
+        auto d = seastar::lowres_system_clock::now() - start;
+        DEBUG("duration: {}, pavail_ratio before: {}, repeats: {}", d, pavail_ratio, runs);
+        if (reclaim_state->is_complete()) {
+          auto segment_to_release = reclaim_state->get_segment_id();
+          INFO("reclaim {} finish, reclaimed alive/total={}",
+               segment_to_release,
+               stats.reclaiming_bytes/(double)segments.get_segment_size());
+          stats.reclaimed_bytes += stats.reclaiming_bytes;
+          stats.reclaimed_segment_bytes += segments.get_segment_size();
+          stats.reclaiming_bytes = 0;
+          reclaim_state.reset();
+          return sm_group->release_segment(segment_to_release
+          ).safe_then([this, FNAME, segment_to_release] {
+            auto old_usage = calc_utilization(segment_to_release);
+            if(unlikely(old_usage != 0)) {
+              space_tracker->dump_usage(segment_to_release);
+              ERRORT("segment {} old_usage {} != 0",
+                     segment_to_release, old_usage);
+              ceph_abort();
+            }
+            segments.mark_empty(segment_to_release);
+            auto new_usage = calc_utilization(segment_to_release);
+            adjust_segment_util(old_usage, new_usage);
+            INFO("released {}, {}",
+                 segment_to_release, gc_stat_printer_t{this, false});
+            maybe_wake_gc_blocked_io();
+          });
+        } else {
+          return SegmentManager::release_ertr::now();
+        }
+      });
     });
   });
 }
index 528e569c1b258a04fded394f2c04c539e2ce48f7..2c382d1efab4327c4015742f38f2428dcb4947fd 100644 (file)
@@ -1169,13 +1169,6 @@ private:
       backref_entry_t::cmp_t> &&backrefs,
     std::vector<CachedExtentRef> &extents);
 
-  using retrieve_backref_mappings_ertr = work_ertr;
-  using retrieve_backref_mappings_ret =
-    retrieve_backref_mappings_ertr::future<backref_pin_list_t>;
-  retrieve_backref_mappings_ret retrieve_backref_mappings(
-    paddr_t start_paddr,
-    paddr_t end_paddr);
-
   /*
    * Segments calculations
    */
index 2f50d13768bb25d7ff1d8d838580ad7e8deb3bad..4e9e7a4c382c981a4082a57a11a118a9e9846fc6 100644 (file)
@@ -505,14 +505,6 @@ BtreeBackrefManager::get_cached_backref_entries_in_range(
   return cache.get_backref_entries_in_range(start, end);
 }
 
-Cache::backref_extent_entry_query_set_t
-BtreeBackrefManager::get_cached_backref_extents_in_range(
-  paddr_t start,
-  paddr_t end)
-{
-  return cache.get_backref_extents_in_range(start, end);
-}
-
 void BtreeBackrefManager::cache_new_backref_extent(
   paddr_t paddr,
   extent_types_t type)
@@ -520,27 +512,34 @@ void BtreeBackrefManager::cache_new_backref_extent(
   return cache.add_backref_extent(paddr, type);
 }
 
-BtreeBackrefManager::retrieve_backref_extents_ret
-BtreeBackrefManager::retrieve_backref_extents(
+BtreeBackrefManager::retrieve_backref_extents_in_range_ret
+BtreeBackrefManager::retrieve_backref_extents_in_range(
   Transaction &t,
-  Cache::backref_extent_entry_query_set_t &&backref_extents,
-  std::vector<CachedExtentRef> &extents)
+  paddr_t start,
+  paddr_t end)
 {
-  return trans_intr::parallel_for_each(
-    backref_extents,
-    [this, &extents, &t](auto &ent) {
-    // only the gc fiber which is single can rewrite backref extents,
-    // so it must be alive
-    assert(is_backref_node(ent.type));
-    LOG_PREFIX(BtreeBackrefManager::retrieve_backref_extents);
-    DEBUGT("getting backref extent of type {} at {}",
-      t,
-      ent.type,
-      ent.paddr);
-    return cache.get_extent_by_type(
-      t, ent.type, ent.paddr, L_ADDR_NULL, BACKREF_NODE_SIZE
-    ).si_then([&extents](auto ext) {
-      extents.emplace_back(std::move(ext));
+  return seastar::do_with(
+      std::vector<CachedExtentRef>(),
+      [this, &t, start, end](auto &extents) {
+    auto backref_extents = cache.get_backref_extents_in_range(start, end);
+    return trans_intr::parallel_for_each(
+      backref_extents,
+      [this, &extents, &t](auto &ent) {
+      // only the gc fiber which is single can rewrite backref extents,
+      // so it must be alive
+      assert(is_backref_node(ent.type));
+      LOG_PREFIX(BtreeBackrefManager::retrieve_backref_extents_in_range);
+      DEBUGT("getting backref extent of type {} at {}",
+        t,
+        ent.type,
+        ent.paddr);
+      return cache.get_extent_by_type(
+        t, ent.type, ent.paddr, L_ADDR_NULL, BACKREF_NODE_SIZE
+      ).si_then([&extents](auto ext) {
+        extents.emplace_back(std::move(ext));
+      });
+    }).si_then([&extents] {
+      return std::move(extents);
     });
   });
 }
index 03fa7e1152103ba732d92df3f447d58d9a19a775..d2241a5dcc3aebb75f8a246a33c07529834365fb 100644 (file)
@@ -102,16 +102,12 @@ public:
     paddr_t start,
     paddr_t end) final;
 
-  Cache::backref_extent_entry_query_set_t
-  get_cached_backref_extents_in_range(
+  retrieve_backref_extents_in_range_ret
+  retrieve_backref_extents_in_range(
+    Transaction &t,
     paddr_t start,
     paddr_t end) final;
 
-  retrieve_backref_extents_ret retrieve_backref_extents(
-    Transaction &t,
-    Cache::backref_extent_entry_query_set_t &&backref_extents,
-    std::vector<CachedExtentRef> &extents) final;
-
   void cache_new_backref_extent(paddr_t paddr, extent_types_t type) final;
 
 private:
index e4d6890b7d511bc25c7ae438272dd8b223a8d763..5db637086008f13af967737f6d24f5207bbd8edc 100644 (file)
@@ -87,22 +87,15 @@ public:
     paddr_t start,
     paddr_t end) = 0;
 
-  virtual Cache::backref_extent_entry_query_set_t
-  get_cached_backref_extents_in_range(
+  using retrieve_backref_extents_in_range_iertr = base_iertr;
+  using retrieve_backref_extents_in_range_ret =
+    retrieve_backref_extents_in_range_iertr::future<std::vector<CachedExtentRef>>;
+  virtual retrieve_backref_extents_in_range_ret
+  retrieve_backref_extents_in_range(
+    Transaction &t,
     paddr_t start,
     paddr_t end) = 0;
 
-  using retrieve_backref_extents_iertr = trans_iertr<
-    crimson::errorator<
-      crimson::ct_error::input_output_error>
-    >;
-  using retrieve_backref_extents_ret =
-    retrieve_backref_extents_iertr::future<>;
-  virtual retrieve_backref_extents_ret retrieve_backref_extents(
-    Transaction &t,
-    Cache::backref_extent_entry_query_set_t &&backref_extents,
-    std::vector<CachedExtentRef> &extents) = 0;
-
   virtual void cache_new_backref_extent(paddr_t paddr, extent_types_t type) = 0;
 
   /**