@@ -84,44 +84,6 @@ impl<V: Clone> BTree<V> {
84
84
parent. children . insert ( index + 1 , Arc :: new ( new_child) ) ;
85
85
}
86
86
87
- fn insert_non_full ( & self , node : & mut BNode < V > , leaf_value : Arc < LeafValue < V > > ) {
88
- let mut i = node. entries . len ( ) ;
89
-
90
- if node. is_leaf {
91
- while i > 0
92
- && !self . should_go_right ( & node. entries [ i - 1 ] , leaf_value. version , leaf_value. ts )
93
- {
94
- i -= 1 ;
95
- }
96
- // Check for duplicate version and replace if the new one has the same or later timestamp
97
- if i > 0 && node. entries [ i - 1 ] . version == leaf_value. version {
98
- if node. entries [ i - 1 ] . ts <= leaf_value. ts {
99
- node. entries [ i - 1 ] = leaf_value;
100
- }
101
- } else {
102
- node. entries . insert ( i, leaf_value) ;
103
- }
104
- } else {
105
- while i > 0
106
- && !self . should_go_right ( & node. entries [ i - 1 ] , leaf_value. version , leaf_value. ts )
107
- {
108
- i -= 1 ;
109
- }
110
-
111
- let child = Arc :: clone ( & node. children [ i] ) ;
112
- if child. is_full ( ) {
113
- self . split_child ( node, i) ;
114
- if self . should_go_right ( & node. entries [ i] , leaf_value. version , leaf_value. ts ) {
115
- i += 1 ;
116
- }
117
- }
118
-
119
- let mut child = ( * node. children [ i] ) . clone ( ) ;
120
- self . insert_non_full ( & mut child, leaf_value) ;
121
- node. children [ i] = Arc :: new ( child) ;
122
- }
123
- }
124
-
125
87
// fn insert_non_full(&self, node: &mut BNode<V>, leaf_value: Arc<LeafValue<V>>) {
126
88
// let mut i = node.entries.len();
127
89
@@ -131,7 +93,14 @@ impl<V: Clone> BTree<V> {
131
93
// {
132
94
// i -= 1;
133
95
// }
134
- // node.entries.insert(i, leaf_value);
96
+ // // Check for duplicate version and replace if the new one has the same or later timestamp
97
+ // if i > 0 && node.entries[i - 1].version == leaf_value.version {
98
+ // if node.entries[i - 1].ts <= leaf_value.ts {
99
+ // node.entries[i - 1] = leaf_value;
100
+ // }
101
+ // } else {
102
+ // node.entries.insert(i, leaf_value);
103
+ // }
135
104
// } else {
136
105
// while i > 0
137
106
// && !self.should_go_right(&node.entries[i - 1], leaf_value.version, leaf_value.ts)
@@ -153,6 +122,37 @@ impl<V: Clone> BTree<V> {
153
122
// }
154
123
// }
155
124
125
+ fn insert_non_full ( & self , node : & mut BNode < V > , leaf_value : Arc < LeafValue < V > > ) {
126
+ let mut i = node. entries . len ( ) ;
127
+
128
+ if node. is_leaf {
129
+ while i > 0
130
+ && !self . should_go_right ( & node. entries [ i - 1 ] , leaf_value. version , leaf_value. ts )
131
+ {
132
+ i -= 1 ;
133
+ }
134
+ node. entries . insert ( i, leaf_value) ;
135
+ } else {
136
+ while i > 0
137
+ && !self . should_go_right ( & node. entries [ i - 1 ] , leaf_value. version , leaf_value. ts )
138
+ {
139
+ i -= 1 ;
140
+ }
141
+
142
+ let child = Arc :: clone ( & node. children [ i] ) ;
143
+ if child. is_full ( ) {
144
+ self . split_child ( node, i) ;
145
+ if self . should_go_right ( & node. entries [ i] , leaf_value. version , leaf_value. ts ) {
146
+ i += 1 ;
147
+ }
148
+ }
149
+
150
+ let mut child = ( * node. children [ i] ) . clone ( ) ;
151
+ self . insert_non_full ( & mut child, leaf_value) ;
152
+ node. children [ i] = Arc :: new ( child) ;
153
+ }
154
+ }
155
+
156
156
fn should_go_right ( & self , entry : & LeafValue < V > , version : u64 , ts : u64 ) -> bool {
157
157
if version != entry. version {
158
158
version > entry. version
@@ -502,8 +502,7 @@ mod tests {
502
502
. iter ( )
503
503
. filter ( |value| value. ts <= ts)
504
504
. max_by ( |a, b| {
505
- a. ts . cmp ( & b. ts )
506
- . then_with ( || Arc :: as_ptr ( a) . cmp ( & Arc :: as_ptr ( b) ) )
505
+ a. ts . cmp ( & b. ts ) . then_with ( || std:: cmp:: Ordering :: Greater ) // Always prefer the second entry
507
506
} )
508
507
. unwrap ( ) ;
509
508
0 commit comments