Repository navigation
Work Intent: Stop the disks query from spinning up array disks (#2018) #2105
Description
Overview
Fix #2018. Any query that goes through DisksService.getDisks() wakes every spun-down array disk: disks, disk(id), assignableDisks and the onboarding Internal Boot step (getAssignableDisks() / getInternalBootDevices()). Even { disks { id } } is enough. Anything that polls the disk list keeps large drives from staying in standby.
The cause is the same one #2090 / #2091 found for temperatures: getDisks() builds its list from diskLayout() in systeminformation, which on Linux runs smartctl -a -j and smartctl -H on every disk without -n standby.
I've been running the approach below as a runtime patch on my own server (Unraid 7.3, mixed array with 16 and 18 TB drives) for a few months. With the disks spun down, { disks { id } } spins up every large drive on stock, and none with the patch. The query also goes from several seconds to under 500 ms.
Technical Approach
- Replace
diskLayout()ingetDisks()with a listing fromlsblk -d -b -J -O, which only reads kernel metadata. Ideally this builds ongetPhysicalDisks()from fix(api): stop temperature metrics from spinning up array disks #2091 once it lands, adding the columnsgetDisks()needs (vendor, firmware revision, rotational) so there is a single place that lists disks. - Map each device to the shape
diskLayout()returns today, soparseDisk()stays as it is:device,name(model),vendor,serialNum,firmwareRevision,interfaceType(fromtran),sizein bytes, andtypeasHD/SSD/NVMe(fromrotaandtran, same valuesdiskLayout()returns). lsblk reportsvendor: "ATA"for SATA drives, so in that case the vendor is derived from the model string. - Get
smartStatusfromsmartctl -n standby -H -j <device>. Exit code 2 means the disk is in standby and was not queried, which maps toUNKNOWN. - Keep
blockDevices()for partitions. - Tests: unit tests for the lsblk mapping (size in bytes, drive type, vendor fallback, filtering out loop/ram devices) and for the smartctl status mapping, plus a test that
getDisks()no longer callsdiskLayout().
Out of scope: the geometry fields on Disk (bytesPerSector, totalSectors, etc.) are non-nullable but diskLayout() already returns null for them on Linux, so selecting them errors today. This change would leave them as they are; happy to look at that separately.
Scope
- API
- Plugin
- Web UI
- Build/Deploy Process
- Documentation
Timeline & Impact
- Estimated time needed: a few days, since the logic already runs as a patch and mostly needs porting and tests. I'd start after fix(api): stop temperature metrics from spinning up array disks #2091 is merged to avoid conflicts in
disks.service.ts. - Potential impacts:
smartStatusbecomesUNKNOWNfor disks in standby instead of waking them to read it. No schema changes.
Pre-submission Checklist
- I have searched for similar work/issues
- I understand this needs approval before starting
- I am willing to make adjustments based on feedback
Activity