@@ -32,6 +32,7 @@ type ContentAddressableStorage struct {
32
32
diskCacheDir string
33
33
diskCachedUsageExceeded bool
34
34
mu sync.Mutex
35
+ metrics BlobcacheMetrics
35
36
}
36
37
37
38
func 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
48
49
locality : locality ,
49
50
diskCacheDir : config .Server .DiskCacheDir ,
50
51
mu : sync.Mutex {},
52
+ metrics : initMetrics (ctx , config .Metrics , currentHost ),
51
53
}
52
54
53
55
Logger .Infof ("Disk cache directory located at: '%s'" , cas .diskCacheDir )
54
56
55
- availableMemoryMb := getAvailableMemoryMb ()
56
- maxCacheSizeMb := (availableMemoryMb * cas .serverConfig .MaxCachePct ) / 100
57
+ _ , totalMemoryMb := getMemoryMb ()
58
+ maxCacheSizeMb := (totalMemoryMb * cas .serverConfig .MaxCachePct ) / 100
57
59
maxCost := maxCacheSizeMb * 1e6
58
60
59
- Logger .Infof ("Total available memory: %dMB" , availableMemoryMb )
61
+ Logger .Infof ("Total available memory: %dMB" , totalMemoryMb )
60
62
Logger .Infof ("Max cache size: %dMB" , maxCacheSizeMb )
61
63
Logger .Infof ("Max cost: %d" , maxCost )
62
64
@@ -75,22 +77,13 @@ func NewContentAddressableStorage(ctx context.Context, currentHost *BlobCacheHos
75
77
return nil , err
76
78
}
77
79
78
- cas .cache = cache
79
- cas .maxCacheSizeMb = maxCacheSizeMb
80
-
81
80
go cas .monitorDiskCacheUsage ()
82
81
82
+ cas .cache = cache
83
+ cas .maxCacheSizeMb = maxCacheSizeMb
83
84
return cas , nil
84
85
}
85
86
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
-
94
87
type cacheValue struct {
95
88
Hash string
96
89
Content []byte
@@ -286,39 +279,42 @@ func (cas *ContentAddressableStorage) Cleanup() {
286
279
cas .cache .Close ()
287
280
}
288
281
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
292
294
}
293
- return b
294
- }
295
295
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
+ }
299
301
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
319
307
}
308
+
309
+ return diskUsageMb , totalDiskSpaceMb , usagePercentage , nil
320
310
}
321
311
312
+ func min (a , b int64 ) int64 {
313
+ if a < b {
314
+ return a
315
+ }
316
+ return b
317
+ }
322
318
func getDiskUsageMb (path string ) (int64 , error ) {
323
319
var totalUsage int64 = 0
324
320
err := filepath .Walk (path , func (path string , info os.FileInfo , err error ) error {
@@ -344,3 +340,44 @@ func getTotalDiskSpaceMb(path string) (int64, error) {
344
340
}
345
341
return int64 (stat .Blocks ) * int64 (stat .Bsize ) / (1024 * 1024 ), nil
346
342
}
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