From fe69dd9a4035ac8b9972edc44d9c859877f45b83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arpad=20M=C3=BCller?= Date: Thu, 31 Aug 2023 12:34:50 +0200 Subject: [PATCH] Add write_and_fsync function --- pageserver/src/virtual_file.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pageserver/src/virtual_file.rs b/pageserver/src/virtual_file.rs index 65d769e8e7..5f3f7a5fef 100644 --- a/pageserver/src/virtual_file.rs +++ b/pageserver/src/virtual_file.rs @@ -389,6 +389,20 @@ impl VirtualFile { Ok(()) } + /// Write the given buffer (which has to be below the kernel's internal page size) and fsync + /// + /// This ensures some level of atomicity (not a good one, but it's the best we have). + pub async fn write_and_fsync(&mut self, buf: &[u8]) -> Result<(), Error> { + if self.write(buf)? != buf.len() { + return Err(Error::new( + std::io::ErrorKind::Other, + "Could not write all the bytes in a single call", + )); + } + self.sync_all()?; + Ok(()) + } + pub fn read_at(&self, buf: &mut [u8], offset: u64) -> Result { let result = self.with_file("read", |file| file.read_at(buf, offset))?; if let Ok(size) = result {