From 5684bd1da5e58fd00ee441076a24588444f3a469 Mon Sep 17 00:00:00 2001 From: phil Date: Thu, 7 May 2020 15:46:50 +0800 Subject: [PATCH] create file atomic --- cache.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/cache.go b/cache.go index ac52a71..004be1f 100644 --- a/cache.go +++ b/cache.go @@ -49,13 +49,22 @@ func (n *namespaceCache) dump(name string) error { dumps[namespace] = cache.dump() } - f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755) + tmp := name + "tmp" + f, err := os.OpenFile(tmp, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755) if err != nil { return err } - defer f.Close() - return gob.NewEncoder(f).Encode(&dumps) + if err := gob.NewEncoder(f).Encode(&dumps); err != nil { + _ = f.Close() + return err + } + + if err := f.Close(); err != nil { + return err + } + + return os.Rename(tmp, name) } func (n *namespaceCache) load(name string) error {