virtual bool extent_will_overflow(
size_t ksize,
std::optional<size_t> vsize) const = 0;
+ virtual bool can_merge(OMapNodeRef right) const = 0;
virtual bool extent_is_below_min() const = 0;
virtual uint32_t get_node_size() = 0;
std::make_pair(donor, entry) : std::make_pair(entry, donor);
auto [liter, riter] = is_left ?
std::make_pair(donor_iter, iter) : std::make_pair(iter, donor_iter);
- if (donor->extent_is_below_min()) {
+ if (l->can_merge(r)) {
DEBUGT("make_full_merge l {} r {}", oc.t, *l, *r);
assert(entry->extent_is_below_min());
return l->make_full_merge(oc, r
bool extent_will_overflow(size_t ksize, std::optional<size_t> vsize) const {
return is_overflow(ksize);
}
+ bool can_merge(OMapNodeRef right) const {
+ return !is_overflow(*right->cast<OMapInnerNode>());
+ }
bool extent_is_below_min() const { return below_min(); }
uint32_t get_node_size() { return get_size(); }
size_t ksize, std::optional<size_t> vsize) const {
return is_overflow(ksize, *vsize);
}
+ bool can_merge(OMapNodeRef right) const {
+ return !is_overflow(*right->cast<OMapLeafNode>());
+ }
bool extent_is_below_min() const { return below_min(); }
uint32_t get_node_size() { return get_size(); }
bool is_overflow(size_t ksize) const {
return free_space() < (sizeof(omap_inner_key_le_t) + ksize);
}
+
+ bool is_overflow(const StringKVInnerNodeLayout &rhs) const {
+ return free_space() < rhs.used_space();
+ }
+
bool below_min() const {
return free_space() > (capacity() / 2);
}
bool is_overflow(size_t ksize, size_t vsize) const {
return free_space() < (sizeof(omap_leaf_key_le_t) + ksize + vsize);
}
+
+ bool is_overflow(const StringKVLeafNodeLayout &rhs) const {
+ return free_space() < rhs.used_space();
+ }
+
bool below_min() const {
return free_space() > (capacity() / 2);
}