From b022189fa5aecf35a7a56cda5c967215345bea53 Mon Sep 17 00:00:00 2001 From: reverse Date: Wed, 12 Aug 2026 15:57:43 +0000 Subject: [PATCH] core: write persisted snapshots atomically (temp + rename) so a crash mid-write can't leave a truncated reputation/metadata/xline file --- src/server.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/server.rs b/src/server.rs index 47c70de..be1ff47 100644 --- a/src/server.rs +++ b/src/server.rs @@ -515,7 +515,13 @@ impl Server { std::mem::take(&mut *map) // drain, releasing the lock before writing }; for (path, contents) in batch { - let _ = std::fs::write(path, contents); + // write a sibling temp then rename over the target: rename is + // atomic, so a crash mid-write can never leave a truncated + // snapshot — the file on disk is always a complete prior state. + let tmp = format!("{path}.tmp"); + if std::fs::write(&tmp, &contents).is_ok() { + let _ = std::fs::rename(&tmp, &path); + } } } });