소스 검색

change file storage, fix #412

ffdfgdfg 5 년 전
부모
커밋
876d3ccc6f
1개의 변경된 파일17개의 추가작업 그리고 2개의 파일을 삭제
  1. 17 2
      lib/file/file.go

+ 17 - 2
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
 }