You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

clear.go 3.0 kB

3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package cloudbrain
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "sort"
  6. "time"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/log"
  9. "code.gitea.io/gitea/modules/setting"
  10. "code.gitea.io/gitea/modules/storage"
  11. )
  12. func ClearCloudbrainResultSpace() {
  13. tasks, err := models.GetCloudBrainOneStoppedJobDaysAgo(setting.ClearStrategy.ResultSaveDays, setting.ClearStrategy.ResultBatchSize)
  14. if err != nil {
  15. log.Warn("Failed to get cloudbrain, clear result failed.", err)
  16. return
  17. }
  18. var ids []int64
  19. for _, task := range tasks {
  20. err := DeleteCloudbrainOneJobStorage(task.JobName)
  21. if err == nil {
  22. ids = append(ids, task.ID)
  23. }
  24. }
  25. err = models.UpdateCloudBrainRecordsCleared(ids)
  26. if err != nil {
  27. log.Warn("Failed to set cloudbrain cleared status", err)
  28. }
  29. if len(tasks) < setting.ClearStrategy.ResultBatchSize { //如果云脑表处理完了,通过遍历minio对象处理历史垃圾数据,如果存在
  30. files, err := ioutil.ReadDir(setting.JobPath)
  31. processCount:=0
  32. if err != nil {
  33. log.Warn("Can not browser local job path.")
  34. } else {
  35. SortModTimeAscend(files)
  36. for _, file := range files {
  37. //清理n天前的历史垃圾数据,清理job目录
  38. if file.ModTime().Before(time.Now().AddDate(0, 0, -setting.ClearStrategy.TrashSaveDays)) {
  39. os.RemoveAll(setting.JobPath + file.Name())
  40. processCount++
  41. }
  42. if processCount==setting.ClearStrategy.ResultBatchSize{
  43. break
  44. }
  45. }
  46. }
  47. minioFiles, err := storage.GetAllObjectByBucketAndPrefixMinio(setting.Attachment.Minio.Bucket, setting.CBCodePathPrefix)
  48. processCount=0
  49. if err != nil {
  50. log.Warn("Can not browser minio job path.")
  51. } else {
  52. SortModTimeAscendForMinio(minioFiles)
  53. for _, file := range minioFiles {
  54. timeConvert, err := time.Parse("2006-01-02 15:04:05", file.ModTime)
  55. if err == nil && timeConvert.Before(time.Now().AddDate(0, 0, -setting.ClearStrategy.TrashSaveDays)) {
  56. dirPath := setting.CBCodePathPrefix + file.FileName + "/"
  57. log.Info(dirPath)
  58. storage.Attachments.DeleteDir(dirPath)
  59. processCount++
  60. if processCount==setting.ClearStrategy.ResultBatchSize{
  61. break
  62. }
  63. }
  64. }
  65. }
  66. }
  67. }
  68. func SortModTimeAscend(files []os.FileInfo) {
  69. sort.Slice(files, func(i, j int) bool {
  70. return files[i].ModTime().Before(files[j].ModTime())
  71. })
  72. }
  73. func SortModTimeAscendForMinio(files []storage.FileInfo) {
  74. sort.Slice(files, func(i, j int) bool {
  75. timeI, _ := time.Parse("2006-01-02 15:04:05", files[i].ModTime)
  76. timeJ, _ := time.Parse("2006-01-02 15:04:05", files[i].ModTime)
  77. return timeI.Before(timeJ)
  78. })
  79. }
  80. func DeleteCloudbrainOneJobStorage(jobName string) error {
  81. //delete local
  82. localJobPath := setting.JobPath + jobName
  83. err := os.RemoveAll(localJobPath)
  84. if err != nil {
  85. log.Error("RemoveAll(%s) failed:%v", localJobPath, err)
  86. }
  87. dirPath := setting.CBCodePathPrefix + jobName + "/"
  88. err1 := storage.Attachments.DeleteDir(dirPath)
  89. if err1 != nil {
  90. log.Error("DeleteDir(%s) failed:%v", localJobPath, err)
  91. }
  92. if err == nil {
  93. err = err1
  94. }
  95. return err
  96. }