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.3 kB

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