Skip to content

Commit 50e9ded

Browse files
committed
crimson/os/seastore/linked_tree_node: correct balance pivots calculation
for both fixed-kv tree and omap tree Signed-off-by: Xuehan Xu <[email protected]>
1 parent ced55ad commit 50e9ded

File tree

4 files changed

+45
-23
lines changed

4 files changed

+45
-23
lines changed

src/crimson/common/fixed_kv_node_layout.h

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,19 @@ class FixedKVNodeLayout {
558558
set_meta(Meta::merge_from(left.get_meta(), right.get_meta()));
559559
}
560560

561+
static uint32_t get_balance_pivot_idx(
562+
const FixedKVNodeLayout &left,
563+
const FixedKVNodeLayout &right,
564+
bool prefer_left)
565+
{
566+
auto total = left.get_size() + right.get_size();
567+
auto pivot_idx = total / 2;
568+
if (total % 2 && prefer_left) {
569+
pivot_idx++;
570+
}
571+
return pivot_idx;
572+
}
573+
561574
/**
562575
* balance_into_new_nodes
563576
*
@@ -574,10 +587,7 @@ class FixedKVNodeLayout {
574587
FixedKVNodeLayout &replacement_right)
575588
{
576589
auto total = left.get_size() + right.get_size();
577-
auto pivot_idx = (left.get_size() + right.get_size()) / 2;
578-
if (total % 2 && prefer_left) {
579-
pivot_idx++;
580-
}
590+
auto pivot_idx = get_balance_pivot_idx(left, right, prefer_left);
581591
auto replacement_pivot = pivot_idx >= left.get_size() ?
582592
right.iter_idx(pivot_idx - left.get_size())->get_key() :
583593
left.iter_idx(pivot_idx)->get_key();

src/crimson/os/seastore/linked_tree_node.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -638,11 +638,7 @@ class ParentNode {
638638
{
639639
size_t l_size = left.get_size();
640640
size_t r_size = right.get_size();
641-
size_t total = l_size + r_size;
642-
size_t pivot_idx = (l_size + r_size) / 2;
643-
if (total % 2 && prefer_left) {
644-
pivot_idx++;
645-
}
641+
size_t pivot_idx = T::get_balance_pivot_idx(left, right, prefer_left);
646642

647643
replacement_left.maybe_expand_children(pivot_idx);
648644
replacement_right.maybe_expand_children(r_size + l_size - pivot_idx);

src/crimson/os/seastore/omap_manager/btree/omap_btree_node_impl.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -490,10 +490,10 @@ OMapInnerNode::merge_entry(
490490
).si_then([liter=liter, riter=riter, l=l, r=r, oc, this](auto tuple) {
491491
LOG_PREFIX(OMapInnerNode::merge_entry);
492492
auto [replacement_l, replacement_r, replacement_pivot] = tuple;
493-
DEBUGT("to update parent: {} {} {}",
494-
oc.t, *this, *replacement_l, *replacement_r);
495493
replacement_l->init_range(l->get_begin(), replacement_pivot);
496494
replacement_r->init_range(replacement_pivot, r->get_end());
495+
DEBUGT("to update parent: {} {} {}",
496+
oc.t, *this, *replacement_l, *replacement_r);
497497
if (get_meta().depth > 2) { // l and r are inner nodes
498498
auto &left = *l->template cast<OMapInnerNode>();
499499
auto &right = *r->template cast<OMapInnerNode>();

src/crimson/os/seastore/omap_manager/btree/string_kv_node_layout.h

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -738,21 +738,16 @@ class StringKVInnerNodeLayout {
738738
set_meta(omap_node_meta_t::merge_from(left.get_meta(), right.get_meta()));
739739
}
740740

741-
/**
742-
* balance_into_new_nodes
743-
*
744-
* Takes the contents of left and right and copies them into
745-
* replacement_left and replacement_right such that
746-
* the size of replacement_left just >= 1/2 of (left + right)
747-
*/
748-
static std::string balance_into_new_nodes(
741+
static uint32_t get_balance_pivot_idx(
749742
const StringKVInnerNodeLayout &left,
750743
const StringKVInnerNodeLayout &right,
751-
StringKVInnerNodeLayout &replacement_left,
752-
StringKVInnerNodeLayout &replacement_right)
744+
// this is just for the consistency with linked tree nodes
745+
bool prefer_left = false)
753746
{
754-
uint32_t left_size = omap_inner_key_t(left.get_node_key_ptr()[left.get_size()-1]).key_off;
755-
uint32_t right_size = omap_inner_key_t(right.get_node_key_ptr()[right.get_size()-1]).key_off;
747+
uint32_t left_size = omap_inner_key_t(
748+
left.get_node_key_ptr()[left.get_size()-1]).key_off;
749+
uint32_t right_size = omap_inner_key_t(
750+
right.get_node_key_ptr()[right.get_size()-1]).key_off;
756751
uint32_t total = left_size + right_size;
757752
uint32_t pivot_size = total / 2;
758753
uint32_t pivot_idx = 0;
@@ -778,6 +773,27 @@ class StringKVInnerNodeLayout {
778773
}
779774
}
780775
}
776+
return pivot_idx;
777+
}
778+
779+
/**
780+
* balance_into_new_nodes
781+
*
782+
* Takes the contents of left and right and copies them into
783+
* replacement_left and replacement_right such that
784+
* the size of replacement_left just >= 1/2 of (left + right)
785+
*/
786+
static std::string balance_into_new_nodes(
787+
const StringKVInnerNodeLayout &left,
788+
const StringKVInnerNodeLayout &right,
789+
StringKVInnerNodeLayout &replacement_left,
790+
StringKVInnerNodeLayout &replacement_right)
791+
{
792+
uint32_t left_size = omap_inner_key_t(left.get_node_key_ptr()[left.get_size()-1]).key_off;
793+
uint32_t right_size = omap_inner_key_t(right.get_node_key_ptr()[right.get_size()-1]).key_off;
794+
uint32_t total = left_size + right_size;
795+
uint32_t pivot_size = total / 2;
796+
uint32_t pivot_idx = get_balance_pivot_idx(left, right);
781797

782798
auto replacement_pivot = pivot_idx >= left.get_size() ?
783799
right.iter_idx(pivot_idx - left.get_size())->get_key() :

0 commit comments

Comments
 (0)