diff --git a/vortex-io/src/tokio.rs b/vortex-io/src/tokio.rs index 01ce99bbe9c..b74a91debdd 100644 --- a/vortex-io/src/tokio.rs +++ b/vortex-io/src/tokio.rs @@ -4,7 +4,6 @@ use std::fs::File; use std::io; use std::ops::{Deref, Range}; -use std::os::unix::fs::FileExt; use std::path::Path; use std::sync::Arc; @@ -50,12 +49,15 @@ impl Deref for TokioFile { } impl VortexReadAt for TokioFile { + + #[cfg(unix)] #[tracing::instrument(skip_all, fields(range, alignment))] async fn read_byte_range( &self, range: Range, alignment: Alignment, ) -> io::Result { + use std::os::unix::fs::FileExt; let len = usize::try_from(range.end - range.start).vortex_expect("range too big for usize"); let this = self.clone(); @@ -68,6 +70,26 @@ impl VortexReadAt for TokioFile { .await? } + #[cfg(windows)] + #[tracing::instrument(skip_all, fields(range, alignment))] + async fn read_byte_range( + &self, + range: Range, + alignment: Alignment, + ) -> io::Result { + let len = usize::try_from(range.end - range.start).expect("range too big for usize"); + let this = self.clone(); + + spawn_blocking(move || { + use std::os::windows::fs::FileExt; + let mut buffer = ByteBufferMut::with_capacity_aligned(len, alignment); + unsafe { buffer.set_len(len) } + this.seek_read(&mut buffer, range.start)?; + Ok(buffer.freeze()) + }) + .await? + } + fn performance_hint(&self) -> PerformanceHint { PerformanceHint::local() } @@ -98,7 +120,6 @@ mod tests { use std::fs::File; use std::io::Write; use std::ops::Deref; - use std::os::unix::fs::FileExt; use tempfile::NamedTempFile; use vortex_buffer::Alignment; @@ -138,8 +159,18 @@ mod tests { // Create a function to test if we can read from the file let can_read = |file: &File| { + let mut buffer = vec![0; 7]; - file.read_exact_at(&mut buffer, 0).is_ok() + #[cfg(unix)] + { + use std::os::unix::fs::FileExt; + file.read_exact_at(&mut buffer, 0).is_ok() + } + #[cfg(windows)] + { + use std::os::windows::fs::FileExt; + file.seek_read(&mut buffer, 0).map(|read| read == buffer.len()).unwrap_or(false) + } }; // Test initial read