@@ -27,32 +27,19 @@ pub(crate) async fn read_uring(path: &Path) -> io::Result<Vec<u8>> {
2727 . expect ( "unexpected in-flight operation detected" )
2828 . into ( ) ;
2929
30- // extra single capacity for the whole size to fit without any reallocation
31- let buf = Vec :: with_capacity ( size_hint. unwrap_or ( 0 ) ) ;
30+ let mut buf = Vec :: new ( ) ;
3231
33- read_to_end_uring ( size_hint, fd, buf) . await
32+ if let Some ( size_hint) = size_hint {
33+ buf. try_reserve ( size_hint) ?;
34+ }
35+
36+ read_to_end_uring ( fd, buf) . await
3437}
3538
36- async fn read_to_end_uring (
37- size_hint : Option < usize > ,
38- mut fd : OwnedFd ,
39- mut buf : Vec < u8 > ,
40- ) -> io:: Result < Vec < u8 > > {
39+ async fn read_to_end_uring ( mut fd : OwnedFd , mut buf : Vec < u8 > ) -> io:: Result < Vec < u8 > > {
4140 let mut offset = 0 ;
4241 let start_cap = buf. capacity ( ) ;
4342
44- // if buffer has no room and no size_hint, start with a small probe_read from 0 offset
45- if ( size_hint. is_none ( ) || size_hint == Some ( 0 ) ) && buf. capacity ( ) - buf. len ( ) < PROBE_SIZE {
46- let ( size_read, r_fd, r_buf) = small_probe_read ( fd, buf, & mut offset) . await ?;
47-
48- if size_read == 0 {
49- return Ok ( r_buf) ;
50- }
51-
52- fd = r_fd;
53- buf = r_buf;
54- }
55-
5643 loop {
5744 if buf. len ( ) == buf. capacity ( ) && buf. capacity ( ) == start_cap {
5845 // The buffer might be an exact fit. Let's read into a probe buffer
@@ -67,7 +54,6 @@ async fn read_to_end_uring(
6754
6855 buf = r_buf;
6956 fd = r_fd;
70- offset += size_read as u64 ;
7157 }
7258
7359 // buf is full, need more capacity
@@ -79,11 +65,11 @@ async fn read_to_end_uring(
7965 let buf_len = usize:: min ( buf. spare_capacity_mut ( ) . len ( ) , MAX_READ_SIZE ) ;
8066
8167 // buf_len cannot be greater than u32::MAX because MAX_READ_SIZE
82- // is u32::MAX
83- let mut read_len = buf_len as u32 ;
68+ // is less than u32::MAX
69+ let read_len = buf_len as u32 ;
8470
8571 // read into spare capacity
86- let ( size_read, r_fd, r_buf) = op_read ( fd, buf, & mut offset, & mut read_len) . await ?;
72+ let ( size_read, r_fd, r_buf) = op_read ( fd, buf, & mut offset, read_len) . await ?;
8773
8874 if size_read == 0 {
8975 return Ok ( r_buf) ;
@@ -99,12 +85,12 @@ async fn small_probe_read(
9985 mut buf : Vec < u8 > ,
10086 offset : & mut u64 ,
10187) -> io:: Result < ( u32 , OwnedFd , Vec < u8 > ) > {
102- let mut read_len = PROBE_SIZE_U32 ;
88+ let read_len = PROBE_SIZE_U32 ;
10389
10490 if buf. len ( ) < PROBE_SIZE {
10591 buf. try_reserve ( PROBE_SIZE ) ?;
10692
107- return op_read ( fd, buf, offset, & mut read_len) . await ;
93+ return op_read ( fd, buf, offset, read_len) . await ;
10894 }
10995
11096 let mut temp_arr = [ 0 ; PROBE_SIZE ] ;
@@ -116,8 +102,9 @@ async fn small_probe_read(
116102 // than PROBE_SIZE. So we can read into the discarded length
117103 buf. truncate ( back_bytes_len) ;
118104
119- let ( size_read, r_fd, mut r_buf) = op_read ( fd, buf, offset, & mut read_len) . await ?;
105+ let ( size_read, r_fd, mut r_buf) = op_read ( fd, buf, offset, read_len) . await ?;
120106
107+ r_buf. try_reserve ( PROBE_SIZE ) ?;
121108 r_buf. splice ( back_bytes_len..back_bytes_len, temp_arr) ;
122109
123110 Ok ( ( size_read, r_fd, r_buf) )
@@ -127,10 +114,10 @@ async fn op_read(
127114 mut fd : OwnedFd ,
128115 mut buf : Vec < u8 > ,
129116 offset : & mut u64 ,
130- read_len : & mut u32 ,
117+ mut read_len : u32 ,
131118) -> io:: Result < ( u32 , OwnedFd , Vec < u8 > ) > {
132119 loop {
133- let ( res, r_fd, r_buf) = Op :: read ( fd, buf, * read_len, * offset) . await ;
120+ let ( res, r_fd, r_buf) = Op :: read ( fd, buf, read_len, * offset) . await ;
134121
135122 match res {
136123 Err ( e) if e. kind ( ) == ErrorKind :: Interrupted => {
@@ -140,9 +127,9 @@ async fn op_read(
140127 Err ( e) => return Err ( e) ,
141128 Ok ( size_read) => {
142129 * offset += size_read as u64 ;
143- * read_len -= size_read;
130+ read_len -= size_read;
144131
145- if * read_len == 0 || size_read == 0 {
132+ if read_len == 0 || size_read == 0 {
146133 return Ok ( ( size_read, r_fd, r_buf) ) ;
147134 }
148135
0 commit comments