@@ -242,49 +242,59 @@ impl Store for CachingStore {
242242 & self ,
243243 keys : Vec < String > ,
244244 ) -> anyhow:: Result < Vec < ( String , Option < Vec < u8 > > ) > , Error > {
245- // // Retrieve the specified value from the cache, lazily populating the cache as necessary.
246- // let mut state = self.state.lock().await;
247- //
248- // let mut keys_and_values: Vec<Option<(String, Vec<u8>)>> = Vec::new();
249- // let mut keys_not_found: Vec<String> = Vec::new();
250- // for key in keys {
251- // match state.cache.get(key.as_str()).cloned() {
252- // Some(value) => keys_and_values.push(Some((key, value))),
253- // None => keys_not_found.push(key),
254- // }
255- // }
256- //
257- // // guarantee the guest will read its own writes even if entries have been popped off the end of the LRU
258- // // cache prior to their corresponding writes reaching the backing store.
259- // state.flush().await?;
260- //
261- // let value = self.inner.get(key).await?;
262- //
263- // state.cache.put(key.to_owned(), value.clone());
264- //
265- // Ok(value)
266- //
245+ let mut state = self . state . lock ( ) . await ;
246+ let mut found: Vec < ( String , Option < Vec < u8 > > ) > = Vec :: new ( ) ;
247+ let mut not_found: Vec < String > = Vec :: new ( ) ;
248+ for key in keys {
249+ match state. cache . get ( key. as_str ( ) ) {
250+ Some ( Some ( value) ) => found. push ( ( key, Some ( value. clone ( ) ) ) ) ,
251+ _ => not_found. push ( key) ,
252+ }
253+ }
254+
255+ let keys_and_values = self . inner . get_many ( not_found) . await ?;
256+ for ( key, value) in keys_and_values {
257+ found. push ( ( key. clone ( ) , value. clone ( ) ) ) ;
258+ state. cache . put ( key, value) ;
259+ }
267260
268- todo ! ( )
261+ Ok ( found )
269262 }
270263
271264 async fn set_many ( & self , key_values : Vec < ( String , Vec < u8 > ) > ) -> anyhow:: Result < ( ) , Error > {
272- todo ! ( )
265+ let mut state = self . state . lock ( ) . await ;
266+
267+ for ( key, value) in key_values. clone ( ) {
268+ state. cache . put ( key, Some ( value) ) ;
269+ }
270+
271+ self . inner . set_many ( key_values) . await
273272 }
274273
275274 async fn delete_many ( & self , keys : Vec < String > ) -> anyhow:: Result < ( ) , Error > {
276- todo ! ( )
275+ let mut state = self . state . lock ( ) . await ;
276+
277+ for key in keys. clone ( ) {
278+ state. cache . put ( key, None ) ;
279+ }
280+
281+ self . inner . delete_many ( keys) . await
277282 }
278283
279284 async fn increment ( & self , key : String , delta : i64 ) -> anyhow:: Result < i64 , Error > {
280- todo ! ( )
285+ let mut state = self . state . lock ( ) . await ;
286+ let counter = self . inner . increment ( key. clone ( ) , delta) . await ?;
287+ state
288+ . cache
289+ . put ( key, Some ( i64:: to_le_bytes ( counter) . to_vec ( ) ) ) ;
290+ Ok ( counter)
281291 }
282292
283293 async fn new_compare_and_swap (
284294 & self ,
285295 bucket_rep : u32 ,
286296 key : & str ,
287297 ) -> anyhow:: Result < Arc < dyn Cas > , Error > {
288- todo ! ( )
298+ self . inner . new_compare_and_swap ( bucket_rep , key ) . await
289299 }
290300}
0 commit comments