package cloudbrain import ( "io/ioutil" "os" "sort" "time" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/storage" ) func ClearCloudbrainResultSpace() { tasks, err := models.GetCloudBrainOneStoppedJobDaysAgo(setting.ResultSaveDays, setting.ResultBatchSize) if err != nil { log.Warn("Failed to get cloudbrain, clear result failed.", err) return } var ids []int64 for _, task := range tasks { err := DeleteCloudbrainOneJobStorage(task.JobName) if err == nil { ids = append(ids, task.ID) } } err = models.UpdateCloudBrainRecordsCleared(ids) if err != nil { log.Warn("Failed to set cloudbrain cleared status", err) } if len(tasks) < setting.ResultBatchSize { //云脑表处理完了,处理历史垃圾数据,如果存在 files, err := ioutil.ReadDir(setting.JobPath) if err != nil { log.Warn("Can not browser local job path.") } else { SortModTimeAscend(files) for _, file := range files { //清理4个月前的任务 if file.ModTime().Before(time.Now().AddDate(0, -4, 0)) { //os.RemoveAll(setting.JobPath + file.Name()) } else { break } } } minioFiles, err := storage.GetAllObjectByBucketAndPrefixMinio(setting.Attachment.Minio.Bucket, setting.CBCodePathPrefix) if err != nil { log.Warn("Can not browser minio job path.") } else { SortModTimeAscendForMinio(minioFiles) for _, file := range minioFiles { //清理4个月前的任务 timeConvert, err := time.Parse("2006-01-02 15:04:05", file.ModTime) if err == nil && timeConvert.Before(time.Now().AddDate(0, -4, 0)) { dirPath := setting.CBCodePathPrefix + file.FileName + "/" log.Info(dirPath) //storage.Attachments.DeleteDir(dirPath) } else { break } } } } } func SortModTimeAscend(files []os.FileInfo) { sort.Slice(files, func(i, j int) bool { return files[i].ModTime().Before(files[j].ModTime()) }) } func SortModTimeAscendForMinio(files []storage.FileInfo) { sort.Slice(files, func(i, j int) bool { timeI, _ := time.Parse("2006-01-02 15:04:05", files[i].ModTime) timeJ, _ := time.Parse("2006-01-02 15:04:05", files[i].ModTime) return timeI.Before(timeJ) }) } func DeleteCloudbrainOneJobStorage(jobName string) error { //delete local localJobPath := setting.JobPath + jobName err := os.RemoveAll(localJobPath) if err != nil { log.Error("RemoveAll(%s) failed:%v", localJobPath, err) } dirPath := setting.CBCodePathPrefix + jobName + "/" err1 := storage.Attachments.DeleteDir(dirPath) if err1 != nil { log.Error("DeleteDir(%s) failed:%v", localJobPath, err) } if err == nil { err = err1 } return err }