]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/onode-staged-tree: fix target split size calculation
authorYingxin Cheng <yingxin.cheng@intel.com>
Thu, 24 Sep 2020 06:38:45 +0000 (14:38 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Tue, 1 Dec 2020 04:50:54 +0000 (12:50 +0800)
Also adjust the test layouts because the split point may change.

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h
src/test/crimson/seastore/onode_tree/test_staged_fltree.cc

index d5aef9ad95864d37780dc6ff08582ff760609cd1..e7bdadc11fb96fd756a2ee8c1a26bcc7dec00ad9 100644 (file)
@@ -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);
 
index c4be907e7cdd5b9353a0c452a6457221178a3adf..e99ca7b55aebdad45c370cd93addf729c65fc226 100644 (file)
@@ -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---------------------------------------------"