Where: src/main/java/org/metricshub/ipmi/client/runner/AbstractIpmiRunner.java (getSensorData), GetSensorsRunner.java and GetFrusRunner.java (call).
What happens: an HP iLO 4 (ilo-hp-ceph, ProLiant) answers Get SDR with completion code D4h (Cannot execute command due to insufficient privilege level or other security-based restriction) now and then, in the middle of a repository walk that otherwise works at the User privilege level. getSensorData() rethrows every IPMIException other than CannotRespond/UnspecifiedError, and the runners rethrow every IPMIException other than ReservationCanceled, so the whole call fails: getFrusAndSensorsAsStringResult() throws ExecutionException wrapping that IPMIException and returns nothing.
Evidence (survey of 2026-10-09, branch fix/decoders): on this iLO, getSensors() alone succeeds (107 sensors, 39 and 45 s in two runs), getFrus() alone succeeds (12 FRUs, 58 s), but 3 of 8 getFrusAndSensorsAsStringResult() calls failed after about 61 s with the D4h on a Get SDR (stack: GetSdr.getResponseData → IpmiCommandCoder.validateResponse). The same code was also seen once on a Read FRU Data at offset 2016 of FRU 2 (logged and tolerated by the FRU reader since #143). ipmitool is not affected in the same way because it retries the command.
Suggested fix: in getSensorData(), send the Get SDR of the same record again (once or twice, re-reserving the repository) when the BMC answers with an error code that is not one of the "record too large" codes, and only fail the walk when the retry fails too. The same for Get Sensor Reading: an error code other than DataNotPresent on one sensor should cost that sensor, not the walk. Reproducible on the lab iLO 4 by repeating the combined call a few times.
Related: #101 (privilege level is not configurable: Operator might avoid the D4h on this firmware), #77/#140 (the retries of the transport layer only cover lost replies).
Where:
src/main/java/org/metricshub/ipmi/client/runner/AbstractIpmiRunner.java(getSensorData),GetSensorsRunner.javaandGetFrusRunner.java(call).What happens: an HP iLO 4 (ilo-hp-ceph, ProLiant) answers Get SDR with completion code
D4h(Cannot execute command due to insufficient privilege level or other security-based restriction) now and then, in the middle of a repository walk that otherwise works at the User privilege level.getSensorData()rethrows everyIPMIExceptionother thanCannotRespond/UnspecifiedError, and the runners rethrow everyIPMIExceptionother thanReservationCanceled, so the whole call fails:getFrusAndSensorsAsStringResult()throwsExecutionExceptionwrapping thatIPMIExceptionand returns nothing.Evidence (survey of 2026-10-09, branch
fix/decoders): on this iLO,getSensors()alone succeeds (107 sensors, 39 and 45 s in two runs),getFrus()alone succeeds (12 FRUs, 58 s), but 3 of 8getFrusAndSensorsAsStringResult()calls failed after about 61 s with theD4hon a Get SDR (stack:GetSdr.getResponseData→IpmiCommandCoder.validateResponse). The same code was also seen once on a Read FRU Data at offset 2016 of FRU 2 (logged and tolerated by the FRU reader since #143). ipmitool is not affected in the same way because it retries the command.Suggested fix: in
getSensorData(), send the Get SDR of the same record again (once or twice, re-reserving the repository) when the BMC answers with an error code that is not one of the "record too large" codes, and only fail the walk when the retry fails too. The same for Get Sensor Reading: an error code other thanDataNotPresenton one sensor should cost that sensor, not the walk. Reproducible on the lab iLO 4 by repeating the combined call a few times.Related: #101 (privilege level is not configurable: Operator might avoid the
D4hon this firmware), #77/#140 (the retries of the transport layer only cover lost replies).