diff --git a/pageserver/src/tenant/ephemeral_file.rs b/pageserver/src/tenant/ephemeral_file.rs index e48b9e83bd..8c13136c51 100644 --- a/pageserver/src/tenant/ephemeral_file.rs +++ b/pageserver/src/tenant/ephemeral_file.rs @@ -5,7 +5,7 @@ use crate::config::PageServerConf; use crate::context::RequestContext; use crate::page_cache::{self, PAGE_SZ}; use crate::tenant::block_io::{BlockCursor, BlockLease, BlockReader}; -use crate::virtual_file::{self, VirtualFile}; +use crate::virtual_file::{self, io_engine, VirtualFile}; use bytes::BytesMut; use camino::Utf8PathBuf; use pageserver_api::shard::TenantShardId; @@ -160,7 +160,7 @@ impl EphemeralFile { let (mutable_tail, res) = self .ephemeral_file .file - .write_all_at(mutable_tail, self.blknum as u64 * PAGE_SZ as u64) + .write_all_at(mutable_tail, self.blknum as u64 * PAGE_SZ as u64, io_engine::IoEngine::StdFs) .await; // TODO: If we panic before we can put the mutable_tail back, subsequent calls will fail. // I.e., the IO isn't retryable if we panic. diff --git a/pageserver/src/virtual_file.rs b/pageserver/src/virtual_file.rs index 6d4774cf75..849e0b6b17 100644 --- a/pageserver/src/virtual_file.rs +++ b/pageserver/src/virtual_file.rs @@ -34,6 +34,8 @@ pub(crate) use io_engine::IoEngineKind; pub(crate) use metadata::Metadata; pub(crate) use open_options::*; +use self::io_engine::IoEngine; + /// /// A virtual file descriptor. You can use this just like std::fs::File, but internally /// the underlying file is closed if the system is low on file descriptors, @@ -596,6 +598,7 @@ impl VirtualFile { &self, buf: B, mut offset: u64, + engine: IoEngine, ) -> (B::Buf, Result<(), Error>) { let buf_len = buf.bytes_init(); if buf_len == 0 { @@ -604,7 +607,7 @@ impl VirtualFile { let mut buf = buf.slice(0..buf_len); while !buf.is_empty() { let res; - (buf, res) = self.write_at(buf, offset).await; + (buf, res) = self.write_at(buf, offset, engine).await; match res { Ok(0) => { return ( @@ -667,7 +670,7 @@ impl VirtualFile { buf: Slice, ) -> (Slice, Result) { let pos = self.pos; - let (buf, res) = self.write_at(buf, pos).await; + let (buf, res) = self.write_at(buf, pos, io_engine::get()).await; let n = match res { Ok(n) => n, Err(e) => return (buf, Err(e)), @@ -705,14 +708,14 @@ impl VirtualFile { &self, buf: Slice, offset: u64, + engine: IoEngine, ) -> (Slice, Result) { let file_guard = match self.lock_file().await { Ok(file_guard) => file_guard, Err(e) => return (buf, Err(e)), }; observe_duration!(StorageIoOperation::Write, { - let ((_file_guard, buf), result) = - io_engine::get().write_at(file_guard, offset, buf).await; + let ((_file_guard, buf), result) = engine.write_at(file_guard, offset, buf).await; if let Ok(size) = result { STORAGE_IO_SIZE .with_label_values(&[ @@ -1150,7 +1153,7 @@ mod tests { ) -> Result<(), Error> { match self { MaybeVirtualFile::VirtualFile(file) => { - let (_buf, res) = file.write_all_at(buf, offset).await; + let (_buf, res) = file.write_all_at(buf, offset, io_engine::get()).await; res } MaybeVirtualFile::File(file) => {