Some checks failed
PR Check / check-and-test (pull_request) Failing after 2m11s
- Added Prometheus client library for metrics collection. - Refactored garbage collection strategy from random deletion to LRU (Least Recently Used) deletion. - Introduced per-key locking in cache to prevent race conditions. - Enhanced logging with structured log messages for cache hits and misses. - Implemented a retry mechanism for upstream requests with exponential backoff. - Updated Go modules and indirect dependencies for better compatibility and performance. - Removed unused sync filesystem implementation. - Added version initialization to ensure a default version string.
45 lines
957 B
Go
45 lines
957 B
Go
package steamcache
|
|
|
|
import (
|
|
"runtime/debug"
|
|
"s1d3sw1ped/SteamCache2/vfs"
|
|
"s1d3sw1ped/SteamCache2/vfs/cachestate"
|
|
"sort"
|
|
"time"
|
|
)
|
|
|
|
func init() {
|
|
// Set the GC percentage to 50%. This is a good balance between performance and memory usage.
|
|
debug.SetGCPercent(50)
|
|
}
|
|
|
|
// lruGC deletes files in LRU order until enough space is reclaimed.
|
|
func lruGC(vfss vfs.VFS, size uint) (uint, uint) {
|
|
deletions := 0
|
|
var reclaimed uint
|
|
|
|
stats := vfss.StatAll()
|
|
sort.Slice(stats, func(i, j int) bool {
|
|
return stats[i].AccessTime().Before(stats[j].AccessTime())
|
|
})
|
|
|
|
for _, s := range stats {
|
|
sz := uint(s.Size())
|
|
err := vfss.Delete(s.Name())
|
|
if err != nil {
|
|
continue
|
|
}
|
|
reclaimed += sz
|
|
deletions++
|
|
if reclaimed >= size {
|
|
break
|
|
}
|
|
}
|
|
|
|
return reclaimed, uint(deletions)
|
|
}
|
|
|
|
func cachehandler(fi *vfs.FileInfo, cs cachestate.CacheState) bool {
|
|
return time.Since(fi.AccessTime()) < time.Second*10 // Put hot files in the fast vfs if equipped
|
|
}
|