diff --git a/models/cloudbrain.go b/models/cloudbrain.go index abb804eef..2de66a834 100755 --- a/models/cloudbrain.go +++ b/models/cloudbrain.go @@ -204,6 +204,7 @@ type Cloudbrain struct { BenchmarkTypeRankLink string `xorm:"-"` StartTime timeutil.TimeStamp EndTime timeutil.TimeStamp + Cleared bool `xorm:"DEFAULT false"` Spec *Specification `xorm:"-"` } @@ -2081,7 +2082,8 @@ func UpdateCloudBrainRecordsCleared(ids []int64) error { idsIn += "," + strconv.FormatInt(id, 10) } } - _, errTemp := x.Exec("update cloudbrain set cleared=true where id in (?)", ids) + + _, errTemp := x.Unscoped().Exec("update cloudbrain set cleared=true where id in (" + idsIn + ")") if errTemp != nil { err = errTemp } diff --git a/modules/setting/setting.go b/modules/setting/setting.go index b5ec488a8..8815c6dcf 100755 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -617,10 +617,10 @@ var ( ClearStrategy= struct { Enabled bool ResultSaveDays int - ResultBatchSize int BatchSize int TrashSaveDays int Cron string + RunAtStart bool }{} C2NetInfos *C2NetSqInfos @@ -1629,6 +1629,7 @@ func NewContext() { getModelConvertConfig() getModelSafetyConfig() getModelAppConfig() + getClearStrategy() } func getModelSafetyConfig() { @@ -1697,6 +1698,7 @@ func getClearStrategy(){ ClearStrategy.BatchSize=sec.Key("BATCH_SIZE").MustInt(500) ClearStrategy.TrashSaveDays=sec.Key("TRASH_SAVE_DAYS").MustInt(90) ClearStrategy.Cron=sec.Key("CRON").MustString("* 0,30 2-8 * * ? *") + ClearStrategy.RunAtStart=sec.Key("RUN_AT_START").MustBool(false) } func getGrampusConfig() { diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 647bdb1ad..1ac1a0bd7 100755 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -3246,6 +3246,7 @@ specification = specification select_specification = select specification description = description wrong_specification=You cannot use this specification, please choose another item. +result_cleared=The files of the task have been cleared, can not restart any more, please create a new debug task instead. resource_use=Resource Occupancy job_name_rule = Please enter letters, numbers, _ and - up to 64 characters and cannot end with a dash (-). diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 8f9e6b664..792981c86 100755 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -3266,6 +3266,8 @@ card_duration = 运行卡时 card_type = 卡类型 wrong_specification=您目前不能使用这个资源规格,请选择其他资源规格。 +result_cleared=本任务的文件已被清理,无法再次调试,请新建调试任务。 + job_name_rule = 请输入字母、数字、_和-,最长64个字符,且不能以中划线(-)结尾。 train_dataset_path_rule = 数据集位置存储在运行参数 data_url 中,预训练模型存放在运行参数 ckpt_url 中,训练输出路径存储在运行参数 train_url 中。 infer_dataset_path_rule = 数据集位置存储在运行参数 data_url 中,推理输出路径存储在运行参数 result_url 中。 diff --git a/routers/repo/cloudbrain.go b/routers/repo/cloudbrain.go index d3d76f440..a23cd5462 100755 --- a/routers/repo/cloudbrain.go +++ b/routers/repo/cloudbrain.go @@ -670,6 +670,13 @@ func CloudBrainRestart(ctx *context.Context) { break } + if _, err := os.Stat(getOldJobPath(task)); err != nil { + log.Error("Can not find job minio path", err) + resultCode = "-1" + errorMsg = ctx.Tr("cloudbrain.result_cleared") + break + } + count, err := cloudbrainTask.GetNotFinalStatusTaskCount(ctx.User.ID, models.TypeCloudBrainOne, string(models.JobTypeDebug)) if err != nil { log.Error("GetCloudbrainCountByUserID failed:%v", err, ctx.Data["MsgID"]) @@ -704,6 +711,11 @@ func CloudBrainRestart(ctx *context.Context) { }) } + +func getOldJobPath(task *models.Cloudbrain) string { + return setting.Attachment.Minio.RealPath + setting.Attachment.Minio.Bucket + "/" + setting.CBCodePathPrefix + task.JobName +} + func CloudBrainBenchMarkShow(ctx *context.Context) { cloudBrainShow(ctx, tplCloudBrainBenchmarkShow, models.JobTypeBenchmark) } diff --git a/services/cloudbrain/clear.go b/services/cloudbrain/clear.go index f8dfae30e..2cefb8341 100644 --- a/services/cloudbrain/clear.go +++ b/services/cloudbrain/clear.go @@ -13,8 +13,11 @@ import ( ) func ClearCloudbrainResultSpace() { + if !setting.ClearStrategy.Enabled{ + return + } - tasks, err := models.GetCloudBrainOneStoppedJobDaysAgo(setting.ClearStrategy.ResultSaveDays, setting.ClearStrategy.ResultBatchSize) + tasks, err := models.GetCloudBrainOneStoppedJobDaysAgo(setting.ClearStrategy.ResultSaveDays, setting.ClearStrategy.BatchSize) if err != nil { log.Warn("Failed to get cloudbrain, clear result failed.", err) @@ -32,44 +35,60 @@ func ClearCloudbrainResultSpace() { if err != nil { log.Warn("Failed to set cloudbrain cleared status", err) } - if len(tasks) < setting.ClearStrategy.ResultBatchSize { //如果云脑表处理完了,通过遍历minio对象处理历史垃圾数据,如果存在 - files, err := ioutil.ReadDir(setting.JobPath) - processCount:=0 - if err != nil { - log.Warn("Can not browser local job path.") - } else { - SortModTimeAscend(files) - for _, file := range files { - //清理n天前的历史垃圾数据,清理job目录 - if file.ModTime().Before(time.Now().AddDate(0, 0, -setting.ClearStrategy.TrashSaveDays)) { - os.RemoveAll(setting.JobPath + file.Name()) - processCount++ - } - if processCount==setting.ClearStrategy.ResultBatchSize{ + //如果云脑表处理完了,通过遍历minio对象处理历史垃圾数据,如果存在的话 + if len(tasks) < setting.ClearStrategy.BatchSize { + clearLocalHistoryTrashFile() + clearMinioHistoryTrashFile() + + } + +} + +func clearMinioHistoryTrashFile() { + JobRealPrefix := setting.Attachment.Minio.RealPath + setting.Attachment.Minio.Bucket + "/" + setting.CBCodePathPrefix + + miniofiles, err := ioutil.ReadDir(JobRealPrefix) + + processCount := 0 + if err != nil { + log.Warn("Can not browser minio job path.") + } else { + SortModTimeAscend(miniofiles) + for _, file := range miniofiles { + + if file.ModTime().Before(time.Now().AddDate(0, 0, -setting.ClearStrategy.TrashSaveDays)) { + dirPath := setting.CBCodePathPrefix + file.Name() + "/" + storage.Attachments.DeleteDir(dirPath) + processCount++ + if processCount == setting.ClearStrategy.BatchSize { break } + } else { + break } } - minioFiles, err := storage.GetAllObjectByBucketAndPrefixMinio(setting.Attachment.Minio.Bucket, setting.CBCodePathPrefix) - processCount=0 - if err != nil { - log.Warn("Can not browser minio job path.") - } else { - SortModTimeAscendForMinio(minioFiles) - for _, file := range minioFiles { - - timeConvert, err := time.Parse("2006-01-02 15:04:05", file.ModTime) - if err == nil && timeConvert.Before(time.Now().AddDate(0, 0, -setting.ClearStrategy.TrashSaveDays)) { - dirPath := setting.CBCodePathPrefix + file.FileName + "/" - log.Info(dirPath) - storage.Attachments.DeleteDir(dirPath) - processCount++ - if processCount==setting.ClearStrategy.ResultBatchSize{ - break - } + } +} + +func clearLocalHistoryTrashFile() { + files, err := ioutil.ReadDir(setting.JobPath) + processCount := 0 + if err != nil { + log.Warn("Can not browser local job path.") + } else { + SortModTimeAscend(files) + for _, file := range files { + //清理n天前的历史垃圾数据,清理job目录 + if file.ModTime().Before(time.Now().AddDate(0, 0, -setting.ClearStrategy.TrashSaveDays)) { + os.RemoveAll(setting.JobPath + file.Name()) + processCount++ + if processCount == setting.ClearStrategy.BatchSize { + break } + } else { + break } }