class ExtentPlacementManager {
public:
- ExtentPlacementManager(bool prefer_ool)
- : prefer_ool{prefer_ool} {
+ ExtentPlacementManager() {
devices_by_id.resize(DEVICE_ID_MAX, nullptr);
}
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;
+ }
}
}
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] {
std::vector<Device*> devices_by_id;
Device* primary_device = nullptr;
+ std::size_t num_devices = 0;
};
using ExtentPlacementManagerRef = std::unique_ptr<ExtentPlacementManager>;
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>();
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() {
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() {
SUBWARN(seastore_tm, "test mode enabled!");
return tm_make_config_t {
true,
- journal_type_t::CIRCULARBOUNDED_JOURNAL,
- true
+ journal_type_t::CIRCULARBOUNDED_JOURNAL
};
}
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)
{}
};
}).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();
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;
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);
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);