disk_clean.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package svc
  2. import (
  3. commonConfig "cicv-data-closedloop/kinglong/common/cfg"
  4. "cicv-data-closedloop/kinglong/common/global"
  5. "cicv-data-closedloop/kinglong/common/log"
  6. "cicv-data-closedloop/kinglong/common/util"
  7. masterConfig "cicv-data-closedloop/kinglong/master/pkg/cfg"
  8. "time"
  9. )
  10. // DiskClean 如果磁盘占用过高,则删除timeWindow和对应的文件
  11. func DiskClean() {
  12. log.GlobalLogger.Info("启动timeWindow清理goroutine,根据缓存策略清理copy目录。")
  13. for {
  14. time.Sleep(1000 * time.Millisecond)
  15. bags := util.ListAbsolutePathWithSuffixAndSort(commonConfig.CloudConfig.BagCopyDir, ".bag")
  16. if len(bags) == 0 {
  17. continue
  18. }
  19. // 1 获取磁盘占用
  20. percent := util.GetDiskUsagePercent()
  21. if percent > commonConfig.CloudConfig.DiskUsage {
  22. // 2 获取策略
  23. /*
  24. TTL(0, "删除旧数据");
  25. STOP(1, "停止缓存");
  26. LRU(2, "保留高优先级")
  27. */
  28. policy := commonConfig.PlatformConfig.TaskCachePolicy
  29. if policy == "TTL" {
  30. // 1 获取时间窗口队列中的第二个
  31. if len(global.TimeWindowConsumerQueue) > 2 {
  32. deleteTimeWindow(1)
  33. }
  34. } else if policy == "STOP" {
  35. // 2 获取时间窗口队列中的倒数第一个
  36. if len(global.TimeWindowConsumerQueue) > 2 {
  37. deleteTimeWindow(len(global.TimeWindowConsumerQueue) - 1)
  38. }
  39. } else if policy == "LRU" {
  40. // 3 获取优先级最低的时间窗口
  41. if len(global.TimeWindowConsumerQueue) > 2 {
  42. indexToRemove := getIndexToRemoveForLRU()
  43. if indexToRemove != -1 {
  44. deleteTimeWindow(indexToRemove)
  45. }
  46. }
  47. } else {
  48. log.GlobalLogger.Error("未知的缓存策略:", policy)
  49. }
  50. }
  51. }
  52. }
  53. func deleteTimeWindow(indexToRemove int) {
  54. timeWindowToRemove := global.TimeWindowConsumerQueue[indexToRemove]
  55. // 删除文件
  56. faultTime := timeWindowToRemove.FaultTime
  57. dir := util.GetCopyDir(faultTime)
  58. err := util.RemoveDir(dir)
  59. if err != nil {
  60. log.GlobalLogger.Error("删除目录", dir, "失败:", err)
  61. }
  62. global.TimeWindowConsumerQueueMutex.Lock()
  63. // 使用切片的特性删除指定位置的元素
  64. global.TimeWindowConsumerQueue = append(global.TimeWindowConsumerQueue[:indexToRemove], global.TimeWindowConsumerQueue[indexToRemove+1:]...)
  65. global.TimeWindowConsumerQueueMutex.Unlock()
  66. }
  67. func getIndexToRemoveForLRU() int {
  68. lru := commonConfig.PlatformConfig.Lru
  69. i := len(lru) - 1
  70. for i >= 0 {
  71. for i2, window := range global.TimeWindowConsumerQueue {
  72. if masterConfig.LabelMapTriggerId[window.FaultTime] == lru[i] {
  73. return i2
  74. }
  75. }
  76. }
  77. return -1
  78. }