| 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
|
| }
|
|
|