]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/transaction_manager: limit callers to reserve_projected_usage 43340/head
authorSamuel Just <sjust@redhat.com>
Wed, 29 Sep 2021 01:46:25 +0000 (18:46 -0700)
committerSamuel Just <sjust@redhat.com>
Wed, 29 Sep 2021 07:09:12 +0000 (00:09 -0700)
Adds an exclusive stage for obtaining projected usage as well as an
unordered one for submitting ool writes.  This should allow for a
straightforward wait-list when io is blocked while still allowing
concurrent submission of ool writes otherwise.

Fixes: https://tracker.ceph.com/issues/52698
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/ordering_handle.h
src/crimson/os/seastore/transaction_manager.cc

index 6e519114ca6de42b2d9e49b8294c0890ba2db672..6bcfcfb7454c611e6694915a38344c9c6b48f7e8 100644 (file)
@@ -82,6 +82,12 @@ inline OrderingHandle get_dummy_ordering_handle() {
 }
 
 struct WritePipeline {
+  OrderedExclusivePhase reserve_projected_usage{
+    "WritePipeline::reserve_projected_usage"
+  };
+  UnorderedStage ool_writes{
+    "UnorderedStage::ool_writes_stage"
+  };
   OrderedExclusivePhase prepare{
     "WritePipeline::prepare_phase"
   };
index 05df59ae0e1eadde39a3492caf28febbba00e24b..d202b934463b586e5303e7c758ef8a4e887ecacc 100644 (file)
@@ -224,15 +224,19 @@ TransactionManager::submit_transaction(
   Transaction &t)
 {
   LOG_PREFIX(TransactionManager::submit_transaction);
-  size_t projected_usage = t.get_allocation_size();
-  DEBUGT("waiting for projected_usage: {}", t, projected_usage);
   return trans_intr::make_interruptible(
-    segment_cleaner->reserve_projected_usage(projected_usage)
-  ).then_interruptible([this, &t] {
-    return submit_transaction_direct(t);
-  }).finally([this, FNAME, projected_usage, &t] {
-    DEBUGT("releasing projected_usage: {}", t, projected_usage);
-    segment_cleaner->release_projected_usage(projected_usage);
+    t.get_handle().enter(write_pipeline.reserve_projected_usage)
+  ).then_interruptible([this, FNAME, &t] {
+    size_t projected_usage = t.get_allocation_size();
+    DEBUGT("waiting for projected_usage: {}", t, projected_usage);
+    return trans_intr::make_interruptible(
+      segment_cleaner->reserve_projected_usage(projected_usage)
+    ).then_interruptible([this, &t] {
+      return submit_transaction_direct(t);
+    }).finally([this, FNAME, projected_usage, &t] {
+      DEBUGT("releasing projected_usage: {}", t, projected_usage);
+      segment_cleaner->release_projected_usage(projected_usage);
+    });
   });
 }
 
@@ -243,12 +247,15 @@ TransactionManager::submit_transaction_direct(
   LOG_PREFIX(TransactionManager::submit_transaction_direct);
   DEBUGT("about to alloc delayed extents", tref);
 
-  return epm->delayed_alloc_or_ool_write(tref)
-  .handle_error_interruptible(
-    crimson::ct_error::input_output_error::pass_further(),
-    crimson::ct_error::assert_all("invalid error")
-  ).si_then([&tref, this] {
-    LOG_PREFIX(TransactionManager::submit_transaction_direct);
+  return trans_intr::make_interruptible(
+    tref.get_handle().enter(write_pipeline.ool_writes)
+  ).then_interruptible([this, &tref] {
+    return epm->delayed_alloc_or_ool_write(tref
+    ).handle_error_interruptible(
+      crimson::ct_error::input_output_error::pass_further(),
+      crimson::ct_error::assert_all("invalid error")
+    );
+  }).si_then([this, FNAME, &tref] {
     DEBUGT("about to prepare", tref);
     return tref.get_handle().enter(write_pipeline.prepare);
   }).si_then([this, FNAME, &tref]() mutable