]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: reserve space before writing delayed extents
authorZhang Song <zhangsong325@gmail.com>
Tue, 6 Dec 2022 07:34:07 +0000 (15:34 +0800)
committerZhang Song <zhangsong325@gmail.com>
Wed, 7 Dec 2022 06:26:58 +0000 (14:26 +0800)
Signed-off-by: Zhang Song <zhangsong325@gmail.com>
src/crimson/os/seastore/extent_placement_manager.cc
src/crimson/os/seastore/extent_placement_manager.h
src/crimson/os/seastore/transaction.h
src/crimson/os/seastore/transaction_manager.cc
src/crimson/os/seastore/transaction_manager.h

index 8b7e6a99f3e163986b33fcd1234c6a2a3c9fba41..54fd44c4758dc46cb8a5c9869cfb86f86956673b 100644 (file)
@@ -421,8 +421,9 @@ ExtentPlacementManager::BackgroundProcess::run_until_halt()
 
 seastar::future<>
 ExtentPlacementManager::BackgroundProcess::reserve_projected_usage(
-    std::size_t projected_usage)
+    projected_usage_t usage)
 {
+  auto projected_usage = usage.inline_usage + usage.ool_usage;
   ceph_assert(is_ready());
   ceph_assert(!blocking_io);
   // The pipeline configuration prevents another IO from entering
index baab118d0f677b90415fd50c7b44cbf0197a9322..412345d8dfa872328e45e0303b3920216e49e168 100644 (file)
@@ -328,12 +328,12 @@ public:
     return background_process.commit_space_used(addr, len);
   }
 
-  seastar::future<> reserve_projected_usage(std::size_t projected_usage) {
-    return background_process.reserve_projected_usage(projected_usage);
+  seastar::future<> reserve_projected_usage(projected_usage_t usage) {
+    return background_process.reserve_projected_usage(usage);
   }
 
-  void release_projected_usage(std::size_t projected_usage) {
-    return background_process.release_projected_usage(projected_usage);
+  void release_projected_usage(projected_usage_t usage) {
+    background_process.release_projected_usage(usage);
   }
 
   // Testing interfaces
@@ -460,11 +460,11 @@ private:
       return cleaner->commit_space_used(addr, len);
     }
 
-    seastar::future<> reserve_projected_usage(std::size_t projected_usage);
+    seastar::future<> reserve_projected_usage(projected_usage_t usage);
 
-    void release_projected_usage(std::size_t projected_usage) {
+    void release_projected_usage(projected_usage_t usage) {
       ceph_assert(is_ready());
-      return cleaner->release_projected_usage(projected_usage);
+      cleaner->release_projected_usage(usage.inline_usage + usage.ool_usage);
     }
 
     seastar::future<> stop_background();
index a9adc03e6456cbcbeaf8bfeda81256c70a5e7dcb..11f1f6749d349edd68855c7d6bb75fdc1e0823d5 100644 (file)
@@ -312,12 +312,6 @@ public:
     return fresh_block_stats;
   }
 
-  size_t get_allocation_size() const {
-    size_t ret = 0;
-    for_each_fresh_block([&ret](auto &e) { ret += e->get_length(); });
-    return ret;
-  }
-
   using src_t = transaction_type_t;
   src_t get_src() const {
     return src;
index a75d8d1896a20836c302de746a2e08ce80d4983c..891a7f669bd768e8e4f62b5da34c1aabcb56ae6f 100644 (file)
@@ -278,12 +278,13 @@ TransactionManager::submit_transaction(
   return trans_intr::make_interruptible(
     t.get_handle().enter(write_pipeline.reserve_projected_usage)
   ).then_interruptible([this, FNAME, &t] {
-    size_t projected_usage = t.get_allocation_size();
+    auto dispatch_result = epm->dispatch_delayed_extents(t);
+    auto projected_usage = dispatch_result.usage;
     SUBTRACET(seastore_t, "waiting for projected_usage: {}", t, projected_usage);
     return trans_intr::make_interruptible(
       epm->reserve_projected_usage(projected_usage)
-    ).then_interruptible([this, &t] {
-      return submit_transaction_direct(t);
+    ).then_interruptible([this, &t, dispatch_result = std::move(dispatch_result)] {
+      return do_submit_transaction(t, std::move(dispatch_result));
     }).finally([this, FNAME, projected_usage, &t] {
       SUBTRACET(seastore_t, "releasing projected_usage: {}", t, projected_usage);
       epm->release_projected_usage(projected_usage);
@@ -296,17 +297,30 @@ TransactionManager::submit_transaction_direct(
   Transaction &tref,
   std::optional<journal_seq_t> trim_alloc_to)
 {
-  LOG_PREFIX(TransactionManager::submit_transaction_direct);
+  return do_submit_transaction(
+    tref,
+    epm->dispatch_delayed_extents(tref),
+    trim_alloc_to);
+}
+
+TransactionManager::submit_transaction_direct_ret
+TransactionManager::do_submit_transaction(
+  Transaction &tref,
+  ExtentPlacementManager::dispatch_result_t dispatch_result,
+  std::optional<journal_seq_t> trim_alloc_to)
+{
+  LOG_PREFIX(TransactionManager::do_submit_transaction);
   SUBTRACET(seastore_t, "start", tref);
   return trans_intr::make_interruptible(
     tref.get_handle().enter(write_pipeline.ool_writes)
-  ).then_interruptible([this, FNAME, &tref] {
-    return seastar::do_with(tref.get_delayed_alloc_list(),
-                           [this, FNAME, &tref](auto &delayed_extents) {
-      return epm->delayed_allocate_and_write(tref, delayed_extents
-      ).si_then([this, FNAME, &tref, &delayed_extents] {
+  ).then_interruptible([this, FNAME, &tref,
+                       dispatch_result = std::move(dispatch_result)] {
+    return seastar::do_with(std::move(dispatch_result),
+                           [this, FNAME, &tref](auto &dispatch_result) {
+      return epm->write_delayed_ool_extents(tref, dispatch_result.alloc_map
+      ).si_then([this, FNAME, &tref, &dispatch_result] {
         SUBTRACET(seastore_t, "update delayed extent mappings", tref);
-        return lba_manager->update_mappings(tref, delayed_extents);
+        return lba_manager->update_mappings(tref, dispatch_result.delayed_extents);
       }).handle_error_interruptible(
         crimson::ct_error::input_output_error::pass_further(),
         crimson::ct_error::assert_all("invalid error")
index cc431ff37d6ce01534f43b3479ab5a3f01fc6d4a..2514d743011dcdbcdc5f245a746b30ac0aa00cf8 100644 (file)
@@ -637,6 +637,11 @@ private:
     Transaction& t,
     LogicalCachedExtentRef extent);
 
+  submit_transaction_direct_ret do_submit_transaction(
+    Transaction &t,
+    ExtentPlacementManager::dispatch_result_t dispatch_result,
+    std::optional<journal_seq_t> seq_to_trim = std::nullopt);
+
 public:
   // Testing interfaces
   auto get_epm() {