@@ -1675,8 +1675,32 @@ fn test_multilevel_get_raw_finds_first_hit() {
16751675 "get_raw bytes should be a valid zip archive"
16761676 ) ;
16771677
1678- // Client-side mode reads through get_raw over IPC. A lower-level hit
1679- // must therefore trigger the same L0 backfill as the parsed get path.
1678+ // A key that exists in neither level should return None.
1679+ assert ! ( storage. get_raw( "missing" ) . await . unwrap( ) . is_none( ) ) ;
1680+ } ) ;
1681+ }
1682+
1683+ #[ test]
1684+ fn test_multilevel_get_raw_backfills_lower_levels ( ) {
1685+ let runtime = RuntimeBuilder :: new_multi_thread ( )
1686+ . enable_all ( )
1687+ . worker_threads ( 1 )
1688+ . build ( )
1689+ . unwrap ( ) ;
1690+
1691+ let l0 = Arc :: new ( InMemoryStorage :: new ( ) ) ;
1692+ let l1 = Arc :: new ( InMemoryStorage :: new ( ) ) ;
1693+ let storage = MultiLevelStorage :: new ( vec ! [
1694+ l0. clone( ) as Arc <dyn Storage >,
1695+ l1. clone( ) as Arc <dyn Storage >,
1696+ ] ) ;
1697+
1698+ runtime. block_on ( async {
1699+ l1. put ( "key" , CacheWrite :: default ( ) ) . await . unwrap ( ) ;
1700+ assert ! ( l0. get_raw( "key" ) . await . unwrap( ) . is_none( ) ) ;
1701+
1702+ assert ! ( storage. get_raw( "key" ) . await . unwrap( ) . is_some( ) ) ;
1703+
16801704 tokio:: time:: timeout ( Duration :: from_secs ( 1 ) , async {
16811705 loop {
16821706 if l0. get_raw ( "key" ) . await . unwrap ( ) . is_some ( ) {
@@ -1686,10 +1710,7 @@ fn test_multilevel_get_raw_finds_first_hit() {
16861710 }
16871711 } )
16881712 . await
1689- . expect ( "L1 hit should backfill L0" ) ;
1690-
1691- // A key that exists in neither level should return None.
1692- assert ! ( storage. get_raw( "missing" ) . await . unwrap( ) . is_none( ) ) ;
1713+ . expect ( "L1 raw hit should backfill L0" ) ;
16931714 } ) ;
16941715}
16951716
0 commit comments