@@ -574,6 +574,7 @@ unsafe extern "C" fn kv_io_write(
574574 chunk_offset: usize ,
575575 write_start: usize ,
576576 write_end: usize ,
577+ cached_chunk: Option <Vec <u8 >>,
577578 existing_chunk_index: Option <usize >,
578579 }
579580
@@ -590,7 +591,13 @@ unsafe extern "C" fn kv_io_write(
590591 } ;
591592 let needs_existing = write_start > 0 || existing_bytes_in_chunk > write_end;
592593 let chunk_key = kv:: get_chunk_key( file. file_tag, chunk_idx as u32 ) . to_vec( ) ;
593- let existing_chunk_index = if needs_existing {
594+ let cached_chunk = if needs_existing && ctx. read_cache_enabled {
595+ let state = get_file_state( file. state) ;
596+ state. read_cache. get( chunk_key. as_slice( ) ) . cloned( )
597+ } else {
598+ None
599+ } ;
600+ let existing_chunk_index = if needs_existing && cached_chunk. is_none( ) {
594601 let idx = chunk_keys_to_fetch. len( ) ;
595602 chunk_keys_to_fetch. push( chunk_key. clone( ) ) ;
596603 Some ( idx)
@@ -603,6 +610,7 @@ unsafe extern "C" fn kv_io_write(
603610 chunk_offset,
604611 write_start,
605612 write_end,
613+ cached_chunk,
606614 existing_chunk_index,
607615 } ) ;
608616 }
@@ -625,9 +633,14 @@ unsafe extern "C" fn kv_io_write(
625633 let mut entries_to_write = Vec :: with_capacity( plans. len( ) + 1 ) ;
626634 for plan in & plans {
627635 let existing_chunk = plan
628- . existing_chunk_index
629- . and_then( |idx| existing_chunks. get( idx) )
630- . and_then( |value| value. as_ref( ) ) ;
636+ . cached_chunk
637+ . as_deref( )
638+ . or_else( || {
639+ plan
640+ . existing_chunk_index
641+ . and_then( |idx| existing_chunks. get( idx) )
642+ . and_then( |value| value. as_ref( ) )
643+ } ) ;
631644
632645 let mut new_chunk = if let Some ( existing_chunk) = existing_chunk {
633646 let mut chunk = vec![ 0u8 ; std:: cmp:: max( existing_chunk. len( ) , plan. write_end) ] ;
0 commit comments