]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/epm: configure prefer_ool through the primary_device
authorYingxin Cheng <yingxin.cheng@intel.com>
Sun, 7 Aug 2022 08:00:23 +0000 (16:00 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Thu, 11 Aug 2022 01:16:57 +0000 (09:16 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/extent_placement_manager.h
src/crimson/os/seastore/transaction_manager.cc
src/crimson/os/seastore/transaction_manager.h
src/test/crimson/seastore/test_btree_lba_manager.cc
src/test/crimson/seastore/test_cbjournal.cc
src/test/crimson/seastore/test_seastore_cache.cc

index 6a957a20464165ccec0cc4e0fa6241929ae44180..4f3dae14a672d3f4f40948f6c3ccec92750f1486 100644 (file)
@@ -86,8 +86,7 @@ private:
 
 class ExtentPlacementManager {
 public:
-  ExtentPlacementManager(bool prefer_ool)
-    : prefer_ool{prefer_ool} {
+  ExtentPlacementManager() {
     devices_by_id.resize(DEVICE_ID_MAX, nullptr);
   }
 
@@ -115,9 +114,16 @@ public:
     auto device_id = device->get_device_id();
     ceph_assert(devices_by_id[device_id] == nullptr);
     devices_by_id[device_id] = device;
+    ++num_devices;
     if (is_primary) {
       ceph_assert(primary_device == nullptr);
       primary_device = device;
+      if (device->get_device_type() == device_type_t::SEGMENTED) {
+        prefer_ool = false;
+      } else {
+        ceph_assert(device->get_device_type() == device_type_t::RANDOM_BLOCK);
+        prefer_ool = true;
+      }
     }
   }
 
@@ -135,7 +141,8 @@ public:
   using open_ertr = ExtentOolWriter::open_ertr;
   open_ertr::future<> open() {
     LOG_PREFIX(ExtentPlacementManager::open);
-    SUBINFO(seastore_journal, "started");
+    SUBINFO(seastore_journal, "started with {} devices", num_devices);
+    ceph_assert(primary_device != nullptr);
     return crimson::do_for_each(data_writers_by_gen, [](auto &writer) {
       return writer->open();
     }).safe_then([this] {
@@ -284,6 +291,7 @@ private:
 
   std::vector<Device*> devices_by_id;
   Device* primary_device = nullptr;
+  std::size_t num_devices = 0;
 };
 using ExtentPlacementManagerRef = std::unique_ptr<ExtentPlacementManager>;
 
index 12a495cb85e662e4db8cedcec65accabf3a6878f..31223dffa020e3d4ef82c9199247ee0ba0223e13 100644 (file)
@@ -624,7 +624,7 @@ TransactionManager::~TransactionManager() {}
 TransactionManagerRef make_transaction_manager(tm_make_config_t config)
 {
   LOG_PREFIX(make_transaction_manager);
-  auto epm = std::make_unique<ExtentPlacementManager>(config.epm_prefer_ool);
+  auto epm = std::make_unique<ExtentPlacementManager>();
   auto cache = std::make_unique<Cache>(*epm);
   auto lba_manager = lba_manager::create_lba_manager(*cache);
   auto sms = std::make_unique<SegmentManagerGroup>();
index 28cf66880c6a6e4312c6a2d06ec5f5705d81291f..b3dec1d6a27dfa73d28a533a5dffa0c50bb5b1cc 100644 (file)
@@ -37,14 +37,11 @@ class Journal;
 struct tm_make_config_t {
   bool is_test;
   journal_type_t j_type;
-  bool epm_prefer_ool;
-  reclaim_gen_t default_generation;
 
   static tm_make_config_t get_default() {
     return tm_make_config_t {
       false,
-      journal_type_t::SEGMENT_JOURNAL,
-      false
+      journal_type_t::SEGMENT_JOURNAL
     };
   }
   static tm_make_config_t get_test_segmented_journal() {
@@ -52,8 +49,7 @@ struct tm_make_config_t {
     SUBWARN(seastore_tm, "test mode enabled!");
     return tm_make_config_t {
       true,
-      journal_type_t::SEGMENT_JOURNAL,
-      false
+      journal_type_t::SEGMENT_JOURNAL
     };
   }
   static tm_make_config_t get_test_cb_journal() {
@@ -61,8 +57,7 @@ struct tm_make_config_t {
     SUBWARN(seastore_tm, "test mode enabled!");
     return tm_make_config_t {
       true,
-      journal_type_t::CIRCULARBOUNDED_JOURNAL,
-      true
+      journal_type_t::CIRCULARBOUNDED_JOURNAL
     };
   }
 
@@ -71,10 +66,8 @@ struct tm_make_config_t {
 private:
   tm_make_config_t(
     bool is_test,
-    journal_type_t j_type,
-    bool epm_prefer_ool)
-    : is_test(is_test), j_type(j_type),
-      epm_prefer_ool(epm_prefer_ool)
+    journal_type_t j_type)
+    : is_test(is_test), j_type(j_type)
   {}
 };
 
index 113e0308401e0f42215e3f404e22cfb7e4e1a082..441f0d1135356093aa58c289679b766bcbf21927 100644 (file)
@@ -115,7 +115,7 @@ struct btree_test_base :
     }).safe_then([this] {
       sms.reset(new SegmentManagerGroup());
       journal = journal::make_segmented(*this);
-      epm.reset(new ExtentPlacementManager(false));
+      epm.reset(new ExtentPlacementManager());
       cache.reset(new Cache(*epm));
 
       block_size = segment_manager->get_block_size();
index beba8dd0ef1326afded52ac841363a82257bad1c..d7ed72eae32732edade3f97521930148eaa92729 100644 (file)
@@ -121,9 +121,6 @@ struct entry_validator_t {
 
 struct cbjournal_test_t : public seastar_test_suite_t
 {
-  segment_manager::EphemeralSegmentManagerRef segment_manager; // Need to be deleted, just for Cache
-  ExtentPlacementManagerRef epm;
-  Cache cache;
   std::vector<entry_validator_t> entries;
   std::unique_ptr<CircularBoundedJournal> cbj;
   random_block_device::RBMDevice *device;
@@ -133,11 +130,7 @@ struct cbjournal_test_t : public seastar_test_suite_t
   CircularBoundedJournal::mkfs_config_t config;
   WritePipeline pipeline;
 
-  cbjournal_test_t() :
-      segment_manager(segment_manager::create_test_ephemeral()),
-      epm(new ExtentPlacementManager(true)),
-      cache(*epm)
-  {
+  cbjournal_test_t() {
     device = new random_block_device::TestMemory(CBTEST_DEFAULT_TEST_SIZE + CBTEST_DEFAULT_BLOCK_SIZE);
     cbj.reset(new CircularBoundedJournal(device, std::string()));
     device_id_t d_id = 1 << (std::numeric_limits<device_id_t>::digits - 1);
index 06c1ae86192fa2d53702ba9bf070b067bdd78bdf..b9af8b2ccd91c06254bd46b0aa33a24553328648 100644 (file)
@@ -88,7 +88,7 @@ struct cache_test_t : public seastar_test_suite_t {
       return segment_manager->mkfs(
         segment_manager::get_ephemeral_device_config(0, 1));
     }).safe_then([this] {
-      epm.reset(new ExtentPlacementManager(false));
+      epm.reset(new ExtentPlacementManager());
       cache.reset(new Cache(*epm));
       current = paddr_t::make_seg_paddr(segment_id_t(segment_manager->get_device_id(), 0), 0);
       epm->add_device(segment_manager.get(), true);