From 6e61e20252698af847d12a1b72be5e3924ca6673 Mon Sep 17 00:00:00 2001 From: Val Packett Date: Wed, 25 Oct 2023 05:12:17 -0300 Subject: [PATCH] filecache: use rename for an atomic write (#1816) Signed-off-by: Val Packett --- internal/filecache/file_cache.go | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/internal/filecache/file_cache.go b/internal/filecache/file_cache.go index a3030588..4898c710 100644 --- a/internal/filecache/file_cache.go +++ b/internal/filecache/file_cache.go @@ -69,12 +69,28 @@ func (fc *fileCache) Add(key Key, content io.Reader) (err error) { fc.mux.Lock() defer fc.mux.Unlock() - file, err := os.Create(fc.path(key)) + // Use rename for an atomic write + path := fc.path(key) + file, err := os.Create(path + ".tmp") if err != nil { return } + defer func() { + if err != nil { + _ = os.Remove(file.Name()) + } + }() defer file.Close() - _, err = io.Copy(file, content) + if _, err = io.Copy(file, content); err != nil { + return + } + if err = file.Sync(); err != nil { + return + } + if err = file.Close(); err != nil { + return + } + err = os.Rename(file.Name(), path) return }