@@ -116,18 +116,14 @@ impl Lsm {
116116 } ) ;
117117 }
118118
119- let mut memtable = self . memtable . write ( ) . unwrap ( ) ;
120-
121- if memtable. contains_key ( & key. to_string ( ) ) {
122- memtable. remove ( & key. to_string ( ) ) ;
119+ let value = self . memtable . write ( ) . unwrap ( ) . remove ( & key. to_string ( ) ) ;
120+ self . dense_index . write ( ) . unwrap ( ) . remove ( & key. to_string ( ) ) ;
121+ self . bloom_filter . write ( ) . unwrap ( ) . delete ( key) ;
123122
124- drop ( memtable) ;
125- } else {
126- self . dense_index . write ( ) . unwrap ( ) . remove ( & key. to_string ( ) ) ;
123+ if let Some ( value) = value {
124+ self . memtable_size += mem:: size_of_val ( & value) ;
127125 }
128126
129- self . bloom_filter . write ( ) . unwrap ( ) . delete ( key) ;
130-
131127 Ok ( ( ) )
132128 }
133129
@@ -160,38 +156,37 @@ impl Lsm {
160156
161157 pub fn flush ( & mut self ) -> Result < ( ) > {
162158 let memtable = self . get_memtable ( ) ;
163-
164- if memtable. is_empty ( ) {
165- return Ok ( ( ) ) ;
166- }
167-
168159 let mut dense_index = self . dense_index . write ( ) . unwrap ( ) ;
169160
170- let segments = sstable:: Segment :: from_tree ( & memtable, & self . lsm_config . sstable_path ) ;
171-
172- for token in segments. 1 {
173- dense_index. insert ( token. 0 , token. 1 ) ;
174- }
161+ if memtable. is_empty ( ) {
162+ index:: write_index ( & self . lsm_config . sstable_path , dense_index. deref ( ) ) ;
163+ filter:: write_filter (
164+ & self . lsm_config . sstable_path ,
165+ self . bloom_filter . read ( ) . unwrap ( ) . deref ( ) ,
166+ ) ;
175167
176- index:: write_index ( & self . lsm_config . sstable_path , dense_index. deref ( ) ) ;
168+ Ok ( ( ) )
169+ } else {
170+ let segments = sstable:: Segment :: from_tree ( & memtable, & self . lsm_config . sstable_path ) ;
177171
178- let mut keys = Vec :: new ( ) ;
172+ for token in segments. 1 {
173+ dense_index. insert ( token. 0 , token. 1 ) ;
174+ }
179175
180- for segment in dense_index. deref ( ) {
181- keys. push ( segment. 0 . clone ( ) ) ;
182- }
176+ index:: write_index ( & self . lsm_config . sstable_path , dense_index. deref ( ) ) ;
183177
184- drop ( dense_index) ;
178+ drop ( dense_index) ;
185179
186- filter:: write_filter (
187- & self . lsm_config . sstable_path ,
188- self . bloom_filter . read ( ) . unwrap ( ) . deref ( ) ,
189- ) ;
180+ filter:: write_filter (
181+ & self . lsm_config . sstable_path ,
182+ self . bloom_filter . read ( ) . unwrap ( ) . deref ( ) ,
183+ ) ;
190184
191- self . memtable . write ( ) . unwrap ( ) . clear ( ) ;
192- self . memtable_size = 0 ;
185+ self . memtable . write ( ) . unwrap ( ) . clear ( ) ;
186+ self . memtable_size = 0 ;
193187
194- Ok ( ( ) )
188+ Ok ( ( ) )
189+ }
195190 }
196191
197192 pub fn get_memtable ( & self ) -> BTreeMap < String , bson:: Bson > {
@@ -243,27 +238,26 @@ impl Drop for Lsm {
243238 let memtable = self . memtable . read ( ) . unwrap ( ) ;
244239 let mut dense_index = self . dense_index . write ( ) . unwrap ( ) ;
245240
246- if memtable. is_empty ( ) {
247- return ;
248- }
249-
250- let segments = sstable:: Segment :: from_tree ( memtable. deref ( ) , & self . lsm_config . sstable_path ) ;
241+ if memtable. len ( ) == 0 {
242+ index:: write_index ( & self . lsm_config . sstable_path , dense_index. deref ( ) ) ;
243+ filter:: write_filter (
244+ & self . lsm_config . sstable_path ,
245+ self . bloom_filter . read ( ) . unwrap ( ) . deref ( ) ,
246+ ) ;
247+ } else {
248+ let segments =
249+ sstable:: Segment :: from_tree ( memtable. deref ( ) , & self . lsm_config . sstable_path ) ;
251250
252- for token in segments. 1 {
253- dense_index. insert ( token. 0 , token. 1 ) ;
254- }
251+ for token in segments. 1 {
252+ dense_index. insert ( token. 0 , token. 1 ) ;
253+ }
255254
256- let mut keys = Vec :: new ( ) ;
255+ index :: write_index ( & self . lsm_config . sstable_path , dense_index . deref ( ) ) ;
257256
258- for segment in dense_index. deref ( ) {
259- keys. push ( segment. 0 . clone ( ) ) ;
257+ filter:: write_filter (
258+ & self . lsm_config . sstable_path ,
259+ self . bloom_filter . read ( ) . unwrap ( ) . deref ( ) ,
260+ ) ;
260261 }
261-
262- index:: write_index ( & self . lsm_config . sstable_path , dense_index. deref ( ) ) ;
263-
264- filter:: write_filter (
265- & self . lsm_config . sstable_path ,
266- self . bloom_filter . read ( ) . unwrap ( ) . deref ( ) ,
267- ) ;
268262 }
269263}
0 commit comments