]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: use extent placement manager to rewrite extents
authorXuehan Xu <xxhdx1985126@gmail.com>
Sun, 25 Jul 2021 12:25:48 +0000 (20:25 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Wed, 8 Sep 2021 03:03:00 +0000 (11:03 +0800)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cached_extent.h
src/crimson/os/seastore/seastore.cc
src/crimson/os/seastore/transaction_manager.cc
src/crimson/os/seastore/transaction_manager.h
src/test/crimson/seastore/transaction_manager_test_state.h

index 51e50de086a791ac68d6c2755d0a6b53e0e3a6ec..18905214a4cc5dbb0df227a9a02e5cc8c63cbe53 100644 (file)
@@ -880,6 +880,9 @@ record_t Cache::prepare_record(Transaction &t)
   record.extents.reserve(t.fresh_block_list.size());
   for (auto &i: t.fresh_block_list) {
     DEBUGT("fresh block {}", t, *i);
+    if (!i->is_inline()) {
+      continue;
+    }
     get_by_ext(efforts.fresh_by_ext,
                i->get_type()).increment(i->get_length());
     bufferlist bl;
@@ -912,7 +915,9 @@ void Cache::complete_commit(
   DEBUGT("enter", t);
 
   for (auto &i: t.fresh_block_list) {
-    i->set_paddr(final_block_start.add_relative(i->get_paddr()));
+    if (i->is_inline()) {
+      i->set_paddr(final_block_start.add_relative(i->get_paddr()));
+    }
     i->last_committed_crc = i->get_crc32c();
     i->on_initial_write();
 
index d97e28f73124171c0c52c83e754201c5c92433e3..1f1730b2b4cff371ffe15d04febec799887e48a5 100644 (file)
@@ -329,7 +329,7 @@ public:
   /// hint for allocators
   ool_placement_hint_t hint;
 
-  bool is_relative() const {
+  bool is_inline() const {
     return poffset.is_relative();
   }
 private:
index 2aa4e6c3156c495ec8b094bdb137ce813a01d2ee..0e6772bff7108f17658364f642910f4c23413ce0 100644 (file)
@@ -1184,6 +1184,17 @@ std::unique_ptr<SeaStore> make_seastore(
   auto cache = std::make_unique<Cache>(*sm);
   auto lba_manager = lba_manager::create_lba_manager(*sm, *cache);
 
+  auto epm = std::make_unique<ExtentPlacementManager>(*cache, *lba_manager);
+
+  epm->add_allocator(
+    device_type_t::SEGMENTED,
+    std::make_unique<SegmentedAllocator>(
+      *segment_cleaner,
+      *sm,
+      *lba_manager,
+      *journal,
+      *cache));
+
   journal->set_segment_provider(&*segment_cleaner);
 
   auto tm = std::make_unique<TransactionManager>(
@@ -1191,7 +1202,8 @@ std::unique_ptr<SeaStore> make_seastore(
     std::move(segment_cleaner),
     std::move(journal),
     std::move(cache),
-    std::move(lba_manager));
+    std::move(lba_manager),
+    std::move(epm));
 
   auto cm = std::make_unique<collection_manager::FlatCollectionManager>(*tm);
   return std::make_unique<SeaStore>(
index 52c9ffb3e32610dd2150f0d2f16fff1b92fac258..56ce3533bc60cea84186311b3a5666f87d60c345 100644 (file)
@@ -16,12 +16,14 @@ TransactionManager::TransactionManager(
   SegmentCleanerRef _segment_cleaner,
   JournalRef _journal,
   CacheRef _cache,
-  LBAManagerRef _lba_manager)
+  LBAManagerRef _lba_manager,
+  ExtentPlacementManagerRef&& epm)
   : segment_manager(_segment_manager),
     segment_cleaner(std::move(_segment_cleaner)),
     cache(std::move(_cache)),
     lba_manager(std::move(_lba_manager)),
-    journal(std::move(_journal))
+    journal(std::move(_journal)),
+    epm(std::move(epm))
 {
   segment_cleaner->set_extent_callback(this);
   journal->set_write_pipeline(&write_pipeline);
@@ -232,10 +234,15 @@ TransactionManager::submit_transaction_direct(
 {
   LOG_PREFIX(TransactionManager::submit_transaction_direct);
   DEBUGT("about to prepare", tref);
-  return trans_intr::make_interruptible(
-    tref.get_handle().enter(write_pipeline.prepare)
-  ).then_interruptible([this, FNAME, &tref]() mutable
-                      -> submit_transaction_iertr::future<> {
+
+  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] {
+    return tref.get_handle().enter(write_pipeline.prepare);
+  }).si_then([this, FNAME, &tref]() mutable
+             -> submit_transaction_iertr::future<> {
     auto record = cache->prepare_record(tref);
 
     tref.get_handle().maybe_release_collection_lock();
@@ -295,7 +302,7 @@ TransactionManager::rewrite_logical_extent(
 
   auto lextent = extent->cast<LogicalCachedExtent>();
   cache->retire_extent(t, extent);
-  auto nlextent = cache->alloc_new_extent_by_type(
+  auto nlextent = epm->alloc_new_extent_by_type(
     t,
     lextent->get_type(),
     lextent->get_length())->cast<LogicalCachedExtent>();
@@ -312,6 +319,11 @@ TransactionManager::rewrite_logical_extent(
     *lextent,
     *nlextent);
 
+  if (need_delayed_allocation(extent->backend_type)) {
+    // hold old poffset for later mapping updating assert check
+    nlextent->set_paddr(lextent->get_paddr());
+    return rewrite_extent_iertr::now();
+  }
   return lba_manager->update_mapping(
     t,
     lextent->get_laddr(),
index 9a692109c5fc8f7bb16ded990c1072888c91bf40..695484d45f9a1dab2fc5594d8f10b6edcb5c6fb7 100644 (file)
@@ -27,6 +27,7 @@
 #include "crimson/os/seastore/segment_manager.h"
 #include "crimson/os/seastore/lba_manager.h"
 #include "crimson/os/seastore/journal.h"
+#include "crimson/os/seastore/extent_placement_manager.h"
 
 namespace crimson::os::seastore {
 class Journal;
@@ -69,7 +70,8 @@ public:
     SegmentCleanerRef segment_cleaner,
     JournalRef journal,
     CacheRef cache,
-    LBAManagerRef lba_manager);
+    LBAManagerRef lba_manager,
+    ExtentPlacementManagerRef&& epm);
 
   /// Writes initial metadata to disk
   using mkfs_ertr = base_ertr;
@@ -497,6 +499,7 @@ private:
   CacheRef cache;
   LBAManagerRef lba_manager;
   JournalRef journal;
+  ExtentPlacementManagerRef epm;
 
   WritePipeline write_pipeline;
 
index 4d9eab791820c308c98aef66ce3f422fd6bb7de4..04c7a11c87e55c589ee4417ec1d995f9cde2d410 100644 (file)
@@ -80,6 +80,17 @@ auto get_transaction_manager(
   auto cache = std::make_unique<Cache>(segment_manager);
   auto lba_manager = lba_manager::create_lba_manager(segment_manager, *cache);
 
+  auto epm = std::make_unique<ExtentPlacementManager>(*cache, *lba_manager);
+
+  epm->add_allocator(
+    device_type_t::SEGMENTED,
+    std::make_unique<SegmentedAllocator>(
+      *segment_cleaner,
+      segment_manager,
+      *lba_manager,
+      *journal,
+      *cache));
+
   journal->set_segment_provider(&*segment_cleaner);
 
   return std::make_unique<TransactionManager>(
@@ -87,7 +98,8 @@ auto get_transaction_manager(
     std::move(segment_cleaner),
     std::move(journal),
     std::move(cache),
-    std::move(lba_manager));
+    std::move(lba_manager),
+    std::move(epm));
 }
 
 auto get_seastore(SegmentManagerRef sm) {