@@ -39,8 +39,10 @@ impl IoRequest {
3939 pub fn len ( & self ) -> usize {
4040 match & self . 0 {
4141 IoRequestInner :: Single ( r) => r. length ,
42- IoRequestInner :: Coalesced ( r) => usize:: try_from ( r. range . end - r. range . start )
43- . vortex_expect ( "range too big for usize" ) ,
42+ IoRequestInner :: Coalesced ( r) => {
43+ usize:: try_from ( r. range . end . saturating_sub ( r. range . start ) )
44+ . vortex_expect ( "range too big for usize" )
45+ }
4446 }
4547 }
4648
@@ -109,17 +111,6 @@ impl Debug for ReadRequest {
109111
110112impl ReadRequest {
111113 pub ( crate ) fn resolve ( self , result : VortexResult < BufferHandle > ) {
112- let result = result. and_then ( |buffer| {
113- if self . length != buffer. len ( ) {
114- vortex_bail ! (
115- "ReadRequest: expected buffer of length {} but received {}." ,
116- self . length,
117- buffer. len( )
118- )
119- }
120- Ok ( buffer)
121- } ) ;
122-
123114 if let Err ( e) = self . callback . send ( result) {
124115 tracing:: debug!( "ReadRequest {} dropped before resolving: {e}" , self . id) ;
125116 }
@@ -128,9 +119,9 @@ impl ReadRequest {
128119
129120/// A set of I/O requests that have been coalesced into a single larger request.
130121pub ( crate ) struct CoalescedRequest {
131- pub ( crate ) range : Range < u64 > ,
132- pub ( crate ) alignment : Alignment , // Global max segment alignment used for the coalesced range.
133- pub ( crate ) requests : Vec < ReadRequest > , // TODO(ngates): we could have enum of Single/Many to avoid Vec.
122+ range : Range < u64 > ,
123+ alignment : Alignment , // Global max segment alignment used for the coalesced range.
124+ requests : Vec < ReadRequest > , // TODO(ngates): we could have enum of Single/Many to avoid Vec.
134125}
135126
136127impl Debug for CoalescedRequest {
@@ -145,28 +136,45 @@ impl Debug for CoalescedRequest {
145136}
146137
147138impl CoalescedRequest {
148- pub fn resolve ( self , result : VortexResult < BufferHandle > ) {
149- let result = result. and_then ( |buffer| {
150- let expected_length = self . range . end . saturating_sub ( self . range . start ) ;
151- let buffer_len = buffer. len ( ) as u64 ;
152- if expected_length != buffer_len {
139+ pub fn try_new (
140+ range : Range < u64 > ,
141+ alignment : Alignment ,
142+ requests : Vec < ReadRequest > ,
143+ ) -> VortexResult < Self > {
144+ if range. start > range. end {
145+ vortex_bail ! (
146+ "CoalescedRequest: range.start, {}, must be less than or equal to range.end, {}." ,
147+ range. start,
148+ range. end,
149+ )
150+ }
151+ for req in requests. iter ( ) {
152+ if req. offset < range. start {
153153 vortex_bail ! (
154- "CoalescedRequest: expected buffer of length {} but received {}." ,
155- expected_length,
156- buffer_len
154+ "CoalescedRequest: sub-request for length {} at file offset {} precedes coalesced range: {}..{}. {:?}" ,
155+ req. length,
156+ req. offset,
157+ range. start,
158+ range. end,
159+ req,
157160 )
158161 }
162+ }
163+ Ok ( Self {
164+ range,
165+ alignment,
166+ requests,
167+ } )
168+ }
169+
170+ pub fn resolve ( self , result : VortexResult < BufferHandle > ) {
171+ let result = result. and_then ( |buffer| {
172+ let buffer_len = buffer. len ( ) as u64 ;
159173
160174 for req in self . requests . iter ( ) {
161- let request_offset = req. offset . checked_sub ( self . range . start ) . ok_or_else ( || {
162- vortex_err ! (
163- "CoalescedRequest: sub-request for length {} at file offset {} preceeds coalesced range: {}..{}." ,
164- req. length,
165- req. offset,
166- self . range. start,
167- self . range. end,
168- )
169- } ) ?;
175+ // We check on construction that req.offset >= range.start.
176+ let request_offset = req. offset - self . range . start ;
177+
170178 if request_offset > buffer_len {
171179 vortex_bail ! (
172180 "CoalescedRequest: sub-request for length {} at buffer offset {} (file offset {}) is unsatisfiable by buffer of length {}." ,
0 commit comments