sled/pagecache/
parallel_io_unix.rs

1use std::convert::TryFrom;
2use std::fs::File;
3use std::io;
4use std::os::unix::fs::FileExt;
5
6use super::LogOffset;
7
8pub(crate) fn pread_exact_or_eof(
9    file: &File,
10    mut buf: &mut [u8],
11    offset: LogOffset,
12) -> io::Result<usize> {
13    let mut total = 0_usize;
14    while !buf.is_empty() {
15        match file.read_at(buf, offset + u64::try_from(total).unwrap()) {
16            Ok(0) => break,
17            Ok(n) => {
18                total += n;
19                let tmp = buf;
20                buf = &mut tmp[n..];
21            }
22            Err(ref e) if e.kind() == io::ErrorKind::Interrupted => {}
23            Err(e) => return Err(e),
24        }
25    }
26    Ok(total)
27}
28
29pub(crate) fn pread_exact(
30    file: &File,
31    buf: &mut [u8],
32    offset: LogOffset,
33) -> io::Result<()> {
34    file.read_exact_at(buf, offset)
35}
36
37pub(crate) fn pwrite_all(
38    file: &File,
39    buf: &[u8],
40    offset: LogOffset,
41) -> io::Result<()> {
42    file.write_all_at(buf, offset)
43}