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