@@ -119,7 +119,7 @@ impl RocksDbOptions {
119119pub struct RocksDbStorage {
120120 db : Arc < DB > ,
121121 options : Arc < RocksDbOptions > ,
122- _config : RocksDbStorageConfig ,
122+ config : RocksDbStorageConfig ,
123123}
124124
125125/// Configuration for RocksDB storage.
@@ -170,7 +170,7 @@ impl Default for RocksDbStorageConfig {
170170 bloom_filter_bits : BLOOM_FILTER_NUM_BITS ,
171171 enable_statistics : true ,
172172 use_mmap_reads : false ,
173- spawn_blocking_reads : false ,
173+ spawn_blocking_reads : true ,
174174 }
175175 }
176176}
@@ -260,7 +260,7 @@ impl RocksDbStorage {
260260 pub fn new ( path : & Path , config : RocksDbStorageConfig ) -> PatriciaStorageResult < Self > {
261261 let options = RocksDbOptions :: from_config ( & config) ;
262262 let db = Arc :: new ( DB :: open ( & options. db_options , path) ?) ;
263- Ok ( Self { db, options : Arc :: new ( options) , _config : config } )
263+ Ok ( Self { db, options : Arc :: new ( options) , config } )
264264 }
265265}
266266
@@ -289,28 +289,40 @@ impl Storage for RocksDbStorage {
289289 type Config = RocksDbStorageConfig ;
290290
291291 async fn get ( & self , key : & DbKey ) -> PatriciaStorageResult < Option < DbValue > > {
292- // TODO(Nimrod): Config should indicate whether to spawn a task or not.
293- let db = self . db . clone ( ) ;
294- let key = key. clone ( ) ;
295- Ok ( spawn_blocking ( move || db. get ( & key. 0 ) . map ( |opt| opt. map ( DbValue ) ) ) . await ??)
292+ if self . config . spawn_blocking_reads {
293+ let db = self . db . clone ( ) ;
294+ let key = key. clone ( ) ;
295+ Ok ( spawn_blocking ( move || db. get ( & key. 0 ) . map ( |opt| opt. map ( DbValue ) ) ) . await ??)
296+ } else {
297+ Ok ( self . db . get ( & key. 0 ) . map ( |opt| opt. map ( DbValue ) ) ?)
298+ }
296299 }
297300
298301 async fn set ( & mut self , key : DbKey , value : DbValue ) -> PatriciaStorageResult < ( ) > {
299302 Ok ( self . db . put_opt ( & key. 0 , & value. 0 , & self . options . write_options ) ?)
300303 }
301304
302305 async fn mget ( & self , keys : & [ & DbKey ] ) -> PatriciaStorageResult < Vec < Option < DbValue > > > {
303- // TODO(Nimrod): Config should indicate whether to spawn a task or not.
304- let db = self . db . clone ( ) ;
305- let keys: Vec < Vec < u8 > > = keys. iter ( ) . map ( |k| k. 0 . clone ( ) ) . collect ( ) ;
306- spawn_blocking ( move || {
307- let raw_keys = keys. iter ( ) . map ( |k| k. as_slice ( ) ) ;
308- db. multi_get ( raw_keys)
306+ if self . config . spawn_blocking_reads {
307+ let db = self . db . clone ( ) ;
308+ let keys: Vec < Vec < u8 > > = keys. iter ( ) . map ( |k| k. 0 . clone ( ) ) . collect ( ) ;
309+ Ok ( spawn_blocking ( move || {
310+ let raw_keys = keys. iter ( ) . map ( |k| k. as_slice ( ) ) ;
311+ db. multi_get ( raw_keys)
312+ . into_iter ( )
313+ . map ( |r| r. map ( |opt| opt. map ( DbValue ) ) . map_err ( |e| e. into ( ) ) )
314+ . collect :: < Result < Vec < _ > , PatriciaStorageError > > ( )
315+ } )
316+ . await ??)
317+ } else {
318+ let raw_keys = keys. iter ( ) . map ( |k| k. 0 . as_slice ( ) ) ;
319+ Ok ( self
320+ . db
321+ . multi_get ( raw_keys)
309322 . into_iter ( )
310323 . map ( |r| r. map ( |opt| opt. map ( DbValue ) ) . map_err ( |e| e. into ( ) ) )
311- . collect :: < Result < Vec < _ > , PatriciaStorageError > > ( )
312- } )
313- . await ?
324+ . collect :: < Result < Vec < _ > , PatriciaStorageError > > ( ) ?)
325+ }
314326 }
315327
316328 async fn mset ( & mut self , key_to_value : DbHashMap ) -> PatriciaStorageResult < ( ) > {
0 commit comments