From 876d3ccc6fc2cbfb76e751a2f795bf68b4decdc6 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Tue, 18 Feb 2020 19:45:11 +0800 Subject: [PATCH] change file storage, fix #412 --- lib/file/file.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/file/file.go b/lib/file/file.go index 9e28e95..0bcf61c 100644 --- a/lib/file/file.go +++ b/lib/file/file.go @@ -99,16 +99,28 @@ func (s *JsonDb) GetClient(id int) (c *Client, err error) { return } +var hostLock sync.Mutex + func (s *JsonDb) StoreHostToJsonFile() { + hostLock.Lock() storeSyncMapToFile(s.Hosts, s.HostFilePath) + hostLock.Unlock() } +var taskLock sync.Mutex + func (s *JsonDb) StoreTasksToJsonFile() { + taskLock.Lock() storeSyncMapToFile(s.Tasks, s.TaskFilePath) + taskLock.Unlock() } +var clientLock sync.Mutex + func (s *JsonDb) StoreClientsToJsonFile() { + clientLock.Lock() storeSyncMapToFile(s.Clients, s.ClientFilePath) + clientLock.Unlock() } func (s *JsonDb) GetClientId() int32 { @@ -134,7 +146,8 @@ func loadSyncMapFromFile(filePath string, f func(value string)) { } func storeSyncMapToFile(m sync.Map, filePath string) { - file, err := os.Create(filePath) + file, err := os.Create(filePath + ".tmp") + // first create a temporary file to store if err != nil { panic(err) } @@ -177,5 +190,7 @@ func storeSyncMapToFile(m sync.Map, filePath string) { } return true }) - file.Sync() + _ = file.Sync() + err = os.Rename(filePath+".tmp", filePath) + // replace the file, maybe provides atomic operation }