aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--unmaintained/disk/disk_status.go57
-rw-r--r--weed/stats/disk_supported.go6
2 files changed, 62 insertions, 1 deletions
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)