refactor(VirtualFile): add its own OpenOptions wrapper

This is prep work for integrating support for runtime-configurable
io engines (=> tokio-epoll-uring).
This commit is contained in:
Christian Schwarz
2024-01-11 18:43:35 +00:00
parent a0a3ba85e7
commit 9b2eb095f5
6 changed files with 94 additions and 16 deletions

View File

@@ -11,18 +11,23 @@
//! src/backend/storage/file/fd.c
//!
use crate::metrics::{StorageIoOperation, STORAGE_IO_SIZE, STORAGE_IO_TIME_METRIC};
use crate::tenant::TENANTS_SEGMENT_NAME;
use camino::{Utf8Path, Utf8PathBuf};
use once_cell::sync::OnceCell;
use pageserver_api::shard::TenantShardId;
use std::fs::{self, File, OpenOptions};
use std::fs::{self, File};
use std::io::{Error, ErrorKind, Seek, SeekFrom};
use std::os::unix::fs::FileExt;
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
use tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard};
use tokio::time::Instant;
use utils::fs_ext;
mod open_options;
pub(crate) use open_options::*;
///
/// 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,
@@ -326,7 +331,10 @@ impl VirtualFile {
// NB: there is also StorageIoOperation::OpenAfterReplace which is for the case
// where our caller doesn't get to use the returned VirtualFile before its
// slot gets re-used by someone else.
let file = observe_duration!(StorageIoOperation::Open, open_options.open(path))?;
let file = observe_duration!(
StorageIoOperation::Open,
open_options.open(path.as_std_path()).await
)?;
// Strip all options other than read and write.
//
@@ -460,7 +468,7 @@ impl VirtualFile {
// of the virtual file descriptor cache.
let file = observe_duration!(
StorageIoOperation::OpenAfterReplace,
self.open_options.open(&self.path)
self.open_options.open(self.path.as_std_path()).await
)?;
// Store the File in the slot and update the handle in the VirtualFile
@@ -822,7 +830,9 @@ mod tests {
#[tokio::test]
async fn test_physical_files() -> Result<(), Error> {
test_files("physical_files", |path, open_options| async move {
Ok(MaybeVirtualFile::File(open_options.open(path)?))
Ok(MaybeVirtualFile::File(
open_options.open(path.as_std_path()).await?,
))
})
.await
}