package svc import ( commonConfig "cicv-data-closedloop/kinglong/common/cfg" "cicv-data-closedloop/kinglong/common/global" "cicv-data-closedloop/kinglong/common/log" "cicv-data-closedloop/kinglong/common/util" masterConfig "cicv-data-closedloop/kinglong/master/pkg/cfg" "time" ) // DiskClean 如果磁盘占用过高,则删除timeWindow和对应的文件 func DiskClean() { log.GlobalLogger.Info("启动timeWindow清理goroutine,根据缓存策略清理copy目录。") for { time.Sleep(1000 * time.Millisecond) bags := util.ListAbsolutePathWithSuffixAndSort(commonConfig.CloudConfig.BagCopyDir, ".bag") if len(bags) == 0 { continue } // 1 获取磁盘占用 percent := util.GetDiskUsagePercent() if percent > commonConfig.CloudConfig.DiskUsage { // 2 获取策略 /* TTL(0, "删除旧数据"); STOP(1, "停止缓存"); LRU(2, "保留高优先级") */ policy := commonConfig.PlatformConfig.TaskCachePolicy if policy == "TTL" { // 1 获取时间窗口队列中的第二个 if len(global.TimeWindowConsumerQueue) > 2 { deleteTimeWindow(1) } } else if policy == "STOP" { // 2 获取时间窗口队列中的倒数第一个 if len(global.TimeWindowConsumerQueue) > 2 { deleteTimeWindow(len(global.TimeWindowConsumerQueue) - 1) } } else if policy == "LRU" { // 3 获取优先级最低的时间窗口 if len(global.TimeWindowConsumerQueue) > 2 { indexToRemove := getIndexToRemoveForLRU() if indexToRemove != -1 { deleteTimeWindow(indexToRemove) } } } else { log.GlobalLogger.Error("未知的缓存策略:", policy) } } } } func deleteTimeWindow(indexToRemove int) { timeWindowToRemove := global.TimeWindowConsumerQueue[indexToRemove] // 删除文件 faultTime := timeWindowToRemove.FaultTime dir := util.GetCopyDir(faultTime) err := util.RemoveDir(dir) if err != nil { log.GlobalLogger.Error("删除目录", dir, "失败:", err) } global.TimeWindowConsumerQueueMutex.Lock() // 使用切片的特性删除指定位置的元素 global.TimeWindowConsumerQueue = append(global.TimeWindowConsumerQueue[:indexToRemove], global.TimeWindowConsumerQueue[indexToRemove+1:]...) global.TimeWindowConsumerQueueMutex.Unlock() } func getIndexToRemoveForLRU() int { lru := commonConfig.PlatformConfig.Lru i := len(lru) - 1 for i >= 0 { for i2, window := range global.TimeWindowConsumerQueue { if masterConfig.LabelMapTriggerId[window.FaultTime] == lru[i] { return i2 } } } return -1 }