]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
test/crimson/seastore: fix metrics registration conflicts 45386/head
authorYingxin Cheng <yingxin.cheng@intel.com>
Fri, 18 Mar 2022 01:41:04 +0000 (09:41 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Fri, 18 Mar 2022 06:13:46 +0000 (14:13 +0800)
The conflicts are from adding segment manager to transaction manager
repeatedly. Fixed the repeat adding issue, add ceph_assert() to detect
this issue as early as possible, and consolidate initiation code into
make_transaction_manager().

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/extent_reader.h
src/crimson/os/seastore/seastore.cc
src/crimson/os/seastore/transaction_manager.cc
src/crimson/os/seastore/transaction_manager.h
src/crimson/tools/store_nbd/tm_driver.cc
src/crimson/tools/store_nbd/tm_driver.h
src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc
src/test/crimson/seastore/transaction_manager_test_state.h

index ffd1ad4f42cdaa8ef5a10b7bf77eeddb939279d5..1016f50f238461573047cd779a4990a80fdfc00f 100644 (file)
@@ -81,8 +81,7 @@ public:
   ); ///< @return used budget
 
   void add_segment_manager(SegmentManager* segment_manager) {
-    assert(!segment_managers[segment_manager->get_device_id()] ||
-      segment_manager == segment_managers[segment_manager->get_device_id()]);
+    ceph_assert(!segment_managers[segment_manager->get_device_id()]);
     segment_managers[segment_manager->get_device_id()] = segment_manager;
   }
 
@@ -94,6 +93,11 @@ public:
     return segment_managers[addr.get_device_id()]->read(addr, len, out);
   }
 
+  void reset() {
+    segment_managers.clear();
+    segment_managers.resize(DEVICE_ID_MAX, nullptr);
+  }
+
 private:
   std::vector<SegmentManager*> segment_managers;
 
index 707bd425601682459c33cd43034db6a7c4bcd814..2ac23ccc138199f8fcb28517ce1d8315769eb648 100644 (file)
@@ -1625,27 +1625,7 @@ seastar::future<std::unique_ptr<SeaStore>> make_seastore(
   return SegmentManager::get_segment_manager(
     device
   ).then([&device](auto sm) {
-    auto scanner = std::make_unique<ExtentReader>();
-    auto& scanner_ref = *scanner.get();
-    auto segment_cleaner = std::make_unique<SegmentCleaner>(
-      SegmentCleaner::config_t::get_default(),
-      std::move(scanner),
-      false /* detailed */);
-
-    auto journal = journal::make_segmented(*sm, scanner_ref, *segment_cleaner);
-    auto epm = std::make_unique<ExtentPlacementManager>();
-    auto cache = std::make_unique<Cache>(scanner_ref, *epm);
-    auto lba_manager = lba_manager::create_lba_manager(*sm, *cache);
-
-    auto tm = std::make_unique<TransactionManager>(
-      *sm,
-      std::move(segment_cleaner),
-      std::move(journal),
-      std::move(cache),
-      std::move(lba_manager),
-      std::move(epm),
-      scanner_ref);
-
+    auto tm = make_transaction_manager(*sm, false /* detailed */);
     auto cm = std::make_unique<collection_manager::FlatCollectionManager>(*tm);
     return std::make_unique<SeaStore>(
       device,
index 266a064857e861d53aa91ba3174138943e8972a7..7021293d204bd4560a819020f6a369d414e7593a 100644 (file)
@@ -161,6 +161,7 @@ TransactionManager::close_ertr::future<> TransactionManager::close() {
     cache->dump_contents();
     return journal->close();
   }).safe_then([this] {
+    scanner.reset();
     return epm->close();
   }).safe_then([FNAME] {
     INFO("completed");
@@ -554,4 +555,29 @@ TransactionManager::get_extent_if_live_ret TransactionManager::get_extent_if_liv
 
 TransactionManager::~TransactionManager() {}
 
+TransactionManagerRef make_transaction_manager(
+    SegmentManager& sm,
+    bool detailed)
+{
+  auto scanner = std::make_unique<ExtentReader>();
+  auto& scanner_ref = *scanner.get();
+  auto segment_cleaner = std::make_unique<SegmentCleaner>(
+    SegmentCleaner::config_t::get_default(),
+    std::move(scanner),
+    detailed);
+  auto journal = journal::make_segmented(sm, scanner_ref, *segment_cleaner);
+  auto epm = std::make_unique<ExtentPlacementManager>();
+  auto cache = std::make_unique<Cache>(scanner_ref, *epm);
+  auto lba_manager = lba_manager::create_lba_manager(sm, *cache);
+
+  return std::make_unique<TransactionManager>(
+    sm,
+    std::move(segment_cleaner),
+    std::move(journal),
+    std::move(cache),
+    std::move(lba_manager),
+    std::move(epm),
+    scanner_ref);
+}
+
 }
index b9192214af96282c7a5b96d58331c0f565f57054..f1a5745322ad6fe27a6bbe4aa3ef09ee5c647fda 100644 (file)
@@ -585,4 +585,8 @@ public:
 };
 using TransactionManagerRef = std::unique_ptr<TransactionManager>;
 
+TransactionManagerRef make_transaction_manager(
+    SegmentManager& sm,
+    bool detailed);
+
 }
index a87846e44672e0388631074242f6ab6fba526b4a..851228e2ad42939d1e9684e8e80d738856c16ec3 100644 (file)
@@ -3,6 +3,8 @@
 
 #include "tm_driver.h"
 
+#include "crimson/os/seastore/segment_manager/block.h"
+
 using namespace crimson;
 using namespace crimson::os;
 using namespace crimson::os::seastore;
@@ -132,33 +134,8 @@ seastar::future<bufferlist> TMDriver::read(
 
 void TMDriver::init()
 {
-  auto scanner = std::make_unique<ExtentReader>();
-  scanner->add_segment_manager(segment_manager.get());
-  auto& scanner_ref = *scanner.get();
-  auto segment_cleaner = std::make_unique<SegmentCleaner>(
-    SegmentCleaner::config_t::get_default(),
-    std::move(scanner),
-    false /* detailed */);
-  auto journal = journal::make_segmented(
-    *segment_manager, *scanner, *segment_cleaner);
-  auto epm = std::make_unique<ExtentPlacementManager>();
-  auto cache = std::make_unique<Cache>(scanner_ref, *epm);
-  auto lba_manager = lba_manager::create_lba_manager(*segment_manager, *cache);
-
-  epm->add_allocator(
-    device_type_t::SEGMENTED,
-    std::make_unique<SegmentedAllocator>(
-      *segment_cleaner,
-      *segment_manager));
-
-  tm = std::make_unique<TransactionManager>(
-    *segment_manager,
-    std::move(segment_cleaner),
-    std::move(journal),
-    std::move(cache),
-    std::move(lba_manager),
-    std::move(epm),
-    scanner_ref);
+  tm = make_transaction_manager(*segment_manager, false /* detailed */);
+  tm->add_segment_manager(segment_manager.get());
 }
 
 void TMDriver::clear()
index c0e1fc480468c4339c2629ec6b76f8130be254ec..f6d7c9b8d5cbda92f5133cbe7e1d52e0738b32e0 100644 (file)
@@ -6,7 +6,6 @@
 #include "crimson/os/seastore/cache.h"
 #include "crimson/os/seastore/segment_cleaner.h"
 #include "crimson/os/seastore/segment_manager.h"
-#include "crimson/os/seastore/segment_manager/block.h"
 #include "crimson/os/seastore/transaction_manager.h"
 #include "test/crimson/seastore/test_block.h"
 
@@ -36,8 +35,8 @@ public:
 private:
   const config_t config;
 
-  using BlockSegmentManager = crimson::os::seastore::segment_manager::block::BlockSegmentManager;
-  std::unique_ptr<BlockSegmentManager> segment_manager;
+  using SegmentManagerRef = crimson::os::seastore::SegmentManagerRef;
+  SegmentManagerRef segment_manager;
 
   using TransactionManager = crimson::os::seastore::TransactionManager;
   using TransactionManagerRef = crimson::os::seastore::TransactionManagerRef;
index 047e695a4100ab3ae87387a9d033d4ae19201b77..77578f3625f88c088aa2d720ef7c3c3875ef84aa 100644 (file)
@@ -84,6 +84,7 @@ struct fltree_onode_manager_test_t
   virtual FuturizedStore::mkfs_ertr::future<> _mkfs() final {
     return TMTestState::_mkfs(
     ).safe_then([this] {
+      tm->add_segment_manager(segment_manager.get());
       return tm->mount(
       ).safe_then([this] {
        return repeat_eagain([this] {
index 9f7d3aebb177795d88d21faf01bf0892db65543b..7c0d3df0878d4eaf0f0feb6072dd220ff453e02a 100644 (file)
@@ -70,41 +70,8 @@ protected:
   }
 };
 
-auto get_transaction_manager(
-  SegmentManager &segment_manager) {
-  auto scanner = std::make_unique<ExtentReader>();
-  scanner->add_segment_manager(&segment_manager);
-  auto& scanner_ref = *scanner.get();
-  auto segment_cleaner = std::make_unique<SegmentCleaner>(
-    SegmentCleaner::config_t::get_default(),
-    std::move(scanner),
-    true);
-  auto journal = journal::make_segmented(
-    segment_manager,
-    scanner_ref,
-    *segment_cleaner);
-  auto epm = std::make_unique<ExtentPlacementManager>();
-  auto cache = std::make_unique<Cache>(scanner_ref, *epm);
-  auto lba_manager = lba_manager::create_lba_manager(segment_manager, *cache);
-
-  epm->add_allocator(
-    device_type_t::SEGMENTED,
-    std::make_unique<SegmentedAllocator>(
-      *segment_cleaner,
-      segment_manager));
-
-  return std::make_unique<TransactionManager>(
-    segment_manager,
-    std::move(segment_cleaner),
-    std::move(journal),
-    std::move(cache),
-    std::move(lba_manager),
-    std::move(epm),
-    scanner_ref);
-}
-
 auto get_seastore(SeaStore::MDStoreRef mdstore, SegmentManagerRef sm) {
-  auto tm = get_transaction_manager(*sm);
+  auto tm = make_transaction_manager(*sm, true);
   auto cm = std::make_unique<collection_manager::FlatCollectionManager>(*tm);
   return std::make_unique<SeaStore>(
     "",
@@ -125,7 +92,8 @@ protected:
   TMTestState() : EphemeralTestState() {}
 
   virtual void _init() override {
-    tm = get_transaction_manager(*segment_manager);
+    tm = make_transaction_manager(*segment_manager, true);
+    tm->add_segment_manager(segment_manager.get());
     segment_cleaner = tm->get_segment_cleaner();
     lba_manager = tm->get_lba_manager();
   }