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() { if !setting.ClearStrategy.Enabled{ return } tasks, err := models.GetCloudBrainOneStoppedJobDaysAgo(setting.ClearStrategy.ResultSaveDays, setting.ClearStrategy.BatchSize) 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 { log.Info("clear job in cloudbrain table:"+task.JobName) ids = append(ids, task.ID) } } err = models.UpdateCloudBrainRecordsCleared(ids) if err != nil { log.Warn("Failed to set cloudbrain cleared status", err) } //如果云脑表处理完了,通过遍历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() + "/" log.Info("clear job in minio trash:"+file.Name()) storage.Attachments.DeleteDir(dirPath) processCount++ if processCount == setting.ClearStrategy.BatchSize { break } } else { 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()) log.Info("clear job in local trash:"+file.Name()) processCount++ if processCount == setting.ClearStrategy.BatchSize { break } } 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 }