From df28e7afa047db627a8e073a201ea19d5a6e3435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arpad=20M=C3=BCller?= Date: Thu, 31 Aug 2023 14:49:07 +0200 Subject: [PATCH] Use write_and_fsync in save_metadata --- pageserver/src/tenant/metadata.rs | 9 +++------ pageserver/src/virtual_file.rs | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/pageserver/src/tenant/metadata.rs b/pageserver/src/tenant/metadata.rs index 6a4e4487aa..60dc32eb9d 100644 --- a/pageserver/src/tenant/metadata.rs +++ b/pageserver/src/tenant/metadata.rs @@ -9,9 +9,9 @@ //! [`remote_timeline_client`]: super::remote_timeline_client use std::fs::{File, OpenOptions}; -use std::io::{self, Write}; +use std::io; -use anyhow::{bail, ensure, Context}; +use anyhow::{ensure, Context}; use serde::{de::Error, Deserialize, Serialize, Serializer}; use thiserror::Error; use tracing::info_span; @@ -273,10 +273,7 @@ pub async fn save_metadata( let metadata_bytes = data.to_bytes().context("Failed to get metadata bytes")?; - if file.write(&metadata_bytes)? != metadata_bytes.len() { - bail!("Could not write all the metadata bytes in a single call"); - } - file.sync_all()?; + file.write_and_fsync(&metadata_bytes)?; // fsync the parent directory to ensure the directory entry is durable if first_save { diff --git a/pageserver/src/virtual_file.rs b/pageserver/src/virtual_file.rs index 5f3f7a5fef..4afbe97469 100644 --- a/pageserver/src/virtual_file.rs +++ b/pageserver/src/virtual_file.rs @@ -392,7 +392,7 @@ impl VirtualFile { /// 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> { + pub fn write_and_fsync(&mut self, buf: &[u8]) -> Result<(), Error> { if self.write(buf)? != buf.len() { return Err(Error::new( std::io::ErrorKind::Other,