]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: create random_block_device using make_device at startup time
authormyoungwon oh <ohmyoungwon@gmail.com>
Mon, 13 Feb 2023 01:17:58 +0000 (10:17 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Sat, 25 Feb 2023 03:08:20 +0000 (12:08 +0900)
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
src/common/options/crimson.yaml.in
src/crimson/os/seastore/CMakeLists.txt
src/crimson/os/seastore/device.cc
src/crimson/os/seastore/random_block_manager.cc [new file with mode: 0644]
src/crimson/os/seastore/random_block_manager.h
src/crimson/os/seastore/seastore.cc

index 1f3cfd1bce1f91b1dbf95503b703a177f9d2da44..a92084e39d94d9de7f06b10118e944e8c53d97f3 100644 (file)
@@ -92,3 +92,8 @@ options:
   level: advanced
   desc: maximum concurrent transactions that seastore allows
   default: 8
+- name: seastore_main_device_type
+  type: str
+  level: dev
+  desc: The main device type seastore uses (SSD or RANDOM_BLOCK_SSD)
+  default: SSD
index 464e44d970c8a894ff3e678429bed9e0725d1718..ad43b4c4e196d5fc0d0b8630c4c85d0650ce645e 100644 (file)
@@ -36,6 +36,7 @@ set(crimson_seastore_srcs
   extent_placement_manager.cc
   object_data_handler.cc
   seastore.cc
+  random_block_manager.cc
   random_block_manager/block_rb_manager.cc
   random_block_manager/nvme_block_device.cc
   random_block_manager/avlallocator.cc
index e28673dd06c694426bf85a893c9dfc0ab40b5867..fcc3a59aa29d4de36b2b44e452bc9287016eb042 100644 (file)
@@ -4,6 +4,8 @@
 #include "device.h"
 
 #include "segment_manager.h"
+#include "random_block_manager.h"
+#include "random_block_manager/rbm_device.h"
 
 namespace crimson::os::seastore {
 
@@ -33,9 +35,14 @@ std::ostream& operator<<(std::ostream& out, const device_config_t& conf)
 seastar::future<DeviceRef>
 Device::make_device(const std::string& device, device_type_t dtype)
 {
-  // TODO: support other backend types
-  assert(get_default_backend_of_device(dtype) == backend_type_t::SEGMENTED);
-  return SegmentManager::get_segment_manager(device
+  if (get_default_backend_of_device(dtype) == backend_type_t::SEGMENTED) {
+    return SegmentManager::get_segment_manager(device
+    ).then([](DeviceRef ret) {
+      return ret;
+    });
+  } 
+  assert(get_default_backend_of_device(dtype) == backend_type_t::RANDOM_BLOCK);
+  return get_rb_device(device
   ).then([](DeviceRef ret) {
     return ret;
   });
diff --git a/src/crimson/os/seastore/random_block_manager.cc b/src/crimson/os/seastore/random_block_manager.cc
new file mode 100644 (file)
index 0000000..749edc9
--- /dev/null
@@ -0,0 +1,21 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "crimson/os/seastore/logging.h"
+#include "crimson/os/seastore/random_block_manager.h"
+#include "crimson/os/seastore/random_block_manager/nvme_block_device.h"
+#include "crimson/os/seastore/random_block_manager/rbm_device.h"
+
+namespace crimson::os::seastore {
+
+seastar::future<random_block_device::RBMDeviceRef>
+get_rb_device(
+  const std::string &device)
+{
+  return seastar::make_ready_future<random_block_device::RBMDeviceRef>(
+    std::make_unique<
+      random_block_device::nvme::NVMeBlockDevice
+    >(device + "/block"));
+}
+
+}
index 88c32f658832b1bb2a6d45e5435caa345cac0fd4..f94ee6e235c194fc336bdd080e96646ae7c699a2 100644 (file)
@@ -117,6 +117,14 @@ inline rbm_abs_addr convert_paddr_to_abs_addr(const paddr_t& paddr) {
 inline paddr_t convert_abs_addr_to_paddr(rbm_abs_addr addr, device_id_t d_id) {
   return paddr_t::make_blk_paddr(d_id, addr);
 }
+
+namespace random_block_device {
+  class RBMDevice;
+}
+
+seastar::future<std::unique_ptr<random_block_device::RBMDevice>> 
+  get_rb_device(const std::string &device);
+
 std::ostream &operator<<(std::ostream &out, const rbm_metadata_header_t &header);
 }
 
index 04522f1e7ad779b93583072daefab52c14aa7749..218c0075fdeb38ebe599bf5cf64cdf4a19431ce8 100644 (file)
@@ -404,13 +404,21 @@ SeaStore::mkfs_ertr::future<> SeaStore::mkfs(uuid_d new_osd_fsid)
           });
         }
         return fut.then([this, &sds, new_osd_fsid] {
+         device_id_t id = 0;
+         device_type_t d_type = device->get_device_type();
+         assert(d_type == device_type_t::SSD ||
+                d_type == device_type_t::RANDOM_BLOCK_SSD);
+         if (d_type == device_type_t::RANDOM_BLOCK_SSD) {
+           id = static_cast<device_id_t>(DEVICE_ID_RANDOM_BLOCK_MIN);
+         } 
+
           return device->mkfs(
             device_config_t{
               true,
               device_spec_t{
                 (magic_t)std::rand(),
-                device_type_t::SSD,
-                0},
+               d_type,
+               id},
               seastore_meta_t{new_osd_fsid},
               sds}
           );
@@ -1898,8 +1906,14 @@ seastar::future<std::unique_ptr<SeaStore>> make_seastore(
   const std::string &device,
   const ConfigValues &config)
 {
+  using crimson::common::get_conf;
+  std::string type = get_conf<std::string>("seastore_main_device_type");
+  device_type_t d_type = string_to_device_type(type);
+  assert(d_type == device_type_t::SSD ||
+        d_type == device_type_t::RANDOM_BLOCK_SSD);
+
   return Device::make_device(
-    device, device_type_t::SSD
+    device, d_type
   ).then([&device](DeviceRef device_obj) {
 #ifndef NDEBUG
     bool is_test = true;