@@ -11,8 +11,7 @@ use crate::pager::format::data_page::{body, extract_page_header_ids, open_data_p
1111use crate :: pager:: format:: page_kind:: PageKind ;
1212use crate :: pager:: format:: segment_footer:: { SegmentFooterFields , decode_segment_footer} ;
1313use crate :: pager:: format:: structural_header:: { SegmentHeaderFields , decode_segment_header} ;
14- use crate :: vfs:: Vfs ;
15- use crate :: vfs:: VfsFile ;
14+ use crate :: vfs:: { Vfs , VfsFile , checked_read_progress} ;
1615
1716use super :: types:: { EXTENT_INDEX_ENTRY_LEN , ExtentIndexEntry } ;
1817use super :: writer:: { live_path, staging_path} ;
@@ -85,17 +84,23 @@ pub(crate) async fn authenticate_segment_metadata<V: Vfs + Clone>(
8584 let master_key = pager. mk_for ( meta. mk_epoch , cipher_id) ?;
8685 let hk = derive_hk ( & master_key) ?;
8786 let mut header_bytes = vec ! [ 0u8 ; page_size] ;
88- let header_read = file. read_at ( 0 , & mut header_bytes) . await ?;
89- if header_read != page_size {
90- return Err ( PagedbError :: segment_geometry_invalid ( "header_read" ) ) ;
87+ let mut header_offset = 0 ;
88+ let mut header_remaining = & mut header_bytes[ ..] ;
89+ while !header_remaining. is_empty ( ) {
90+ let read = file. read_at ( header_offset, header_remaining) . await ?;
91+ checked_read_progress ( & mut header_offset, read, header_remaining. len ( ) ) ?;
92+ header_remaining = header_remaining. split_at_mut ( read) . 1 ;
9193 }
9294 let header = decode_segment_header ( & header_bytes, & hk, page_size) ?;
9395 validate_header ( & header, meta, parent_file_id, page_size) ?;
9496
9597 let mut footer_bytes = vec ! [ 0u8 ; page_size] ;
96- let footer_read = file. read_at ( footer_offset, & mut footer_bytes) . await ?;
97- if footer_read != page_size {
98- return Err ( PagedbError :: segment_geometry_invalid ( "footer_read" ) ) ;
98+ let mut next_footer_offset = footer_offset;
99+ let mut footer_remaining = & mut footer_bytes[ ..] ;
100+ while !footer_remaining. is_empty ( ) {
101+ let read = file. read_at ( next_footer_offset, footer_remaining) . await ?;
102+ checked_read_progress ( & mut next_footer_offset, read, footer_remaining. len ( ) ) ?;
103+ footer_remaining = footer_remaining. split_at_mut ( read) . 1 ;
99104 }
100105 let ( footer, manifest) = {
101106 let mut lru = pager. dek_lru ( ) . lock ( ) ;
@@ -332,8 +337,12 @@ async fn collect_and_decode_index_page<V: Vfs + Clone>(
332337 . checked_mul ( page_size_u64)
333338 . ok_or_else ( || PagedbError :: segment_geometry_invalid ( "index.offset" ) ) ?;
334339 let mut page = vec ! [ 0u8 ; context. page_size] ;
335- if context. file . read_at ( offset, & mut page) . await ? != context. page_size {
336- return Err ( PagedbError :: segment_geometry_invalid ( "index.read" ) ) ;
340+ let mut read_offset = offset;
341+ let mut remaining = & mut page[ ..] ;
342+ while !remaining. is_empty ( ) {
343+ let read = context. file . read_at ( read_offset, remaining) . await ?;
344+ checked_read_progress ( & mut read_offset, read, remaining. len ( ) ) ?;
345+ remaining = remaining. split_at_mut ( read) . 1 ;
337346 }
338347 let ( cipher_id, mk_epoch) = extract_page_header_ids ( & page) ?;
339348 if cipher_id != context. cipher_id {
0 commit comments