From a9675bc44fa686f4d06694ad8f59a5725ad103ca Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Thu, 24 Sep 2020 14:38:45 +0800 Subject: [PATCH] crimson/onode-staged-tree: fix target split size calculation Also adjust the test layouts because the split point may change. Signed-off-by: Yingxin Cheng --- .../onode_manager/staged-fltree/node_layout.h | 6 ++-- .../seastore/onode_tree/test_staged_fltree.cc | 34 +++++++++++-------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h index d5aef9ad95864..e7bdadc11fb96 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h @@ -274,8 +274,10 @@ class NodeLayoutT final : public InternalNodeImpl, public LeafNodeImpl { bool is_insert_left; { size_t empty_size = node_stage.size_before(0); - size_t available_size = node_stage.total_size() - empty_size; - size_t target_split_size = empty_size + (available_size + insert_size) / 2; + size_t total_size = node_stage.total_size(); + size_t available_size = total_size - empty_size; + size_t filled_size = total_size - node_stage.free_size() - empty_size; + size_t target_split_size = empty_size + (filled_size + insert_size) / 2; // TODO adjust NODE_BLOCK_SIZE according to this requirement assert(insert_size < available_size / 2); 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 c4be907e7cdd5..e99ca7b55aebd 100644 --- a/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc +++ b/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc @@ -521,7 +521,7 @@ TEST_F(c_dummy_test_t, 4_split_leaf_node) TestTree test; test.build_tree({2, 5}, {2, 5}, {2, 5}, 120).get0(); - auto& onode = test.create_onode(1280); + auto& onode = test.create_onode(1084); logger().info("\n---------------------------------------------" "\nsplit at stage 2; insert to left front at stage 2, 1, 0\n"); test.split(make_ghobj(1, 1, 1, "ns3", "oid3", 3, 3), onode).get0(); @@ -536,21 +536,22 @@ TEST_F(c_dummy_test_t, 4_split_leaf_node) test.split(make_ghobj(3, 3, 3, "ns1", "oid1", 3, 3), onode).get0(); test.split(make_ghobj(3, 3, 3, "ns2", "oid2", 1, 1), onode).get0(); + auto& onode0 = test.create_onode(1476); logger().info("\n---------------------------------------------" "\nsplit at stage 2; insert to right front at stage 0, 1, 2, 1, 0\n"); - test.split(make_ghobj(3, 3, 3, "ns4", "oid4", 5, 5), onode).get0(); - test.split(make_ghobj(3, 3, 3, "ns5", "oid5", 3, 3), onode).get0(); - test.split(make_ghobj(3, 4, 4, "ns3", "oid3", 3, 3), onode).get0(); - test.split(make_ghobj(4, 4, 4, "ns1", "oid1", 3, 3), onode).get0(); - test.split(make_ghobj(4, 4, 4, "ns2", "oid2", 1, 1), onode).get0(); + test.split(make_ghobj(3, 3, 3, "ns4", "oid4", 5, 5), onode0).get0(); + test.split(make_ghobj(3, 3, 3, "ns5", "oid5", 3, 3), onode0).get0(); + test.split(make_ghobj(3, 4, 4, "ns3", "oid3", 3, 3), onode0).get0(); + test.split(make_ghobj(4, 4, 4, "ns1", "oid1", 3, 3), onode0).get0(); + test.split(make_ghobj(4, 4, 4, "ns2", "oid2", 1, 1), onode0).get0(); logger().info("\n---------------------------------------------" "\nsplit at stage 2; insert to right back at stage 0, 1, 2\n"); - test.split(make_ghobj(4, 4, 4, "ns4", "oid4", 5, 5), onode).get0(); - test.split(make_ghobj(4, 4, 4, "ns5", "oid5", 3, 3), onode).get0(); - test.split(make_ghobj(5, 5, 5, "ns3", "oid3", 3, 3), onode).get0(); + test.split(make_ghobj(4, 4, 4, "ns4", "oid4", 5, 5), onode0).get0(); + test.split(make_ghobj(4, 4, 4, "ns5", "oid5", 3, 3), onode0).get0(); + test.split(make_ghobj(5, 5, 5, "ns3", "oid3", 3, 3), onode0).get0(); - auto& onode1 = test.create_onode(512); + auto& onode1 = test.create_onode(316); logger().info("\n---------------------------------------------" "\nsplit at stage 1; insert to left middle at stage 0, 1, 2, 1, 0\n"); test.split(make_ghobj(2, 2, 2, "ns4", "oid4", 5, 5), onode1).get0(); @@ -565,7 +566,7 @@ TEST_F(c_dummy_test_t, 4_split_leaf_node) test.split(make_ghobj(3, 3, 3, "ns2", "oid3", 3, 3), onode1).get0(); test.split(make_ghobj(3, 3, 3, "ns3", "oid3", 1, 1), onode1).get0(); - auto& onode2 = test.create_onode(256); + auto& onode2 = test.create_onode(452); logger().info("\n---------------------------------------------" "\nsplit at stage 1; insert to right front at stage 0, 1, 0\n"); test.split(make_ghobj(3, 3, 3, "ns3", "oid3", 5, 5), onode2).get0(); @@ -580,7 +581,7 @@ TEST_F(c_dummy_test_t, 4_split_leaf_node) test.split(make_ghobj(4, 4, 4, "ns1", "oid1", 3, 3), onode2).get0(); test.split(make_ghobj(4, 4, 4, "ns2", "oid2", 1, 1), onode2).get0(); - auto& onode3 = test.create_onode(768); + auto& onode3 = test.create_onode(964); logger().info("\n---------------------------------------------" "\nsplit at stage 0; insert to right middle at stage 0, 1, 2, 1, 0\n"); test.split(make_ghobj(3, 3, 3, "ns4", "oid4", 5, 5), onode3).get0(); @@ -593,9 +594,10 @@ TEST_F(c_dummy_test_t, 4_split_leaf_node) "\nsplit at stage 0; insert to right front at stage 0\n"); test.split(make_ghobj(3, 3, 3, "ns4", "oid4", 2, 3), onode3).get0(); + auto& onode4 = test.create_onode(572); logger().info("\n---------------------------------------------" "\nsplit at stage 0; insert to left back at stage 0\n"); - test.split(make_ghobj(3, 3, 3, "ns2", "oid2", 3, 4), onode3).get0(); + test.split(make_ghobj(3, 3, 3, "ns2", "oid2", 3, 4), onode4).get0(); } // TODO: test split at {0, 0, 0} @@ -947,10 +949,11 @@ TEST_F(c_dummy_test_t, 5_split_internal_node) { logger().info("\n---------------------------------------------" "\nbefore internal node insert (1):\n"); - auto padding = std::string(245, '_'); + auto padding = std::string(244, '_'); auto keys = build_key_set({2, 6}, {2, 5}, {2, 5}, padding, true); keys.insert(make_ghobj(5, 5, 5, "ns4", "oid4" + padding, 5, 5)); keys.insert(make_ghobj(5, 5, 5, "ns4", "oid4" + padding, 6, 6)); + keys.insert(make_ghobj(5, 5, 5, "ns4", "oid4" + padding, 7, 7)); pool.build_tree(keys).unsafe_get0(); logger().info("\n---------------------------------------------" @@ -968,10 +971,11 @@ TEST_F(c_dummy_test_t, 5_split_internal_node) { logger().info("\n---------------------------------------------" "\nbefore internal node insert (2):\n"); - auto padding = std::string(245, '_'); + auto padding = std::string(243, '_'); auto keys = build_key_set({2, 6}, {2, 5}, {2, 5}, padding, true); keys.insert(make_ghobj(4, 4, 4, "n", "o", 3, 3)); keys.insert(make_ghobj(5, 5, 5, "ns4", "oid4" + padding, 5, 5)); + keys.insert(make_ghobj(5, 5, 5, "ns4", "oid4" + padding, 6, 6)); pool.build_tree(keys).unsafe_get0(); logger().info("\n---------------------------------------------" -- 2.39.5