Skip to content

Commit

Permalink
fs: change panic to error in File::start_seek (#4897)
Browse files Browse the repository at this point in the history
  • Loading branch information
sebpuetz committed Aug 11, 2022
1 parent d48c437 commit cd0ff7f
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 20 deletions.
41 changes: 21 additions & 20 deletions tokio/src/fs/file.rs
Expand Up @@ -565,29 +565,30 @@ impl AsyncSeek for File {
let me = self.get_mut();
let inner = me.inner.get_mut();

loop {
match inner.state {
Busy(_) => panic!("must wait for poll_complete before calling start_seek"),
Idle(ref mut buf_cell) => {
let mut buf = buf_cell.take().unwrap();

// Factor in any unread data from the buf
if !buf.is_empty() {
let n = buf.discard_read();

if let SeekFrom::Current(ref mut offset) = pos {
*offset += n;
}
match inner.state {
Busy(_) => Err(io::Error::new(
io::ErrorKind::Other,
"other file operation is pending, call poll_complete before start_seek",
)),
Idle(ref mut buf_cell) => {
let mut buf = buf_cell.take().unwrap();

// Factor in any unread data from the buf
if !buf.is_empty() {
let n = buf.discard_read();

if let SeekFrom::Current(ref mut offset) = pos {
*offset += n;
}
}

let std = me.std.clone();
let std = me.std.clone();

inner.state = Busy(spawn_blocking(move || {
let res = (&*std).seek(pos);
(Operation::Seek(res), buf)
}));
return Ok(());
}
inner.state = Busy(spawn_blocking(move || {
let res = (&*std).seek(pos);
(Operation::Seek(res), buf)
}));
Ok(())
}
}
}
Expand Down
21 changes: 21 additions & 0 deletions tokio/src/fs/file/tests.rs
Expand Up @@ -955,3 +955,24 @@ fn partial_read_set_len_ok() {
assert_eq!(n, FOO.len());
assert_eq!(&buf[..n], FOO);
}

#[test]
fn busy_file_seek_error() {
let mut file = MockFile::default();
let mut seq = Sequence::new();
file.expect_inner_write()
.once()
.in_sequence(&mut seq)
.returning(|_| Err(io::ErrorKind::Other.into()));

let mut file = crate::io::BufReader::new(File::from_std(file));
{
let mut t = task::spawn(file.write(HELLO));
assert_ready_ok!(t.poll());
}

pool::run_one();

let mut t = task::spawn(file.seek(SeekFrom::Start(0)));
assert_ready_err!(t.poll());
}

0 comments on commit cd0ff7f

Please sign in to comment.