mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-11-07 12:37:41 +01:00
* admin: show disk usage on the dashboard instead of the data size The dashboard's Total Size card summed the volume and EC shard sizes the volume servers report. That leaves out deleted needles waiting for vacuum, EC generations kept after a vacuum, and anything else on the disks, so on a cluster with a lot of EC vacuum activity it showed far less than the disks held. The card now shows the bytes in use on the volume servers' disks, the same statfs numbers the volume server list uses, with the disks' capacity, and its trend line follows that number. Servers that report no statfs numbers count their data size, as on the volume server list. Claude-Session: https://claude.ai/code/session_011UpvafcfUuC2mLxNAXLQJi * admin: compute the disk usage percentage in float64 current*100 overflows int64 past about 92 PB of used space, so the dashboard card showed a negative percentage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * admin: size the volume server disk bar with calculatePercent64 int(host.DiskUsage) truncates byte counts on 32-bit builds, so the bar width was wrong for any disk over 2 GB there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * admin: test the cluster disk totals across statfs and fallback servers Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
101 lines
2.1 KiB
Go
101 lines
2.1 KiB
Go
package app
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// formatBytes converts bytes to human readable format
|
|
func formatBytes(bytes int64) string {
|
|
if bytes == 0 {
|
|
return "0 B"
|
|
}
|
|
|
|
units := []string{"B", "KB", "MB", "GB", "TB", "PB"}
|
|
var i int
|
|
value := float64(bytes)
|
|
|
|
for value >= 1024 && i < len(units)-1 {
|
|
value /= 1024
|
|
i++
|
|
}
|
|
|
|
if i == 0 {
|
|
return fmt.Sprintf("%.0f %s", value, units[i])
|
|
}
|
|
return fmt.Sprintf("%.1f %s", value, units[i])
|
|
}
|
|
|
|
// formatNumber formats large numbers with commas
|
|
func formatNumber(num int64) string {
|
|
if num == 0 {
|
|
return "0"
|
|
}
|
|
|
|
str := strconv.FormatInt(num, 10)
|
|
result := ""
|
|
|
|
for i, char := range str {
|
|
if i > 0 && (len(str)-i)%3 == 0 {
|
|
result += ","
|
|
}
|
|
result += string(char)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// calculatePercent64 is calculatePercent for byte counts, which overflow
|
|
// integer arithmetic once multiplied by 100.
|
|
func calculatePercent64(current, max int64) int {
|
|
if max <= 0 {
|
|
return 0
|
|
}
|
|
return int(min(float64(current)/float64(max)*100, 100))
|
|
}
|
|
|
|
// calculatePercent calculates percentage for progress bars
|
|
func calculatePercent(current, max int) int {
|
|
if max == 0 {
|
|
return 0
|
|
}
|
|
return (current * 100) / max
|
|
}
|
|
|
|
func pluginLaneDisplayName(lane string) string {
|
|
normalized := strings.TrimSpace(strings.ToLower(lane))
|
|
if normalized == "" || normalized == "default" {
|
|
return "Default"
|
|
}
|
|
|
|
parts := strings.Fields(strings.ReplaceAll(normalized, "_", " "))
|
|
if len(parts) == 0 {
|
|
return "Default"
|
|
}
|
|
|
|
for i, part := range parts {
|
|
if part == "" {
|
|
continue
|
|
}
|
|
parts[i] = strings.ToUpper(part[:1]) + part[1:]
|
|
}
|
|
|
|
return strings.Join(parts, " ")
|
|
}
|
|
|
|
func pluginLaneTitle(lane string) string {
|
|
return pluginLaneDisplayName(lane) + " Workers"
|
|
}
|
|
|
|
func pluginLaneDescription(lane string) string {
|
|
switch strings.TrimSpace(strings.ToLower(lane)) {
|
|
case "iceberg":
|
|
return "Iceberg maintenance workers, scheduler state, queue, and execution flows."
|
|
case "lifecycle":
|
|
return "Lifecycle workers, scheduler state, queue, and execution flows."
|
|
default:
|
|
return "Default workers, scheduler state, queue, and execution flows."
|
|
}
|
|
}
|