From cad5a22e7b68915505e3e00d0e4e11ffd0359f32 Mon Sep 17 00:00:00 2001 From: Ben C Date: Thu, 12 Mar 2026 20:04:44 -0400 Subject: [PATCH] Atomic saves --- src/main.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9ceee98..30c39c9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -110,13 +110,21 @@ fn load_brain(path: &Path) -> Result> { } async fn save_brain(ctx: Arc) -> Result { - // TODO: Atomic saves - let mut file = File::create(&ctx.brain_file_path).context("Failed to open brain file")?; + let scratch_path = ctx.brain_file_path.with_file_name(format!( + "~{}", + ctx.brain_file_path.file_name().unwrap().to_str().unwrap() + )); + let mut file = File::create(&scratch_path).context("Failed to open brain file")?; let mut brotli_writer = brotli::CompressorWriter::with_params(&mut file, BROTLI_BUF_SIZE, &get_brotli_params()); + let brain = ctx.brain_handle.read().await; rmp_serde::encode::write(&mut brotli_writer, &*brain) .context("Failed to write serialized brain")?; + + std::fs::rename(&scratch_path, &ctx.brain_file_path) + .context("Failed to override scratch file")?; + debug!("Saved brain file"); Ok(()) } -- 2.51.2