From f7c1b28ae6c2578bf114f7ce348a4e304626a218 Mon Sep 17 00:00:00 2001 From: Evance Soumaoro Date: Wed, 4 Jan 2023 17:42:09 +0000 Subject: [PATCH] using O_DIRECT flag --- Cargo.toml | 1 + src/rolling/directory.rs | 38 ++++++++++++++++++++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c748e73..9f2a716 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ tokio = {version="1", features=["io-util", "macros", "rt-multi-thread", "fs", "i async-trait = "0.1" serde = {version= "1", features=["derive"]} serde_json = {version= "1"} +libc = "0.2.138" [dev-dependencies] tempfile = "3" diff --git a/src/rolling/directory.rs b/src/rolling/directory.rs index f557852..b7a5f8f 100644 --- a/src/rolling/directory.rs +++ b/src/rolling/directory.rs @@ -38,11 +38,20 @@ pub(crate) fn filepath(dir: &Path, file_number: &FileNumber) -> PathBuf { async fn create_file(dir_path: &Path, file_number: &FileNumber) -> io::Result { let new_filepath = filepath(dir_path, file_number); - let mut file = OpenOptions::new() - .create_new(true) - .write(true) - .open(&new_filepath) - .await?; + let mut file = if cfg!(target_os = "linux") { + OpenOptions::new() + .create_new(true) + .write(true) + .custom_flags(libc::O_DIRECT) + .open(&new_filepath) + .await? + } else { + OpenOptions::new() + .create_new(true) + .write(true) + .open(&new_filepath) + .await? + }; file.set_len(FILE_NUM_BYTES as u64).await?; file.seek(SeekFrom::Start(0)).await?; Ok(file) @@ -97,11 +106,20 @@ impl Directory { /// Open the wal file with the provided FileNumber. pub async fn open_file(&self, file_number: &FileNumber) -> io::Result { let filepath = filepath(&self.dir, file_number); - let mut file = OpenOptions::new() - .read(true) - .write(true) - .open(&filepath) - .await?; + let mut file = if cfg!(target_os = "linux") { + OpenOptions::new() + .read(true) + .write(true) + .custom_flags(libc::O_DIRECT) + .open(&filepath) + .await? + } else { + OpenOptions::new() + .read(true) + .write(true) + .open(&filepath) + .await? + }; file.seek(SeekFrom::Start(0u64)).await?; Ok(file) }