@@ -2,33 +2,33 @@ use std::collections::{BTreeMap, HashMap};
22use std:: mem;
33use std:: ops:: Deref ;
44use std:: path;
5- use std:: sync:: { Arc , Mutex } ;
5+ use std:: sync:: { Arc , RwLock } ;
66
77use crate :: bloom:: BloomFilter ;
88use crate :: dustdata:: { Error , ErrorCode , Result } ;
99
1010use self :: snapshots:: Snapshot ;
1111
12- mod filter;
13- mod index;
12+ pub mod filter;
13+ pub mod index;
1414pub mod snapshots;
15- mod sstable;
15+ pub mod sstable;
1616mod writer;
1717
1818#[ derive( Clone , Debug ) ]
1919pub struct LsmConfig {
2020 pub flush_threshold : usize ,
21- pub sstable_path : String ,
21+ pub sstable_path : path :: PathBuf ,
2222}
2323
2424#[ derive( Clone ) ]
2525pub struct Lsm {
26- pub memtable : Arc < Mutex < BTreeMap < String , bson:: Bson > > > ,
26+ pub memtable : Arc < RwLock < BTreeMap < String , bson:: Bson > > > ,
2727 pub memtable_size : usize ,
2828 pub lsm_config : LsmConfig ,
2929 pub snapshots : snapshots:: SnapshotManager ,
30- pub dense_index : Arc < Mutex < HashMap < String , String > > > ,
31- pub bloom_filter : Arc < Mutex < BloomFilter > > ,
30+ pub dense_index : Arc < RwLock < HashMap < String , String > > > ,
31+ pub bloom_filter : Arc < RwLock < BloomFilter > > ,
3232}
3333
3434impl Lsm {
@@ -56,9 +56,9 @@ impl Lsm {
5656 ) ;
5757
5858 Lsm {
59- memtable : Arc :: new ( Mutex :: new ( BTreeMap :: new ( ) ) ) ,
60- bloom_filter : Arc :: new ( Mutex :: new ( bloom_filter) ) ,
61- dense_index : Arc :: new ( Mutex :: new ( index) ) ,
59+ memtable : Arc :: new ( RwLock :: new ( BTreeMap :: new ( ) ) ) ,
60+ bloom_filter : Arc :: new ( RwLock :: new ( bloom_filter) ) ,
61+ dense_index : Arc :: new ( RwLock :: new ( index) ) ,
6262 lsm_config : config,
6363 memtable_size : 0 , // The current memtable size (in bytes)
6464 snapshots,
@@ -75,8 +75,11 @@ impl Lsm {
7575
7676 self . memtable_size += mem:: size_of_val ( & value) ;
7777
78- self . memtable . lock ( ) . unwrap ( ) . insert ( key. to_string ( ) , value) ;
79- self . bloom_filter . lock ( ) . unwrap ( ) . insert ( key) ;
78+ self . memtable
79+ . write ( )
80+ . unwrap ( )
81+ . insert ( key. to_string ( ) , value) ;
82+ self . bloom_filter . write ( ) . unwrap ( ) . insert ( key) ;
8083
8184 if self . memtable_size >= self . lsm_config . flush_threshold {
8285 self . flush ( ) . unwrap ( ) ;
@@ -90,16 +93,16 @@ impl Lsm {
9093 return Ok ( None ) ;
9194 }
9295
93- let memtable = self . memtable . lock ( ) . unwrap ( ) ;
96+ let memtable = self . memtable . read ( ) . unwrap ( ) ;
9497
9598 match memtable. get ( & key. to_string ( ) ) {
9699 Some ( document) => Ok ( Some ( document. clone ( ) ) ) ,
97100 None => {
98- let dense_index = self . dense_index . lock ( ) . unwrap ( ) ;
101+ let dense_index = self . dense_index . read ( ) . unwrap ( ) ;
99102 let offset = dense_index. get ( & key. to_string ( ) ) . unwrap ( ) ;
100103 Ok ( sstable:: Segment :: read_with_offset (
101104 offset. to_string ( ) ,
102- self . lsm_config . sstable_path . to_string ( ) ,
105+ & self . lsm_config . sstable_path ,
103106 ) )
104107 }
105108 }
@@ -113,17 +116,17 @@ impl Lsm {
113116 } ) ;
114117 }
115118
116- let mut memtable = self . memtable . lock ( ) . unwrap ( ) ;
119+ let mut memtable = self . memtable . write ( ) . unwrap ( ) ;
117120
118121 if memtable. contains_key ( & key. to_string ( ) ) {
119122 memtable. remove ( & key. to_string ( ) ) ;
120123
121124 drop ( memtable) ;
122125 } else {
123- self . dense_index . lock ( ) . unwrap ( ) . remove ( & key. to_string ( ) ) ;
126+ self . dense_index . write ( ) . unwrap ( ) . remove ( & key. to_string ( ) ) ;
124127 }
125128
126- self . bloom_filter . lock ( ) . unwrap ( ) . delete ( key) ;
129+ self . bloom_filter . write ( ) . unwrap ( ) . delete ( key) ;
127130
128131 Ok ( ( ) )
129132 }
@@ -136,13 +139,13 @@ impl Lsm {
136139 } ) ;
137140 }
138141
139- let mut memtable = self . memtable . lock ( ) . unwrap ( ) ;
140- let mut bloom_filter = self . bloom_filter . lock ( ) . unwrap ( ) ;
142+ let mut memtable = self . memtable . write ( ) . unwrap ( ) ;
143+ let mut bloom_filter = self . bloom_filter . write ( ) . unwrap ( ) ;
141144
142145 // Delete the old value from the bloom filter
143146 bloom_filter. delete ( key) ;
144147
145- let mut dense_index = self . dense_index . lock ( ) . unwrap ( ) ;
148+ let mut dense_index = self . dense_index . write ( ) . unwrap ( ) ;
146149 dense_index. remove ( & key. to_string ( ) ) ;
147150 drop ( dense_index) ;
148151
@@ -162,10 +165,9 @@ impl Lsm {
162165 return Ok ( ( ) ) ;
163166 }
164167
165- let mut dense_index = self . dense_index . lock ( ) . unwrap ( ) ;
168+ let mut dense_index = self . dense_index . write ( ) . unwrap ( ) ;
166169
167- let segments =
168- sstable:: Segment :: from_tree ( & memtable, self . lsm_config . sstable_path . as_str ( ) ) ;
170+ let segments = sstable:: Segment :: from_tree ( & memtable, & self . lsm_config . sstable_path ) ;
169171
170172 for token in segments. 1 {
171173 dense_index. insert ( token. 0 , token. 1 ) ;
@@ -183,41 +185,41 @@ impl Lsm {
183185
184186 filter:: write_filter (
185187 & self . lsm_config . sstable_path ,
186- self . bloom_filter . lock ( ) . unwrap ( ) . deref ( ) ,
188+ self . bloom_filter . read ( ) . unwrap ( ) . deref ( ) ,
187189 ) ;
188190
189- self . memtable . lock ( ) . unwrap ( ) . clear ( ) ;
191+ self . memtable . write ( ) . unwrap ( ) . clear ( ) ;
190192 self . memtable_size = 0 ;
191193
192194 Ok ( ( ) )
193195 }
194196
195197 pub fn get_memtable ( & self ) -> BTreeMap < String , bson:: Bson > {
196- self . memtable . lock ( ) . unwrap ( ) . clone ( )
198+ self . memtable . read ( ) . unwrap ( ) . clone ( )
197199 }
198200
199201 pub fn contains ( & self , key : & str ) -> bool {
200- self . bloom_filter . lock ( ) . unwrap ( ) . contains ( key)
202+ self . bloom_filter . read ( ) . unwrap ( ) . contains ( key)
201203 }
202204
203205 pub fn clear ( & self ) {
204- self . memtable . lock ( ) . unwrap ( ) . clear ( ) ;
205- self . dense_index . lock ( ) . unwrap ( ) . clear ( ) ;
206+ self . memtable . write ( ) . unwrap ( ) . clear ( ) ;
207+ self . dense_index . write ( ) . unwrap ( ) . clear ( ) ;
206208 }
207209
208210 pub fn update_index ( & self ) {
209- let index = self . dense_index . lock ( ) . unwrap ( ) . clone ( ) ;
211+ let index = self . dense_index . read ( ) . unwrap ( ) . clone ( ) ;
210212 index:: write_index ( & self . lsm_config . sstable_path , & index) ;
211213 }
212214
213215 pub fn list_keys ( & self ) -> Vec < String > {
214216 let mut keys = Vec :: new ( ) ;
215217
216- for key in self . memtable . lock ( ) . unwrap ( ) . keys ( ) {
218+ for key in self . memtable . read ( ) . unwrap ( ) . keys ( ) {
217219 keys. push ( key. clone ( ) ) ;
218220 }
219221
220- for key in self . dense_index . lock ( ) . unwrap ( ) . keys ( ) {
222+ for key in self . dense_index . read ( ) . unwrap ( ) . keys ( ) {
221223 keys. push ( key. clone ( ) ) ;
222224 }
223225
@@ -226,27 +228,26 @@ impl Lsm {
226228
227229 pub fn drop ( & mut self ) {
228230 self . clear ( ) ;
229- self . bloom_filter . lock ( ) . unwrap ( ) . clear ( ) ;
231+ self . bloom_filter . write ( ) . unwrap ( ) . clear ( ) ;
230232 }
231233
232234 pub fn load_snapshot ( path : path:: PathBuf , snapshot : Snapshot ) {
233- sstable:: Segment :: from_tree ( snapshot. get_memtable ( ) , & path. display ( ) . to_string ( ) ) ;
234- index:: write_index ( & path. display ( ) . to_string ( ) , snapshot. get_dense_index ( ) ) ;
235- filter:: write_filter ( & path. display ( ) . to_string ( ) , snapshot. get_bloom_filter ( ) ) ;
235+ sstable:: Segment :: from_tree ( snapshot. get_memtable ( ) , & path) ;
236+ index:: write_index ( & path, snapshot. get_dense_index ( ) ) ;
237+ filter:: write_filter ( & path, snapshot. get_bloom_filter ( ) ) ;
236238 }
237239}
238240
239241impl Drop for Lsm {
240242 fn drop ( & mut self ) {
241- let memtable = self . memtable . lock ( ) . unwrap ( ) ;
242- let mut dense_index = self . dense_index . lock ( ) . unwrap ( ) ;
243+ let memtable = self . memtable . read ( ) . unwrap ( ) ;
244+ let mut dense_index = self . dense_index . write ( ) . unwrap ( ) ;
243245
244246 if memtable. is_empty ( ) {
245247 return ;
246248 }
247249
248- let segments =
249- sstable:: Segment :: from_tree ( memtable. deref ( ) , self . lsm_config . sstable_path . as_str ( ) ) ;
250+ let segments = sstable:: Segment :: from_tree ( memtable. deref ( ) , & self . lsm_config . sstable_path ) ;
250251
251252 for token in segments. 1 {
252253 dense_index. insert ( token. 0 , token. 1 ) ;
@@ -262,7 +263,7 @@ impl Drop for Lsm {
262263
263264 filter:: write_filter (
264265 & self . lsm_config . sstable_path ,
265- self . bloom_filter . lock ( ) . unwrap ( ) . deref ( ) ,
266+ self . bloom_filter . read ( ) . unwrap ( ) . deref ( ) ,
266267 ) ;
267268 }
268269}
0 commit comments