From b3d9cc156a23d78ac8278a251e6e06894c750747 Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Fri, 25 Jul 2025 17:21:35 +0800 Subject: [PATCH] fix: Optimize filename generation for directory backup (#9669) Refs #9433 --- agent/app/service/cronjob.go | 1 + agent/app/service/cronjob_backup.go | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/agent/app/service/cronjob.go b/agent/app/service/cronjob.go index cb55343ce..4d5497aab 100644 --- a/agent/app/service/cronjob.go +++ b/agent/app/service/cronjob.go @@ -629,6 +629,7 @@ func (u *CronjobService) Update(id uint, req dto.CronjobOperate) error { upMap["db_type"] = req.DBType upMap["db_name"] = req.DBName upMap["url"] = req.URL + upMap["is_dir"] = req.IsDir upMap["source_dir"] = req.SourceDir upMap["snapshot_rule"] = cronjob.SnapshotRule diff --git a/agent/app/service/cronjob_backup.go b/agent/app/service/cronjob_backup.go index c5765681f..495efd7c4 100644 --- a/agent/app/service/cronjob_backup.go +++ b/agent/app/service/cronjob_backup.go @@ -6,6 +6,7 @@ import ( "fmt" "os" "path" + "path/filepath" "strconv" "strings" "time" @@ -199,7 +200,10 @@ func (u *CronjobService) handleDirectory(cronjob model.Cronjob, startTime time.T if err != nil { return err } - fileName := fmt.Sprintf("%s.tar.gz", startTime.Format(constant.DateTimeSlimLayout)+common.RandStrAndNum(5)) + fileName := fmt.Sprintf("%s.tar.gz", startTime.Format(constant.DateTimeSlimLayout)+common.RandStrAndNum(2)) + if cronjob.IsDir || len(strings.Split(cronjob.SourceDir, ",")) == 1 { + fileName = loadFileName(cronjob.SourceDir) + } backupDir := path.Join(global.Dir.LocalBackupDir, fmt.Sprintf("tmp/%s/%s", cronjob.Type, cronjob.Name)) fileOp := files.NewFileOp() @@ -548,3 +552,14 @@ func loadSnapWithRule(cronjob model.Cronjob) (dto.SnapshotData, error) { } return itemData, nil } + +func loadFileName(src string) string { + dirs := strings.Split(filepath.ToSlash(src), "/") + var keyPart string + if len(dirs) >= 3 { + keyPart = filepath.Join(dirs[len(dirs)-3], dirs[len(dirs)-2], dirs[len(dirs)-1]) + } + cleanName := strings.ReplaceAll(keyPart, string(filepath.Separator), "_") + timestamp := time.Now().Format(constant.DateTimeSlimLayout) + return fmt.Sprintf("%s_%s_%s.tar.gz", cleanName, timestamp, common.RandStrAndNum(2)) +}