Prechádzať zdrojové kódy

feat: 确保不会删除全部备份文件 (#85)

jeessy2 2 rokov pred
rodič
commit
4e050c288b

+ 2 - 2
client/delete_old_file.go

@@ -50,7 +50,7 @@ func deleteLocalOlderFiles(backupConf entity.BackupConfig) {
 		backupFileNames = append(backupFileNames, backupFile.Name())
 	}
 
-	tobeDeleteFiles := util.FileNameBeforeDays(backupConf.SaveDays, backupFileNames)
+	tobeDeleteFiles := util.FileNameBeforeDays(backupConf.SaveDays, backupFileNames, backupConf.ProjectName)
 
 	for i := 0; i < len(tobeDeleteFiles); i++ {
 		err := os.Remove(backupConf.GetProjectPath() + string(os.PathSeparator) + tobeDeleteFiles[i])
@@ -76,7 +76,7 @@ func deleteS3OlderFiles(s3Conf entity.S3Config, backupConf entity.BackupConfig)
 		log.Printf("读取项目 %s 的对象存储目录失败! ERR: %s\n", backupConf.ProjectName, err)
 	}
 
-	tobeDeleteFiles := util.FileNameBeforeDays(backupConf.SaveDaysS3, fileNames)
+	tobeDeleteFiles := util.FileNameBeforeDays(backupConf.SaveDaysS3, fileNames, backupConf.ProjectName)
 
 	for i := 0; i < len(tobeDeleteFiles); i++ {
 		err := s3Conf.DeleteFile(tobeDeleteFiles[i])

+ 7 - 1
util/file_name_util.go

@@ -1,6 +1,7 @@
 package util
 
 import (
+	"log"
 	"regexp"
 	"strconv"
 	"time"
@@ -9,7 +10,7 @@ import (
 const FileNameFormatStr = "2006-01-02-15-04"
 
 // FileNameBeforeDays 查找文件名中有多少在指定天数之前的
-func FileNameBeforeDays(days int, fileNames []string) []string {
+func FileNameBeforeDays(days int, fileNames []string, projectName string) []string {
 	oldFiles := make([]string, 0)
 	// 2006-01-02-15-04
 	fileRegxp := regexp.MustCompile(`([\d]{4})-([\d]{2})-([\d]{2})-([\d]{2})-([\d]{2})`)
@@ -24,5 +25,10 @@ func FileNameBeforeDays(days int, fileNames []string) []string {
 		}
 
 	}
+	// 待删除的过期文件为所有的文件,将不会进行删除
+	if len(oldFiles)-len(fileNames) >= 0 {
+		log.Printf("项目 %s 待删除的过期文件为所有的文件,将不会进行删除!\n", projectName)
+		return []string{}
+	}
 	return oldFiles
 }

+ 20 - 2
util/file_name_util_test.go

@@ -6,7 +6,7 @@ import (
 	"time"
 )
 
-// TestFileNameUtil
+// TestFileNameUtil 测试正常情况
 func TestFileNameUtil(t *testing.T) {
 	const days = 10
 	beforeTomorrow, _ := time.ParseDuration("-" + strconv.Itoa((days+1)*24) + "h")
@@ -14,8 +14,26 @@ func TestFileNameUtil(t *testing.T) {
 		"a2020-10-10-11-12b.sql",
 		"测试2021-10-10-11-12测试.sql",
 		time.Now().Add(beforeTomorrow).Format(FileNameFormatStr) + ".sql",
+		time.Now().Format(FileNameFormatStr) + ".sql",
 	}
-	if len(fileNames) != len(FileNameBeforeDays(10, fileNames)) {
+	deleteFiles := FileNameBeforeDays(days, fileNames, "test")
+	// 只有一个不会被删除,需要+1
+	if len(fileNames) != len(deleteFiles)+1 {
 		t.Error("TestFileNameUtil Test failed!")
 	}
 }
+
+// TestFileNameUtilAll 测试全部删除
+func TestFileNameUtilAll(t *testing.T) {
+	const days = 10
+	beforeTomorrow, _ := time.ParseDuration("-" + strconv.Itoa((days+1)*24) + "h")
+	fileNames := []string{
+		"a2020-10-10-11-12b.sql",
+		"测试2021-10-10-11-12测试.sql",
+		time.Now().Add(beforeTomorrow).Format(FileNameFormatStr) + ".sql",
+	}
+	deleteFiles := FileNameBeforeDays(days, fileNames, "test")
+	if len(deleteFiles) != 0 {
+		t.Error("TestFileNameUtilAll Test failed!")
+	}
+}