Compare commits

...

2 commits

Author SHA1 Message Date
b1797dafd2
Fix double write bug 2021-07-14 19:11:46 -04:00
9209b822a9
Simplify DiskWriter poll_flush 2021-07-14 14:20:31 -04:00

41
src/cache/fs.rs vendored
View file

@ -158,10 +158,11 @@ impl<R: AsyncRead> AsyncRead for EncryptedReader<R> {
cx: &mut Context<'_>, cx: &mut Context<'_>,
buf: &mut ReadBuf<'_>, buf: &mut ReadBuf<'_>,
) -> Poll<std::io::Result<()>> { ) -> Poll<std::io::Result<()>> {
let mut pinned = self.as_mut();
let previously_read = buf.filled().len(); let previously_read = buf.filled().len();
let res = self.as_mut().file.as_mut().poll_read(cx, buf); let res = pinned.file.as_mut().poll_read(cx, buf);
let bytes_modified = buf.filled().len() - previously_read; let bytes_modified = buf.filled().len() - previously_read;
self.keystream.apply_keystream( pinned.keystream.apply_keystream(
&mut buf.filled_mut()[previously_read..previously_read + bytes_modified], &mut buf.filled_mut()[previously_read..previously_read + bytes_modified],
); );
res res
@ -214,7 +215,7 @@ impl<'a, R: AsyncBufRead> Future for MetadataFuture<'a, R> {
// This needs to be outside the loop because we need to drop the // This needs to be outside the loop because we need to drop the
// reader ref, since that depends on a mut self. // reader ref, since that depends on a mut self.
pinned.as_mut().consume(dbg!(bytes_consumed)); pinned.as_mut().consume(bytes_consumed);
return res; return res;
} }
} }
@ -326,31 +327,27 @@ impl AsyncWrite for EncryptedDiskWriter {
Poll::Ready(Ok(buf.len())) Poll::Ready(Ok(buf.len()))
} }
Poll::Ready(Err(e)) => Poll::Ready(Err(e)), Poll::Ready(Err(e)) => Poll::Ready(Err(e)),
Poll::Pending => Poll::Pending, // We have written the data to our buffer, even if we haven't
// couldn't write the file to disk.
Poll::Pending => Poll::Ready(Ok(buf.len())),
} }
} }
#[inline] #[inline]
fn poll_flush( fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), std::io::Error>> {
mut self: Pin<&mut Self>, let pinned = Pin::into_inner(self);
cx: &mut Context<'_>,
) -> Poll<Result<(), std::io::Error>> {
if self.buffer.is_empty() {
self.as_mut().file.as_mut().poll_flush(cx)
} else {
let pinned = Pin::into_inner(self);
while !pinned.buffer.is_empty() {
match pinned.file.as_mut().poll_write(cx, &pinned.buffer) {
Poll::Ready(Ok(n)) => {
pinned.buffer.drain(..n);
}
Poll::Ready(Err(e)) => return Poll::Ready(Err(e)),
Poll::Pending => return Poll::Pending,
}
}
Poll::Ready(Ok(())) while !pinned.buffer.is_empty() {
match pinned.file.as_mut().poll_write(cx, &pinned.buffer) {
Poll::Ready(Ok(n)) => {
pinned.buffer.drain(..n);
}
Poll::Ready(Err(e)) => return Poll::Ready(Err(e)),
Poll::Pending => return Poll::Pending,
}
} }
pinned.file.as_mut().poll_flush(cx)
} }
#[inline] #[inline]