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:
co-authored by
Claude Opus 5
parent
e0625be684
commit
2e4f3a7fe6
+16
-3
@@ -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>
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user