Server never dispatches HistoryRead to a driver's IHistoryProvider #655
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found in the #649 review (batch b647).
OtOpcUaNodeManagerserves HistoryRead only from the server-wideIHistorianDataSource(gateway or Null); nothing routes a HistoryRead for a raw/UNS node to the owning driver'sIHistoryProvidercapability. So driver-side history (e.g. OpcUaClientExecuteHistoryReadAsync, fixed in #649) is reachable only from tests — no OPC UA client can read an upstream server's history through OtOpcUa today.Decide: (a) wire a per-node dispatch (historized-by-driver nodes → driver capability, others → historian source), incl. excluding refusals (
HistoryAggregateNotSupportedException/HistoryReadStatusException) from the retry/breaker pipeline, or (b) declare driver history out of scope and delete the dead capability. docs/drivers/OpcUaClient.md already states the fix is latent.Resolved by deletion on master — merge
862d8a75(commitsf7d497e5,f7f7d948,67059e47), pushed 2026-10-09.Nothing ever dispatched HistoryRead to a driver, so the dead surface is removed rather than wired:
IHistoryProvider, the OpcUaClient history passthrough,DriverCapability.HistoryRead(resilience tier + AdminUI row),HistoryReadStatusExceptionand the node-manager catches. HistoryRead stays served only by the server-wideIHistorianDataSource(HistorianGateway); client-visible results are unchanged (rig smoke before/after identical). A storedResilienceConfigwith aHistoryReadkey still parses (diagnostic only).isHistorizedon an OpcUaClient tag means OtOpcUa records it, not that upstream history is proxied.Also: Client.Shared
DefaultSessionAdapternow surfaces a Bad HistoryRead status as an error (BadNoData excepted) instead of "0 values returned". Docs: OPC-009, OpcUaClient, OpcUaServer, Client.CLI, CLAUDE.md.