namespace crimson::os::seastore::onode {
-NodeExtentManagerURef NodeExtentManager::create_dummy() {
- return NodeExtentManagerURef(new DummyNodeExtentManager());
+NodeExtentManagerURef NodeExtentManager::create_dummy(bool is_sync) {
+ if (is_sync) {
+ return NodeExtentManagerURef(new DummyNodeExtentManager<true>());
+ } else {
+ return NodeExtentManagerURef(new DummyNodeExtentManager<false>());
+ }
}
NodeExtentManagerURef NodeExtentManager::create_seastore(
virtual tm_future<NodeExtentRef> alloc_extent(Transaction&, extent_len_t) = 0;
virtual tm_future<Super::URef> get_super(Transaction&, RootNodeTracker&) = 0;
- static NodeExtentManagerURef create_dummy();
+ static NodeExtentManagerURef create_dummy(bool is_sync);
static NodeExtentManagerURef create_seastore(
TransactionManager& tm, laddr_t min_laddr = L_ADDR_MIN);
};
#pragma once
+#include <chrono>
+#include <seastar/core/sleep.hh>
+
#include "include/buffer_raw.h"
#include "crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h"
assert(false && "impossible path"); }
};
+template <bool SYNC>
class DummyNodeExtentManager final: public NodeExtentManager {
static constexpr size_t ALIGNMENT = 4096;
public:
~DummyNodeExtentManager() override = default;
protected:
- bool is_read_isolated() const { return false; }
+ bool is_read_isolated() const override { return false; }
tm_future<NodeExtentRef> read_extent(
+ Transaction& t, laddr_t addr, extent_len_t len) override {
+ if constexpr (SYNC) {
+ return read_extent_sync(t, addr, len);
+ } else {
+ using namespace std::chrono_literals;
+ return seastar::sleep(1us).then([this, &t, addr, len] {
+ return read_extent_sync(t, addr, len);
+ });
+ }
+ }
+
+ tm_future<NodeExtentRef> alloc_extent(
+ Transaction& t, extent_len_t len) override {
+ if constexpr (SYNC) {
+ return alloc_extent_sync(t, len);
+ } else {
+ using namespace std::chrono_literals;
+ return seastar::sleep(1us).then([this, &t, len] {
+ return alloc_extent_sync(t, len);
+ });
+ }
+ }
+
+ tm_future<Super::URef> get_super(
+ Transaction& t, RootNodeTracker& tracker) override {
+ if constexpr (SYNC) {
+ return get_super_sync(t, tracker);
+ } else {
+ using namespace std::chrono_literals;
+ return seastar::sleep(1us).then([this, &t, &tracker] {
+ return get_super_sync(t, tracker);
+ });
+ }
+ }
+
+ private:
+ tm_future<NodeExtentRef> read_extent_sync(
Transaction& t, laddr_t addr, extent_len_t len) {
auto iter = allocate_map.find(addr);
assert(iter != allocate_map.end());
return tm_ertr::make_ready_future<NodeExtentRef>(iter->second);
}
- tm_future<NodeExtentRef> alloc_extent(
+ tm_future<NodeExtentRef> alloc_extent_sync(
Transaction& t, extent_len_t len) {
assert(len % ALIGNMENT == 0);
auto r = ceph::buffer::create_aligned(len, ALIGNMENT);
return tm_ertr::make_ready_future<NodeExtentRef>(extent);
}
- tm_future<Super::URef> get_super(Transaction& t, RootNodeTracker& tracker) {
+ tm_future<Super::URef> get_super_sync(
+ Transaction& t, RootNodeTracker& tracker) {
return tm_ertr::make_ready_future<Super::URef>(
Super::URef(new DummySuper(t, tracker, &root_laddr)));
}
~SeastoreNodeExtentManager() override = default;
TransactionManager& get_tm() { return tm; }
protected:
- bool is_read_isolated() const { return true; }
+ bool is_read_isolated() const override { return true; }
tm_future<NodeExtentRef> read_extent(
- Transaction& t, laddr_t addr, extent_len_t len) {
+ Transaction& t, laddr_t addr, extent_len_t len) override {
return tm.read_extents<SeastoreNodeExtent>(t, addr, len
).safe_then([](auto&& extents) {
assert(extents.size() == 1);
}
tm_future<NodeExtentRef> alloc_extent(
- Transaction& t, extent_len_t len) {
+ Transaction& t, extent_len_t len) override {
return tm.alloc_extent<SeastoreNodeExtent>(t, addr_min, len
).safe_then([](auto extent) {
return NodeExtentRef(extent);
});
}
- tm_future<Super::URef> get_super(Transaction& t, RootNodeTracker& tracker) {
+ tm_future<Super::URef> get_super(
+ Transaction& t, RootNodeTracker& tracker) override {
return tm.read_onode_root(t).safe_then([this, &t, &tracker](auto root_addr) {
return Super::URef(new SeastoreSuper(t, tracker, root_addr, tm));
});
TEST_F(a_basic_test_t, 2_node_sizes)
{
run_async([this] {
- auto nm = NodeExtentManager::create_dummy();
+ auto nm = NodeExtentManager::create_dummy(false);
auto t = make_transaction();
context_t c{*nm, *t};
std::array<std::pair<NodeImplURef, NodeExtentMutable>, 16> nodes = {
Btree tree;
b_dummy_tree_test_t()
- : moved_nm{NodeExtentManager::create_dummy()},
+ : moved_nm{NodeExtentManager::create_dummy(false)},
ref_t{make_transaction()},
t{*ref_t},
c{*moved_nm, t},
public:
TestTree()
- : moved_nm{NodeExtentManager::create_dummy()},
+ : moved_nm{NodeExtentManager::create_dummy(false)},
ref_t{make_transaction()},
t{*ref_t},
c{*moved_nm, t},
seastar::future<> split(const ghobject_t& key, const onode_t& value) {
return seastar::async([this, key, &value] {
- Btree tree_clone(NodeExtentManager::create_dummy());
+ Btree tree_clone(NodeExtentManager::create_dummy(false));
auto ref_t_clone = make_transaction();
Transaction& t_clone = *ref_t_clone;
tree_clone.test_clone_from(t_clone, t, tree).unsafe_get0();
reset();
// create tree
- auto ref_nm = NodeExtentManager::create_dummy();
+ auto ref_nm = NodeExtentManager::create_dummy(false);
p_nm = ref_nm.get();
p_btree.emplace(std::move(ref_nm));
return DummyChild::create_initial(get_context(), keys, *this, *p_btree->root_tracker
logger().info("insert {} at {}:", key_hobj_t(key), pos);
DummyChildPool pool_clone;
pool_clone_in_progress = &pool_clone;
- auto ref_nm = NodeExtentManager::create_dummy();
+ auto ref_nm = NodeExtentManager::create_dummy(false);
pool_clone.p_nm = ref_nm.get();
pool_clone.p_btree.emplace(std::move(ref_nm));
pool_clone.p_btree->test_clone_from(
tm(*segment_manager, segment_cleaner, journal, cache, *lba_manager),
moved_nm{
#if 0
- NodeExtentManager::create_dummy()},
+ NodeExtentManager::create_dummy(false)},
#else
NodeExtentManager::create_seastore(tm)},
#endif