49 lines
1.1 KiB
Go
49 lines
1.1 KiB
Go
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
|
//go:build !windows
|
|
|
|
package caches
|
|
|
|
import (
|
|
"fmt"
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
// TotalDiskSize 消耗的磁盘尺寸
|
|
func (this *Manager) TotalDiskSize() int64 {
|
|
this.locker.RLock()
|
|
defer this.locker.RUnlock()
|
|
|
|
var total = int64(0)
|
|
var sidMap = map[string]bool{} // partition sid => bool
|
|
for _, storage := range this.storageMap {
|
|
// 这里不能直接用 storage.TotalDiskSize() 相加,因为多个缓存策略缓存目录可能处在同一个分区目录下
|
|
fileStorage, ok := storage.(*FileStorage)
|
|
if ok {
|
|
var options = fileStorage.options // copy
|
|
if options != nil {
|
|
var dir = options.Dir // copy
|
|
if len(dir) == 0 {
|
|
continue
|
|
}
|
|
var stat = &unix.Statfs_t{}
|
|
err := unix.Statfs(dir, stat)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
var sid = fmt.Sprintf("%d_%d", stat.Fsid.Val[0], stat.Fsid.Val[1])
|
|
if sidMap[sid] {
|
|
continue
|
|
}
|
|
sidMap[sid] = true
|
|
total += int64(stat.Blocks-stat.Bfree) * int64(stat.Bsize) // we add extra int64() for darwin
|
|
}
|
|
}
|
|
}
|
|
|
|
if total < 0 {
|
|
total = 0
|
|
}
|
|
|
|
return total
|
|
}
|