@@ -32,6 +32,7 @@ type ContentAddressableStorage struct {
3232 diskCacheDir string
3333 diskCachedUsageExceeded bool
3434 mu sync.Mutex
35+ metrics BlobcacheMetrics
3536}
3637
3738func NewContentAddressableStorage (ctx context.Context , currentHost * BlobCacheHost , locality string , coordinator CoordinatorClient , config BlobCacheConfig ) (* ContentAddressableStorage , error ) {
@@ -48,15 +49,16 @@ func NewContentAddressableStorage(ctx context.Context, currentHost *BlobCacheHos
4849 locality : locality ,
4950 diskCacheDir : config .Server .DiskCacheDir ,
5051 mu : sync.Mutex {},
52+ metrics : initMetrics (ctx , config .Metrics , currentHost ),
5153 }
5254
5355 Logger .Infof ("Disk cache directory located at: '%s'" , cas .diskCacheDir )
5456
55- availableMemoryMb := getAvailableMemoryMb ()
56- maxCacheSizeMb := (availableMemoryMb * cas .serverConfig .MaxCachePct ) / 100
57+ _ , totalMemoryMb := getMemoryMb ()
58+ maxCacheSizeMb := (totalMemoryMb * cas .serverConfig .MaxCachePct ) / 100
5759 maxCost := maxCacheSizeMb * 1e6
5860
59- Logger .Infof ("Total available memory: %dMB" , availableMemoryMb )
61+ Logger .Infof ("Total available memory: %dMB" , totalMemoryMb )
6062 Logger .Infof ("Max cache size: %dMB" , maxCacheSizeMb )
6163 Logger .Infof ("Max cost: %d" , maxCost )
6264
@@ -75,22 +77,13 @@ func NewContentAddressableStorage(ctx context.Context, currentHost *BlobCacheHos
7577 return nil , err
7678 }
7779
78- cas .cache = cache
79- cas .maxCacheSizeMb = maxCacheSizeMb
80-
8180 go cas .monitorDiskCacheUsage ()
8281
82+ cas .cache = cache
83+ cas .maxCacheSizeMb = maxCacheSizeMb
8384 return cas , nil
8485}
8586
86- func getAvailableMemoryMb () int64 {
87- v , err := mem .VirtualMemory ()
88- if err != nil {
89- log .Fatalf ("Unable to retrieve host memory info: %v" , err )
90- }
91- return int64 (v .Total / (1024 * 1024 ))
92- }
93-
9487type cacheValue struct {
9588 Hash string
9689 Content []byte
@@ -286,39 +279,42 @@ func (cas *ContentAddressableStorage) Cleanup() {
286279 cas .cache .Close ()
287280}
288281
289- func min (a , b int64 ) int64 {
290- if a < b {
291- return a
282+ func (cas * ContentAddressableStorage ) GetDiskCacheMetrics () (int64 , int64 , float64 , error ) {
283+ var (
284+ diskUsageMb int64
285+ totalDiskSpaceMb int64
286+ usagePercentage float64
287+ err error
288+ )
289+
290+ // Get current disk usage
291+ diskUsageMb , err = getDiskUsageMb (cas .diskCacheDir )
292+ if err != nil {
293+ return 0 , 0 , 0 , err
292294 }
293- return b
294- }
295295
296- func (cas * ContentAddressableStorage ) monitorDiskCacheUsage () {
297- ticker := time .NewTicker (diskCacheUsageCheckInterval )
298- defer ticker .Stop ()
296+ // Get total disk capacity
297+ totalDiskSpaceMb , err = getTotalDiskSpaceMb (cas .diskCacheDir )
298+ if err != nil {
299+ return 0 , 0 , 0 , err
300+ }
299301
300- for {
301- select {
302- case <- cas .ctx .Done ():
303- return
304- case <- ticker .C :
305- usage , err := getDiskUsageMb (cas .diskCacheDir )
306- if err == nil {
307- totalDiskSpace , err := getTotalDiskSpaceMb (cas .diskCacheDir )
308- if err == nil {
309- usagePct := float64 (usage ) / float64 (totalDiskSpace )
310-
311- Logger .Infof ("Disk cache usage: %dMB / %dMB (%.2f%%)" , usage , totalDiskSpace , usagePct * 100 )
312-
313- cas .mu .Lock ()
314- cas .diskCachedUsageExceeded = usagePct > cas .serverConfig .DiskCacheMaxUsagePct
315- cas .mu .Unlock ()
316- }
317- }
318- }
302+ // Calculate usage percentage
303+ if totalDiskSpaceMb > 0 {
304+ usagePercentage = (float64 (diskUsageMb ) / float64 (totalDiskSpaceMb )) * 100
305+ } else {
306+ usagePercentage = 0
319307 }
308+
309+ return diskUsageMb , totalDiskSpaceMb , usagePercentage , nil
320310}
321311
312+ func min (a , b int64 ) int64 {
313+ if a < b {
314+ return a
315+ }
316+ return b
317+ }
322318func getDiskUsageMb (path string ) (int64 , error ) {
323319 var totalUsage int64 = 0
324320 err := filepath .Walk (path , func (path string , info os.FileInfo , err error ) error {
@@ -344,3 +340,44 @@ func getTotalDiskSpaceMb(path string) (int64, error) {
344340 }
345341 return int64 (stat .Blocks ) * int64 (stat .Bsize ) / (1024 * 1024 ), nil
346342}
343+
344+ func getMemoryMb () (int64 , int64 ) {
345+ v , err := mem .VirtualMemory ()
346+ if err != nil {
347+ log .Fatalf ("Unable to retrieve host memory info: %v" , err )
348+ }
349+ return int64 (v .Available / (1024 * 1024 )), int64 (v .Total / (1024 * 1024 ))
350+ }
351+
352+ func (cas * ContentAddressableStorage ) monitorDiskCacheUsage () {
353+ ticker := time .NewTicker (diskCacheUsageCheckInterval )
354+ defer ticker .Stop ()
355+
356+ for {
357+ select {
358+ case <- cas .ctx .Done ():
359+ return
360+ case <- ticker .C :
361+ currentUsage , totalDiskSpace , usagePercentage , err := cas .GetDiskCacheMetrics ()
362+ if err != nil {
363+ Logger .Errorf ("Failed to fetch disk cache metrics: %v" , err )
364+ continue
365+ }
366+
367+ availableMemoryMb , totalMemoryMb := getMemoryMb ()
368+ usedMemoryMb := totalMemoryMb - availableMemoryMb
369+ cas .metrics .MemCacheUsageMB .Update (float64 (usedMemoryMb ))
370+ cas .metrics .MemCacheUsagePct .Update (float64 (usedMemoryMb ) / float64 (totalMemoryMb ) * 100 )
371+ cas .metrics .DiskCacheUsageMB .Update (float64 (currentUsage ))
372+ cas .metrics .DiskCacheUsagePct .Update (float64 (usagePercentage ))
373+
374+ Logger .Infof ("Memory Cache Usage: %dMB / %dMB (%.2f%%)" , availableMemoryMb , totalMemoryMb , float64 (availableMemoryMb )/ float64 (totalMemoryMb )* 100 )
375+ Logger .Infof ("Disk Cache Usage: %dMB / %dMB (%.2f%%)" , currentUsage , totalDiskSpace , usagePercentage )
376+
377+ // Update internal state for disk usage exceeded
378+ cas .mu .Lock ()
379+ cas .diskCachedUsageExceeded = usagePercentage > cas .serverConfig .DiskCacheMaxUsagePct
380+ cas .mu .Unlock ()
381+ }
382+ }
383+ }
0 commit comments