A drive in a pool says which pool, not that nothing is on it

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Mitchell-Johnson
2026-09-24 12:11:39 -07:00
co-authored by Claude Opus 5
parent e0625be684
commit 2e4f3a7fe6
+16 -3
View File
@@ -251,6 +251,19 @@ export default function Top() {
// the process table, and the CPU model, come from the same place the Processes page reads // the process table, and the CPU model, come from the same place the Processes page reads
const [pt, setPt] = useState<ProcTable | null>(null) const [pt, setPt] = useState<ProcTable | null>(null)
const [pickedIf, setPickedIf] = useState<string | null>(null) // which NIC the net box draws const [pickedIf, setPickedIf] = useState<string | null>(null) // which NIC the net box draws
// Which pool each drive belongs to, asked once: a drive in a ZFS pool has no filesystem of
// its own, and "nothing is on it" would be a lie about eight drives holding a NAS.
const [pools, setPools] = useState<Record<string, string>>({})
useEffect(() => {
let live = true
api.storage().then((r) => {
if (!live) return
const m: Record<string, string> = {}
for (const d of r.devices) for (const part of d.parts) if (part.fstype === 'zfs_member' && part.label) m[d.name] = part.label
setPools(m)
}).catch(() => { /* the rows simply say less */ })
return () => { live = false }
}, [])
const [err, setErr] = useState('') const [err, setErr] = useState('')
useEffect(() => { useEffect(() => {
let stop = false let stop = false
@@ -389,7 +402,7 @@ export default function Top() {
// shows what is true of the hardware — how busy it is, and how hot. // shows what is true of the hardware — how busy it is, and how hot.
const on = fs.filter((f) => f.disk === d.name) const on = fs.filter((f) => f.disk === d.name)
const used = on.reduce((a, f) => a + f.used, 0) const used = on.reduce((a, f) => a + f.used, 0)
return <Disk key={d.name} name={d.name} note={d.model} size={d.size} used={on.length ? used : undefined} io={d.util_pct} temp={d.temp} mounts={on.map((f) => f.mount)} /> return <Disk key={d.name} name={d.name} note={d.model} size={d.size} used={on.length ? used : undefined} io={d.util_pct} temp={d.temp} mounts={on.map((f) => f.mount)} pool={pools[d.name]} />
})} })}
{(s?.disks ?? []).length === 0 && <div className="t-dim">no drives reported</div>} {(s?.disks ?? []).length === 0 && <div className="t-dim">no drives reported</div>}
</div> </div>
@@ -485,7 +498,7 @@ const Rows = memo(function Rows({ procs, sel, onSel, curves, empty }: { procs: P
// One physical drive. `used` is the bytes of the filesystems on it, left out when none can // One physical drive. `used` is the bytes of the filesystems on it, left out when none can
// be attributed to it — a pool member's share of a pool is not a number worth inventing. // be attributed to it — a pool member's share of a pool is not a number worth inventing.
function Disk({ name, note, size, used, io, temp, mounts }: { name: string; note?: string; size: number; used?: number; io?: number; temp?: number; mounts?: string[] }) { function Disk({ name, note, size, used, io, temp, mounts, pool }: { name: string; note?: string; size: number; used?: number; io?: number; temp?: number; mounts?: string[]; pool?: string }) {
const upct = used !== undefined && size > 0 ? (used / size) * 100 : 0 const upct = used !== undefined && size > 0 ? (used / size) * 100 : 0
return ( return (
<div className="t-disk"> <div className="t-disk">
@@ -504,7 +517,7 @@ function Disk({ name, note, size, used, io, temp, mounts }: { name: string; note
{mounts && mounts.length > 0 && <div className="t-row t-sub t-dim t-mounts" title={mounts.join(' ')}>{mounts.join(' ')}</div>} {mounts && mounts.length > 0 && <div className="t-row t-sub t-dim t-mounts" title={mounts.join(' ')}>{mounts.join(' ')}</div>}
</> </>
) : ( ) : (
<div className="t-row t-sub t-dim">no filesystem of this machine is on it</div> <div className="t-row t-sub t-dim">{pool ? `member of ZFS pool ${pool}` : 'nothing mounted from it'}</div>
)} )}
</div> </div>
) )