diff --git a/agent/mdraid_linux.go b/agent/mdraid_linux.go index d7e96643..2376a337 100644 --- a/agent/mdraid_linux.go +++ b/agent/mdraid_linux.go @@ -201,12 +201,9 @@ func mdraidSmartStatus(health mdraidHealth) string { if health.mismatchCnt > 0 { return "WARNING" } - // "check" scans for consistency problems without repairing mismatches. - // With no mismatches, keep it green while reporting progress attributes. - switch syncAction { - case "repair": - return "WARNING" - } + // "check" and "repair" are requested consistency scans, not evidence of + // array failure. With no health issues above, keep scrubbing green while + // reporting the sync action and progress attributes. switch state { case "clean", "active", "active-idle", "write-pending", "read-auto", "readonly": return "PASSED" diff --git a/agent/mdraid_linux_test.go b/agent/mdraid_linux_test.go index f0deb8f3..c6c93e3e 100644 --- a/agent/mdraid_linux_test.go +++ b/agent/mdraid_linux_test.go @@ -174,8 +174,25 @@ func TestMdraidSmartStatus(t *testing.T) { if got := mdraidSmartStatus(mdraidHealth{arrayState: "clean", mismatchCnt: 1}); got != "WARNING" { t.Fatalf("mdraidSmartStatus(clean+mismatch) = %q, want WARNING", got) } - if got := mdraidSmartStatus(mdraidHealth{arrayState: "clean", syncAction: "repair"}); got != "WARNING" { - t.Fatalf("mdraidSmartStatus(repair) = %q, want WARNING", got) + for _, tc := range []struct { + name string + health mdraidHealth + want string + }{ + {"clean", mdraidHealth{arrayState: "clean"}, "PASSED"}, + {"active", mdraidHealth{arrayState: "active"}, "PASSED"}, + {"mismatch", mdraidHealth{arrayState: "active", mismatchCnt: 1}, "WARNING"}, + {"degraded", mdraidHealth{arrayState: "active", degraded: 1}, "FAILED"}, + {"faulty member", mdraidHealth{arrayState: "active", faultyDisks: 1}, "FAILED"}, + {"inactive", mdraidHealth{arrayState: "inactive"}, "FAILED"}, + {"unknown", mdraidHealth{arrayState: "unknown"}, "UNKNOWN"}, + } { + t.Run("repair/"+tc.name, func(t *testing.T) { + tc.health.syncAction = "repair" + if got := mdraidSmartStatus(tc.health); got != tc.want { + t.Fatalf("mdraidSmartStatus(%+v) = %q, want %s", tc.health, got, tc.want) + } + }) } if got := mdraidSmartStatus(mdraidHealth{arrayState: "clean"}); got != "PASSED" { t.Fatalf("mdraidSmartStatus(clean) = %q, want PASSED", got) diff --git a/supplemental/CHANGELOG.md b/supplemental/CHANGELOG.md index 51ea746a..482639d3 100644 --- a/supplemental/CHANGELOG.md +++ b/supplemental/CHANGELOG.md @@ -20,6 +20,8 @@ - Fix missing root CA certificates in base agent image (#2291) +- Fix false RAID health warnings during healthy data scrubbing (#2109) + - Fix ZFS monitoring when /dev/zfs is unavailable (#2325) - Fix spurious `HUB_URL` warning in SSH-only mode (#2316)