|
@@ -505,27 +505,75 @@ func SendUdpMsg(data map[string]interface{}, target *net.UDPAddr) {
|
|
|
//
|
|
|
//}
|
|
|
|
|
|
+// saveDb 文件写入
|
|
|
+//func saveDb() {
|
|
|
+// mutex.Lock()
|
|
|
+// defer mutex.Unlock()
|
|
|
+// // 如果 cache 为空,则无需执行写入操作
|
|
|
+// if cache == nil {
|
|
|
+// log.Error("saveDb", zap.Any("cache", "为空"))
|
|
|
+// }
|
|
|
+//
|
|
|
+// if cache.GetCardinality() > 0 {
|
|
|
+// fo, err := os.OpenFile(*dbfile, os.O_CREATE|os.O_RDWR|os.O_SYNC|os.O_TRUNC, 0777)
|
|
|
+// if err != nil {
|
|
|
+// log.Info("saveDb", zap.Error(err))
|
|
|
+// }
|
|
|
+//
|
|
|
+// defer fo.Close()
|
|
|
+// _, err = cache.WriteTo(fo)
|
|
|
+// if err != nil {
|
|
|
+// log.Info("saveDb", zap.Any("cache.WriteTo", err))
|
|
|
+// }
|
|
|
+// }
|
|
|
+//}
|
|
|
+
|
|
|
// saveDb 文件写入
|
|
|
func saveDb() {
|
|
|
mutex.Lock()
|
|
|
defer mutex.Unlock()
|
|
|
- // 如果 cache 为空,则无需执行写入操作
|
|
|
+
|
|
|
if cache == nil {
|
|
|
- log.Error("saveDb", zap.Any("cache", "为空"))
|
|
|
+ log.Error("saveDb", zap.String("cache", "为空"))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if cache.GetCardinality() == 0 {
|
|
|
+ log.Info("saveDb", zap.String("提示", "cache 为空,未保存"))
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
- if cache.GetCardinality() > 0 {
|
|
|
- fo, err := os.OpenFile(*dbfile, os.O_CREATE|os.O_RDWR|os.O_SYNC|os.O_TRUNC, 0777)
|
|
|
- if err != nil {
|
|
|
- log.Info("saveDb", zap.Error(err))
|
|
|
- }
|
|
|
+ tmpFile := *dbfile + ".tmp"
|
|
|
+ bakFile := *dbfile + ".bak"
|
|
|
+
|
|
|
+ // 1. 写入临时文件
|
|
|
+ tmp, err := os.OpenFile(tmpFile, os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0666)
|
|
|
+ if err != nil {
|
|
|
+ log.Error("saveDb", zap.String("创建 tmp 文件失败", tmpFile), zap.Error(err))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ _, err = cache.WriteTo(tmp)
|
|
|
+ tmp.Close()
|
|
|
+ if err != nil {
|
|
|
+ log.Error("saveDb", zap.String("写入 tmp 文件失败", tmpFile), zap.Error(err))
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- defer fo.Close()
|
|
|
- _, err = cache.WriteTo(fo)
|
|
|
+ // 2. 原文件备份(.bak)
|
|
|
+ if _, err := os.Stat(*dbfile); err == nil {
|
|
|
+ err = os.Rename(*dbfile, bakFile)
|
|
|
if err != nil {
|
|
|
- log.Info("saveDb", zap.Any("cache.WriteTo", err))
|
|
|
+ log.Warn("备份失败", zap.String("源文件", *dbfile), zap.Error(err))
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ // 3. 原子替换新文件
|
|
|
+ err = os.Rename(tmpFile, *dbfile)
|
|
|
+ if err != nil {
|
|
|
+ log.Error("saveDb", zap.String("tmp 替换 dbfile 失败", ""), zap.Error(err))
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ log.Info("saveDb", zap.String("状态", "写入成功,主文件已更新"))
|
|
|
}
|
|
|
|
|
|
// getNewName 获取新的不重复名称
|