From 739216189407b15f5a7be5e353a1d0234f674e04 Mon Sep 17 00:00:00 2001 From: zouyixiong Date: Tue, 18 Feb 2025 07:49:11 +0800 Subject: [PATCH] fix: The free disk size and percentage are quite different from the output of df -h. (#6550) * fix: record and delete bucket metrics after inactive * feat: match available disk size with system cmd `dh -h` * feat: move temp test to unmaintained/ --------- Co-authored-by: XYZ --- unmaintained/disk/disk_status.go | 57 ++++++++++++++++++++++++++++++++ weed/stats/disk_supported.go | 6 +++- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 unmaintained/disk/disk_status.go diff --git a/unmaintained/disk/disk_status.go b/unmaintained/disk/disk_status.go new file mode 100644 index 000000000..e01b16f22 --- /dev/null +++ b/unmaintained/disk/disk_status.go @@ -0,0 +1,57 @@ +//go:build !windows && !openbsd && !netbsd && !plan9 && !solaris +// +build !windows,!openbsd,!netbsd,!plan9,!solaris + +package main + +import ( + "log" + "syscall" +) + +// go run unmaintained/disk/disk_status.go + +type DiskStatus struct { + Dir string `protobuf:"bytes,1,opt,name=dir,proto3" json:"dir,omitempty"` + All uint64 `protobuf:"varint,2,opt,name=all,proto3" json:"all,omitempty"` + Used uint64 `protobuf:"varint,3,opt,name=used,proto3" json:"used,omitempty"` + Free uint64 `protobuf:"varint,4,opt,name=free,proto3" json:"free,omitempty"` + PercentFree float32 `protobuf:"fixed32,5,opt,name=percent_free,json=percentFree,proto3" json:"percent_free,omitempty"` + PercentUsed float32 `protobuf:"fixed32,6,opt,name=percent_used,json=percentUsed,proto3" json:"percent_used,omitempty"` + DiskType string `protobuf:"bytes,7,opt,name=disk_type,json=diskType,proto3" json:"disk_type,omitempty"` + + // new fields about availĀ blocks + Avail uint64 `protobuf:"varint,4,opt,name=avail,proto3" json:"avail,omitempty"` + PercentAvail float32 `protobuf:"fixed32,5,opt,name=percent_avail,json=percentAvail,proto3" json:"percent_avail,omitempty"` +} + +func main() { + dirs := []string{"/mnt/sdb", "/mnt/sdc", "/mnt/sdd", "/mnt/sde", "/mnt/sdf", "/mnt/sdg", "/mnt/sdh", "/mnt/sdi", "/mnt/sdj"} + // dirs := []string{"/mnt/sdb"} + for _, dir := range dirs { + disk := &DiskStatus{Dir: dir} + fillInDiskStatus(disk) + + // bytes, _ := json.Marshal(disk) + // log.Printf("disk status %s", bytes) + log.Printf("disk: %s avail: %f free: %f", disk.Dir, disk.PercentAvail, disk.PercentFree) + } +} + +func fillInDiskStatus(disk *DiskStatus) { + fs := syscall.Statfs_t{} + err := syscall.Statfs(disk.Dir, &fs) + if err != nil { + return + } + + disk.All = fs.Blocks * uint64(fs.Bsize) + disk.Free = fs.Bfree * uint64(fs.Bsize) + disk.Used = disk.All - disk.Free + disk.PercentFree = float32((float64(disk.Free) / float64(disk.All)) * 100) + disk.PercentUsed = float32((float64(disk.Used) / float64(disk.All)) * 100) + + // avail blocks + disk.Avail = fs.Bavail * uint64(fs.Bsize) + disk.PercentAvail = float32((float64(disk.Avail) / float64(disk.All)) * 100) + return +} diff --git a/weed/stats/disk_supported.go b/weed/stats/disk_supported.go index 633dfd00e..ee7d2d746 100644 --- a/weed/stats/disk_supported.go +++ b/weed/stats/disk_supported.go @@ -16,7 +16,11 @@ func fillInDiskStatus(disk *volume_server_pb.DiskStatus) { return } disk.All = fs.Blocks * uint64(fs.Bsize) - disk.Free = fs.Bfree * uint64(fs.Bsize) + // https://man7.org/linux/man-pages/man3/statvfs.3.html + // fs.Bfree: Number of free blocks + // fs.Bavail: Number of free blocks for unprivileged users + // disk.Free = fs.Bfree * uint64(fs.Bsize) + disk.Free = fs.Bavail * uint64(fs.Bsize) disk.Used = disk.All - disk.Free disk.PercentFree = float32((float64(disk.Free) / float64(disk.All)) * 100) disk.PercentUsed = float32((float64(disk.Used) / float64(disk.All)) * 100)