| | package common
|
| |
|
| | import (
|
| | "sync"
|
| | "sync/atomic"
|
| | )
|
| |
|
| |
|
| | type DiskCacheConfig struct {
|
| |
|
| | Enabled bool
|
| |
|
| | ThresholdMB int
|
| |
|
| | MaxSizeMB int
|
| |
|
| | Path string
|
| | }
|
| |
|
| |
|
| | var diskCacheConfig = DiskCacheConfig{
|
| | Enabled: false,
|
| | ThresholdMB: 10,
|
| | MaxSizeMB: 1024,
|
| | Path: "",
|
| | }
|
| | var diskCacheConfigMu sync.RWMutex
|
| |
|
| |
|
| | func GetDiskCacheConfig() DiskCacheConfig {
|
| | diskCacheConfigMu.RLock()
|
| | defer diskCacheConfigMu.RUnlock()
|
| | return diskCacheConfig
|
| | }
|
| |
|
| |
|
| | func SetDiskCacheConfig(config DiskCacheConfig) {
|
| | diskCacheConfigMu.Lock()
|
| | defer diskCacheConfigMu.Unlock()
|
| | diskCacheConfig = config
|
| | }
|
| |
|
| |
|
| | func IsDiskCacheEnabled() bool {
|
| | diskCacheConfigMu.RLock()
|
| | defer diskCacheConfigMu.RUnlock()
|
| | return diskCacheConfig.Enabled
|
| | }
|
| |
|
| |
|
| | func GetDiskCacheThresholdBytes() int64 {
|
| | diskCacheConfigMu.RLock()
|
| | defer diskCacheConfigMu.RUnlock()
|
| | return int64(diskCacheConfig.ThresholdMB) << 20
|
| | }
|
| |
|
| |
|
| | func GetDiskCacheMaxSizeBytes() int64 {
|
| | diskCacheConfigMu.RLock()
|
| | defer diskCacheConfigMu.RUnlock()
|
| | return int64(diskCacheConfig.MaxSizeMB) << 20
|
| | }
|
| |
|
| |
|
| | func GetDiskCachePath() string {
|
| | diskCacheConfigMu.RLock()
|
| | defer diskCacheConfigMu.RUnlock()
|
| | return diskCacheConfig.Path
|
| | }
|
| |
|
| |
|
| | type DiskCacheStats struct {
|
| |
|
| | ActiveDiskFiles int64 `json:"active_disk_files"`
|
| |
|
| | CurrentDiskUsageBytes int64 `json:"current_disk_usage_bytes"`
|
| |
|
| | ActiveMemoryBuffers int64 `json:"active_memory_buffers"`
|
| |
|
| | CurrentMemoryUsageBytes int64 `json:"current_memory_usage_bytes"`
|
| |
|
| | DiskCacheHits int64 `json:"disk_cache_hits"`
|
| |
|
| | MemoryCacheHits int64 `json:"memory_cache_hits"`
|
| |
|
| | DiskCacheMaxBytes int64 `json:"disk_cache_max_bytes"`
|
| |
|
| | DiskCacheThresholdBytes int64 `json:"disk_cache_threshold_bytes"`
|
| | }
|
| |
|
| | var diskCacheStats DiskCacheStats
|
| |
|
| |
|
| | func GetDiskCacheStats() DiskCacheStats {
|
| | stats := DiskCacheStats{
|
| | ActiveDiskFiles: atomic.LoadInt64(&diskCacheStats.ActiveDiskFiles),
|
| | CurrentDiskUsageBytes: atomic.LoadInt64(&diskCacheStats.CurrentDiskUsageBytes),
|
| | ActiveMemoryBuffers: atomic.LoadInt64(&diskCacheStats.ActiveMemoryBuffers),
|
| | CurrentMemoryUsageBytes: atomic.LoadInt64(&diskCacheStats.CurrentMemoryUsageBytes),
|
| | DiskCacheHits: atomic.LoadInt64(&diskCacheStats.DiskCacheHits),
|
| | MemoryCacheHits: atomic.LoadInt64(&diskCacheStats.MemoryCacheHits),
|
| | DiskCacheMaxBytes: GetDiskCacheMaxSizeBytes(),
|
| | DiskCacheThresholdBytes: GetDiskCacheThresholdBytes(),
|
| | }
|
| | return stats
|
| | }
|
| |
|
| |
|
| | func IncrementDiskFiles(size int64) {
|
| | atomic.AddInt64(&diskCacheStats.ActiveDiskFiles, 1)
|
| | atomic.AddInt64(&diskCacheStats.CurrentDiskUsageBytes, size)
|
| | }
|
| |
|
| |
|
| | func DecrementDiskFiles(size int64) {
|
| | atomic.AddInt64(&diskCacheStats.ActiveDiskFiles, -1)
|
| | atomic.AddInt64(&diskCacheStats.CurrentDiskUsageBytes, -size)
|
| | }
|
| |
|
| |
|
| | func IncrementMemoryBuffers(size int64) {
|
| | atomic.AddInt64(&diskCacheStats.ActiveMemoryBuffers, 1)
|
| | atomic.AddInt64(&diskCacheStats.CurrentMemoryUsageBytes, size)
|
| | }
|
| |
|
| |
|
| | func DecrementMemoryBuffers(size int64) {
|
| | atomic.AddInt64(&diskCacheStats.ActiveMemoryBuffers, -1)
|
| | atomic.AddInt64(&diskCacheStats.CurrentMemoryUsageBytes, -size)
|
| | }
|
| |
|
| |
|
| | func IncrementDiskCacheHits() {
|
| | atomic.AddInt64(&diskCacheStats.DiskCacheHits, 1)
|
| | }
|
| |
|
| |
|
| | func IncrementMemoryCacheHits() {
|
| | atomic.AddInt64(&diskCacheStats.MemoryCacheHits, 1)
|
| | }
|
| |
|
| |
|
| | func ResetDiskCacheStats() {
|
| | atomic.StoreInt64(&diskCacheStats.DiskCacheHits, 0)
|
| | atomic.StoreInt64(&diskCacheStats.MemoryCacheHits, 0)
|
| | }
|
| |
|
| |
|
| | func IsDiskCacheAvailable(requestSize int64) bool {
|
| | if !IsDiskCacheEnabled() {
|
| | return false
|
| | }
|
| | maxBytes := GetDiskCacheMaxSizeBytes()
|
| | currentUsage := atomic.LoadInt64(&diskCacheStats.CurrentDiskUsageBytes)
|
| | return currentUsage+requestSize <= maxBytes
|
| | }
|
| |
|