From 7f5dde8d5a3e95fd6107e3d4d4bb22f1fe19a271 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Sat, 10 Oct 2020 09:37:52 +0800 Subject: [PATCH] crimson/onode-staged-tree: test split at end Signed-off-by: Yingxin Cheng --- .../seastore/onode_tree/test_staged_fltree.cc | 75 +++++++++++++++---- 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc b/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc index cd5b9c5e465..70658c3ae13 100644 --- a/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc +++ b/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc @@ -456,15 +456,6 @@ static std::set build_key_set( } class TestTree { - NodeExtentManagerURef moved_nm; - TransactionRef ref_t; - Transaction& t; - context_t c; - Btree tree; - Onodes onodes; - std::vector> insert_history; - public: TestTree() : moved_nm{NodeExtentManager::create_dummy(false)}, @@ -486,10 +477,29 @@ class TestTree { auto keys = build_key_set(range_2, range_1, range_0); for (auto& key : keys) { auto& value = onodes.create(onode_size); - auto [cursor, success] = tree.insert(t, key, value).unsafe_get0(); - assert(success == true); - Onodes::validate_cursor(cursor, key, value); - insert_history.emplace_back(key, &value, cursor); + insert_tree(key, value).get0(); + } + assert(tree.height(t).unsafe_get0() == 1); + assert(!tree.test_is_clean()); + std::ostringstream oss; + tree.dump(t, oss); + logger().info("\n{}\n", oss.str()); + }); + } + + seastar::future<> build_tree( + const std::vector& keys, const std::vector& values) { + return seastar::async([this, keys, values] { + tree.mkfs(t).unsafe_get0(); + logger().info("\n---------------------------------------------" + "\nbefore leaf node split:\n"); + assert(keys.size() == values.size()); + auto key_iter = keys.begin(); + auto value_iter = values.begin(); + while (key_iter != keys.end()) { + insert_tree(*key_iter, **value_iter).get0(); + ++key_iter; + ++value_iter; } assert(tree.height(t).unsafe_get0() == 1); assert(!tree.test_is_clean()); @@ -528,6 +538,25 @@ class TestTree { const onode_t& create_onode(size_t size) { return onodes.create(size); } + + private: + seastar::future<> insert_tree(const ghobject_t& key, const onode_t& value) { + return seastar::async([this, &key, &value] { + auto [cursor, success] = tree.insert(t, key, value).unsafe_get0(); + assert(success == true); + Onodes::validate_cursor(cursor, key, value); + insert_history.emplace_back(key, &value, cursor); + }); + } + + NodeExtentManagerURef moved_nm; + TransactionRef ref_t; + Transaction& t; + context_t c; + Btree tree; + Onodes onodes; + std::vector> insert_history; }; struct c_dummy_test_t : public seastar_test_suite_t {}; @@ -628,7 +657,23 @@ TEST_F(c_dummy_test_t, 4_split_leaf_node) test.split(make_ghobj(2, 2, 2, "ns1", "oid1", 3, 3), onode).get0(); test.split(make_ghobj(2, 2, 2, "ns2", "oid2", 1, 1), onode).get0(); } - // Impossible to split at [END, END, END] + + { + TestTree test; + std::vector keys = { + make_ghobj(2, 2, 2, "ns3", "oid3", 3, 3), + make_ghobj(3, 3, 3, "ns3", "oid3", 3, 3)}; + std::vector values = { + &test.create_onode(1360), + &test.create_onode(1632)}; + test.build_tree(keys, values).get0(); + auto& onode = test.create_onode(1640); + logger().info("\n---------------------------------------------" + "\nsplit at [END, END, END]; insert to right end at stage 0, 1, 2\n"); + test.split(make_ghobj(3, 3, 3, "ns3", "oid3", 4, 4), onode).get0(); + test.split(make_ghobj(3, 3, 3, "ns4", "oid4", 3, 3), onode).get0(); + test.split(make_ghobj(4, 4, 4, "ns3", "oid3", 3, 3), onode).get0(); + } }); } @@ -1095,7 +1140,7 @@ TEST_F(c_dummy_test_t, 5_split_internal_node) pool.test_split(make_ghobj(3, 3, 3, "ns3", "oid3" + padding, 2, 3), {1, {1, {1}}}).get(); } - // TODO: test split at {0, 0, 0} + // Impossible to split at {0, 0, 0} // Impossible to split at [END, END, END] }); } -- 2.39.5