From cbc5dc04ef7d200e93475a110aca472384a2ccb2 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 27 Jul 2023 12:28:26 +0200 Subject: [PATCH] Avoid pushing empty leaves into the tree --- crates/crdb/src/btree.rs | 52 +++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/crates/crdb/src/btree.rs b/crates/crdb/src/btree.rs index c20d7f9aa56..20173254f4c 100644 --- a/crates/crdb/src/btree.rs +++ b/crates/crdb/src/btree.rs @@ -425,26 +425,44 @@ impl Sequence { } ChildTree::Unloaded { saved_id } => { if self.0.is_leaf() { - let mut summary = self.0.summary().clone(); - Summary::add_summary(&mut summary, &other_summary, cx); + if self.0.items().is_empty() { + let mut child_summaries = ArrayVec::new(); + child_summaries.push(other_summary.clone()); - let mut child_summaries = ArrayVec::new(); - child_summaries.push(self.0.summary().clone()); - child_summaries.push(other_summary); + let mut child_trees = ArrayVec::new(); + child_trees.push(ChildTree::Unloaded { + saved_id: saved_id.clone(), + }); - let mut child_trees = ArrayVec::new(); - child_trees.push(ChildTree::Loaded { tree: self.clone() }); - child_trees.push(ChildTree::Unloaded { - saved_id: saved_id.clone(), - }); + *self = Self(Arc::new(Node::Internal { + saved_id: Default::default(), + height: 1, + summary: other_summary, + child_summaries, + child_trees, + })); + } else { + let mut summary = self.0.summary().clone(); + Summary::add_summary(&mut summary, &other_summary, cx); - *self = Self(Arc::new(Node::Internal { - saved_id: Default::default(), - height: self.0.height() + 1, - summary, - child_summaries, - child_trees, - })); + let mut child_summaries = ArrayVec::new(); + child_summaries.push(self.0.summary().clone()); + child_summaries.push(other_summary); + + let mut child_trees = ArrayVec::new(); + child_trees.push(ChildTree::Loaded { tree: self.clone() }); + child_trees.push(ChildTree::Unloaded { + saved_id: saved_id.clone(), + }); + + *self = Self(Arc::new(Node::Internal { + saved_id: Default::default(), + height: 1, + summary, + child_summaries, + child_trees, + })); + } } else if let Some(split_tree) = self.push_tree_recursive(other_child, other_summary, cx) {