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
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
#include "device.h"
#include "segment_manager.h"
+#include "random_block_manager.h"
+#include "random_block_manager/rbm_device.h"
namespace crimson::os::seastore {
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;
});
--- /dev/null
+// -*- 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"));
+}
+
+}
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);
}
});
}
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}
);
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;