diff --git a/lib/fs/zfs/stats.go b/lib/fs/zfs/stats.go index e96b194713..21eeb58add 100644 --- a/lib/fs/zfs/stats.go +++ b/lib/fs/zfs/stats.go @@ -37,7 +37,8 @@ func GetZfsStats(poolName string) (uint64, uint64, uint64, error) { // parseZfsListUsage parses one line of // `zfs list -Hp -o used,available,usedbydataset` output (tab-separated). A "-" // value is treated as 0 (matching go-zfs's setUint). It returns -// (capacity, free, available) preserving cAdvisor's original arithmetic. +// (capacity, free, available). The usedbydataset value is parsed for validation +// but not added to capacity because it is already included in used. func parseZfsListUsage(out []byte) (uint64, uint64, uint64, error) { fields := strings.Fields(string(out)) if len(fields) != 3 { @@ -51,11 +52,10 @@ func parseZfsListUsage(out []byte) (uint64, uint64, uint64, error) { if err != nil { return 0, 0, 0, err } - usedByDataset, err := parseZfsUint(fields[2]) - if err != nil { + if _, err := parseZfsUint(fields[2]); err != nil { return 0, 0, 0, err } - return used + avail + usedByDataset, avail, avail, nil + return used + avail, avail, avail, nil } func parseZfsUint(s string) (uint64, error) { diff --git a/lib/fs/zfs/stats_test.go b/lib/fs/zfs/stats_test.go index abb471c00f..c9816b6a26 100644 --- a/lib/fs/zfs/stats_test.go +++ b/lib/fs/zfs/stats_test.go @@ -22,7 +22,7 @@ func TestParseZfsListUsage(t *testing.T) { if err != nil { t.Fatalf("unexpected error: %v", err) } - if want := uint64(123456 + 789012 + 654321); capacity != want { + if want := uint64(123456 + 789012); capacity != want { t.Errorf("capacity = %d, want %d", capacity, want) } if free != 789012 || avail != 789012 { @@ -34,8 +34,8 @@ func TestParseZfsListUsage(t *testing.T) { if err != nil { t.Fatalf("dash value: unexpected error: %v", err) } - if capacity != 150 { - t.Errorf("capacity with dash = %d, want 150", capacity) + if capacity != 100 { + t.Errorf("capacity with dash = %d, want 100", capacity) } // Wrong field count must error rather than silently misparse.