); ///< @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;
}
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;
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,
cache->dump_contents();
return journal->close();
}).safe_then([this] {
+ scanner.reset();
return epm->close();
}).safe_then([FNAME] {
INFO("completed");
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);
+}
+
}
};
using TransactionManagerRef = std::unique_ptr<TransactionManager>;
+TransactionManagerRef make_transaction_manager(
+ SegmentManager& sm,
+ bool detailed);
+
}
#include "tm_driver.h"
+#include "crimson/os/seastore/segment_manager/block.h"
+
using namespace crimson;
using namespace crimson::os;
using namespace crimson::os::seastore;
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()
#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"
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;
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] {
}
};
-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>(
"",
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();
}