Skip to content

Commit 1563647

Browse files
authored
Merge pull request ceph#63431 from Matan-B/wip-matanb-crimson-tentacle-63219
crimson/os/seastore/linked_tree_node: tentacle: correct balance pivots calculation for both fixed-kv tree and omap tree Reviewed-by: Yingxin Cheng <[email protected]>
2 parents 239dd0e + 93bc0c8 commit 1563647

File tree

14 files changed

+143
-96
lines changed

14 files changed

+143
-96
lines changed

src/crimson/common/fixed_kv_node_layout.h

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -558,26 +558,35 @@ 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+
{
565+
auto l_size = left.get_size();
566+
auto r_size = right.get_size();
567+
auto total = l_size + r_size;
568+
auto pivot_idx = total / 2;
569+
assert(pivot_idx > std::min(l_size, r_size)
570+
&& pivot_idx < std::max(l_size, r_size));
571+
return pivot_idx;
572+
}
573+
561574
/**
562575
* balance_into_new_nodes
563576
*
564577
* Takes the contents of left and right and copies them into
565-
* replacement_left and replacement_right such that in the
566-
* event that the number of elements is odd the extra goes to
567-
* the left side iff prefer_left.
578+
* replacement_left and replacement_right such that the size
579+
* of both are balanced.
568580
*/
569581
static K balance_into_new_nodes(
570582
const FixedKVNodeLayout &left,
571583
const FixedKVNodeLayout &right,
572-
bool prefer_left,
584+
uint32_t pivot_idx,
573585
FixedKVNodeLayout &replacement_left,
574586
FixedKVNodeLayout &replacement_right)
575587
{
588+
assert(pivot_idx != left.get_size() && pivot_idx != right.get_size());
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-
}
581590
auto replacement_pivot = pivot_idx >= left.get_size() ?
582591
right.iter_idx(pivot_idx - left.get_size())->get_key() :
583592
left.iter_idx(pivot_idx)->get_key();

src/crimson/os/seastore/backref/backref_tree_node.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ class BackrefLeafNode
173173
Transaction &t,
174174
BackrefLeafNode &left,
175175
BackrefLeafNode &right,
176-
bool prefer_left,
176+
uint32_t pivot_idx,
177177
BackrefLeafNode &replacement_left,
178178
BackrefLeafNode &replacement_right) final {}
179179

@@ -191,7 +191,7 @@ class BackrefLeafNode
191191
Transaction &t,
192192
BackrefLeafNode &left,
193193
BackrefLeafNode &right,
194-
bool prefer_left,
194+
uint32_t pivot_idx,
195195
BackrefLeafNode &replacement_left,
196196
BackrefLeafNode &replacement_right) final {}
197197
// backref leaf nodes don't have to resolve relative addresses

src/crimson/os/seastore/btree/fixed_kv_btree.h

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -312,17 +312,6 @@ class FixedKVBtree {
312312
}
313313
return get_depth();
314314
}
315-
316-
depth_t check_merge() const {
317-
if (!leaf.node->below_min_capacity()) {
318-
return 0;
319-
}
320-
for (depth_t merge_from = 1; merge_from < get_depth(); ++merge_from) {
321-
if (!get_internal(merge_from + 1).node->below_min_capacity())
322-
return merge_from;
323-
}
324-
return get_depth();
325-
}
326315
};
327316

328317
FixedKVBtree(RootBlockRef &root_block) : root_block(root_block) {}
@@ -2064,12 +2053,13 @@ class FixedKVBtree {
20642053
c.cache.retire_extent(c.trans, r);
20652054
get_tree_stats<self_type>(c.trans).extents_num_delta--;
20662055
} else {
2056+
auto pivot_idx = l->get_balance_pivot_idx(*l, *r);
20672057
LOG_PREFIX(FixedKVBtree::merge_level);
20682058
auto [replacement_l, replacement_r, pivot] =
20692059
l->make_balanced(
20702060
c,
20712061
r,
2072-
!donor_is_left);
2062+
pivot_idx);
20732063

20742064
parent_pos.node->update(
20752065
liter,

src/crimson/os/seastore/btree/fixed_kv_node.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ struct FixedKVInternalNode
341341
make_balanced(
342342
op_context_t<NODE_KEY> c,
343343
Ref &_right,
344-
bool prefer_left) {
344+
uint32_t pivot_idx) {
345345
ceph_assert(_right->get_type() == this->get_type());
346346
auto &right = *_right->template cast<node_type_t>();
347347
auto replacement_left = c.cache.template alloc_new_non_data_extent<node_type_t>(
@@ -353,13 +353,13 @@ struct FixedKVInternalNode
353353
c.trans,
354354
static_cast<node_type_t&>(*this),
355355
right,
356-
prefer_left,
356+
pivot_idx,
357357
*replacement_left,
358358
*replacement_right);
359359
auto pivot = this->balance_into_new_nodes(
360360
*this,
361361
right,
362-
prefer_left,
362+
pivot_idx,
363363
*replacement_left,
364364
*replacement_right);
365365
replacement_left->range = replacement_left->get_meta();
@@ -368,7 +368,7 @@ struct FixedKVInternalNode
368368
c.trans,
369369
static_cast<node_type_t&>(*this),
370370
right,
371-
prefer_left,
371+
pivot_idx,
372372
*replacement_left,
373373
*replacement_right);
374374
return std::make_tuple(
@@ -688,22 +688,22 @@ struct FixedKVLeafNode
688688
Transaction &t,
689689
node_type_t &left,
690690
node_type_t &right,
691-
bool prefer_left,
691+
uint32_t pivot_idx,
692692
node_type_t &replacement_left,
693693
node_type_t &replacement_right) = 0;
694694
virtual void adjust_copy_src_dest_on_balance(
695695
Transaction &t,
696696
node_type_t &left,
697697
node_type_t &right,
698-
bool prefer_left,
698+
uint32_t pivot_idx,
699699
node_type_t &replacement_left,
700700
node_type_t &replacement_right) = 0;
701701

702702
std::tuple<Ref, Ref, NODE_KEY>
703703
make_balanced(
704704
op_context_t<NODE_KEY> c,
705705
Ref &_right,
706-
bool prefer_left) {
706+
uint32_t pivot_idx) {
707707
ceph_assert(_right->get_type() == this->get_type());
708708
auto &right = *_right->template cast<node_type_t>();
709709
auto replacement_left = c.cache.template alloc_new_non_data_extent<node_type_t>(
@@ -715,13 +715,13 @@ struct FixedKVLeafNode
715715
c.trans,
716716
static_cast<node_type_t&>(*this),
717717
right,
718-
prefer_left,
718+
pivot_idx,
719719
*replacement_left,
720720
*replacement_right);
721721
auto pivot = this->balance_into_new_nodes(
722722
*this,
723723
right,
724-
prefer_left,
724+
pivot_idx,
725725
*replacement_left,
726726
*replacement_right);
727727
replacement_left->range = replacement_left->get_meta();
@@ -730,7 +730,7 @@ struct FixedKVLeafNode
730730
c.trans,
731731
static_cast<node_type_t&>(*this),
732732
right,
733-
prefer_left,
733+
pivot_idx,
734734
*replacement_left,
735735
*replacement_right);
736736
return std::make_tuple(

src/crimson/os/seastore/lba_manager/btree/lba_btree_node.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -304,21 +304,21 @@ struct LBALeafNode
304304
Transaction &t,
305305
LBALeafNode &left,
306306
LBALeafNode &right,
307-
bool prefer_left,
307+
uint32_t pivot_idx,
308308
LBALeafNode &replacement_left,
309309
LBALeafNode &replacement_right) final {
310310
this->balance_child_ptrs(
311-
t, left, right, prefer_left, replacement_left, replacement_right);
311+
t, left, right, pivot_idx, replacement_left, replacement_right);
312312
}
313313
void adjust_copy_src_dest_on_balance(
314314
Transaction &t,
315315
LBALeafNode &left,
316316
LBALeafNode &right,
317-
bool prefer_left,
317+
uint32_t pivot_idx,
318318
LBALeafNode &replacement_left,
319319
LBALeafNode &replacement_right) final {
320320
this->parent_node_t::adjust_copy_src_dest_on_balance(
321-
t, left, right, prefer_left, replacement_left, replacement_right);
321+
t, left, right, pivot_idx, replacement_left, replacement_right);
322322
}
323323

324324
CachedExtentRef duplicate_for_write(Transaction&) final {

src/crimson/os/seastore/linked_tree_node.h

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -632,18 +632,14 @@ class ParentNode {
632632
Transaction &t,
633633
T &left,
634634
T &right,
635-
bool prefer_left,
635+
uint32_t pivot_idx,
636636
T &replacement_left,
637637
T &replacement_right)
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-
}
646641

642+
ceph_assert(pivot_idx != l_size && pivot_idx != r_size);
647643
replacement_left.maybe_expand_children(pivot_idx);
648644
replacement_right.maybe_expand_children(r_size + l_size - pivot_idx);
649645

@@ -682,17 +678,11 @@ class ParentNode {
682678
Transaction &t,
683679
T &left,
684680
T &right,
685-
bool prefer_left,
681+
uint32_t pivot_idx,
686682
T &replacement_left,
687683
T &replacement_right)
688684
{
689685
size_t l_size = left.get_size();
690-
size_t r_size = right.get_size();
691-
size_t total = l_size + r_size;
692-
size_t pivot_idx = (l_size + r_size) / 2;
693-
if (total % 2 && prefer_left) {
694-
pivot_idx++;
695-
}
696686

697687
if (left.is_initial_pending()) {
698688
for (auto &cs : left.copy_sources) {

src/crimson/os/seastore/omap_manager.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,16 @@ class OMapManager {
6868
* @param string &key, omap string key
6969
* @param string &value, mapped value corresponding key
7070
*/
71-
using omap_set_key_iertr = base_iertr;
71+
using omap_set_key_iertr = base_iertr::extend<
72+
crimson::ct_error::value_too_large>;
7273
using omap_set_key_ret = omap_set_key_iertr::future<>;
7374
virtual omap_set_key_ret omap_set_key(
7475
omap_root_t &omap_root,
7576
Transaction &t,
7677
const std::string &key,
7778
const ceph::bufferlist &value) = 0;
7879

79-
using omap_set_keys_iertr = base_iertr;
80+
using omap_set_keys_iertr = omap_set_key_iertr;
8081
using omap_set_keys_ret = omap_set_keys_iertr::future<>;
8182
virtual omap_set_keys_ret omap_set_keys(
8283
omap_root_t &omap_root,

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ struct OMapNode : LogicalChildNode {
6666
omap_context_t oc,
6767
const std::string &key) = 0;
6868

69-
using insert_iertr = base_iertr;
69+
using insert_iertr = base_iertr::extend<
70+
crimson::ct_error::value_too_large>;
7071
using insert_ret = insert_iertr::future<mutation_result_t>;
7172
virtual insert_ret insert(
7273
omap_context_t oc,
@@ -101,7 +102,7 @@ struct OMapNode : LogicalChildNode {
101102

102103
using make_balanced_iertr = base_iertr;
103104
using make_balanced_ret = make_balanced_iertr::future
104-
<std::tuple<OMapNodeRef, OMapNodeRef, std::string>>;
105+
<std::tuple<OMapNodeRef, OMapNodeRef, std::optional<std::string>>>;
105106
virtual make_balanced_ret make_balanced(
106107
omap_context_t oc,
107108
OMapNodeRef _right) = 0;
@@ -116,6 +117,10 @@ struct OMapNode : LogicalChildNode {
116117

117118
virtual ~OMapNode() = default;
118119

120+
virtual bool exceeds_max_kv_limit(
121+
const std::string &key,
122+
const ceph::bufferlist &value) const = 0;
123+
119124
void init_range(std::string _begin, std::string _end) {
120125
assert(begin.empty());
121126
assert(end.empty());

0 commit comments

Comments
 (0)