disk_clean.go 2.6 KB

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