disk_clean.go 2.3 KB

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