Skip to content

Commit 8223fea

Browse files
committed
address comments
Signed-off-by: Daniel King <dan@spiraldb.com>
1 parent b0c6ad9 commit 8223fea

2 files changed

Lines changed: 53 additions & 33 deletions

File tree

vortex-file/src/read/request.rs

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

110112
impl 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.
130121
pub(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

136127
impl Debug for CoalescedRequest {
@@ -145,28 +136,45 @@ impl Debug for CoalescedRequest {
145136
}
146137

147138
impl 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 {}.",

vortex-file/src/segments/source.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use vortex_array::buffer::BufferHandle;
1616
use vortex_buffer::Alignment;
1717
use vortex_buffer::ByteBuffer;
1818
use vortex_error::VortexResult;
19+
use vortex_error::vortex_bail;
1920
use vortex_error::vortex_err;
2021
use vortex_error::vortex_panic;
2122
use vortex_io::VortexReadAt;
@@ -115,6 +116,17 @@ impl FileSegmentSource {
115116
let result = reader
116117
.read_at(req.offset(), req.len(), req.alignment())
117118
.await;
119+
let result = result.and_then(|buffer| {
120+
if req.len() != buffer.len() {
121+
vortex_bail!(
122+
"ReadRequest: expected buffer of length {} but received {}.",
123+
req.len(),
124+
buffer.len()
125+
)
126+
}
127+
Ok(buffer)
128+
});
129+
118130
req.resolve(result);
119131
}
120132
})

0 commit comments

Comments
 (0)