filecache: use rename for an atomic write (#1816)

Signed-off-by: Val Packett <val@packett.cool>
This commit is contained in:
Val Packett
2023-10-25 05:12:17 -03:00
committed by GitHub
parent 99c057bcb5
commit 6e61e20252

View File

@@ -69,12 +69,28 @@ func (fc *fileCache) Add(key Key, content io.Reader) (err error) {
fc.mux.Lock() fc.mux.Lock()
defer fc.mux.Unlock() 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 { if err != nil {
return return
} }
defer func() {
if err != nil {
_ = os.Remove(file.Name())
}
}()
defer file.Close() 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 return
} }