Phase 6.1 Stream A.3 — wrap all 4 HistoryRead dispatch paths through CapabilityInvoker
Per Stream A.3 coverage goal, every IHistoryProvider method on the server dispatch surface routes through the invoker with DriverCapability.HistoryRead: - HistoryReadRaw (line 487) - HistoryReadProcessed (line 551) - HistoryReadAtTime (line 608) - HistoryReadEvents (line 665) Each gets timeout + per-(driver, host) circuit breaker + the default Tier retry policy (Tier A default: 2 retries at 30s timeout). Inner driver GetAwaiter().GetResult() pattern preserved because the OPC UA stack's HistoryRead hook is sync-returning-void — see CustomNodeManager2. With Read, Write, and HistoryRead wrapped, Stream A's invoker-coverage compliance check passes for the dispatch surfaces that live in DriverNodeManager. Subscribe / AlarmSubscribe / AlarmAcknowledge sit behind push-based subscription plumbing (driver → OPC UA event layer) rather than server-pull dispatch, so they're wrapped in the driver-to-server glue rather than in DriverNodeManager — deferred to the follow-up PR that wires the remaining capability surfaces per the final Roslyn-analyzer-enforced coverage map. Full solution dotnet test: 948 passing. Pre-existing Client.CLI Subscribe flake unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -484,12 +484,16 @@ public sealed class DriverNodeManager : CustomNodeManager2, IAddressSpaceBuilder
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var driverResult = History.ReadRawAsync(
|
var driverResult = _invoker.ExecuteAsync(
|
||||||
|
DriverCapability.HistoryRead,
|
||||||
|
_driver.DriverInstanceId,
|
||||||
|
async ct => await History.ReadRawAsync(
|
||||||
fullRef,
|
fullRef,
|
||||||
details.StartTime,
|
details.StartTime,
|
||||||
details.EndTime,
|
details.EndTime,
|
||||||
details.NumValuesPerNode,
|
details.NumValuesPerNode,
|
||||||
CancellationToken.None).GetAwaiter().GetResult();
|
ct).ConfigureAwait(false),
|
||||||
|
CancellationToken.None).AsTask().GetAwaiter().GetResult();
|
||||||
|
|
||||||
WriteResult(results, errors, i, StatusCodes.Good,
|
WriteResult(results, errors, i, StatusCodes.Good,
|
||||||
BuildHistoryData(driverResult.Samples), driverResult.ContinuationPoint);
|
BuildHistoryData(driverResult.Samples), driverResult.ContinuationPoint);
|
||||||
@@ -544,13 +548,17 @@ public sealed class DriverNodeManager : CustomNodeManager2, IAddressSpaceBuilder
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var driverResult = History.ReadProcessedAsync(
|
var driverResult = _invoker.ExecuteAsync(
|
||||||
|
DriverCapability.HistoryRead,
|
||||||
|
_driver.DriverInstanceId,
|
||||||
|
async ct => await History.ReadProcessedAsync(
|
||||||
fullRef,
|
fullRef,
|
||||||
details.StartTime,
|
details.StartTime,
|
||||||
details.EndTime,
|
details.EndTime,
|
||||||
interval,
|
interval,
|
||||||
aggregate.Value,
|
aggregate.Value,
|
||||||
CancellationToken.None).GetAwaiter().GetResult();
|
ct).ConfigureAwait(false),
|
||||||
|
CancellationToken.None).AsTask().GetAwaiter().GetResult();
|
||||||
|
|
||||||
WriteResult(results, errors, i, StatusCodes.Good,
|
WriteResult(results, errors, i, StatusCodes.Good,
|
||||||
BuildHistoryData(driverResult.Samples), driverResult.ContinuationPoint);
|
BuildHistoryData(driverResult.Samples), driverResult.ContinuationPoint);
|
||||||
@@ -597,8 +605,11 @@ public sealed class DriverNodeManager : CustomNodeManager2, IAddressSpaceBuilder
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var driverResult = History.ReadAtTimeAsync(
|
var driverResult = _invoker.ExecuteAsync(
|
||||||
fullRef, requestedTimes, CancellationToken.None).GetAwaiter().GetResult();
|
DriverCapability.HistoryRead,
|
||||||
|
_driver.DriverInstanceId,
|
||||||
|
async ct => await History.ReadAtTimeAsync(fullRef, requestedTimes, ct).ConfigureAwait(false),
|
||||||
|
CancellationToken.None).AsTask().GetAwaiter().GetResult();
|
||||||
|
|
||||||
WriteResult(results, errors, i, StatusCodes.Good,
|
WriteResult(results, errors, i, StatusCodes.Good,
|
||||||
BuildHistoryData(driverResult.Samples), driverResult.ContinuationPoint);
|
BuildHistoryData(driverResult.Samples), driverResult.ContinuationPoint);
|
||||||
@@ -651,12 +662,16 @@ public sealed class DriverNodeManager : CustomNodeManager2, IAddressSpaceBuilder
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var driverResult = History.ReadEventsAsync(
|
var driverResult = _invoker.ExecuteAsync(
|
||||||
|
DriverCapability.HistoryRead,
|
||||||
|
_driver.DriverInstanceId,
|
||||||
|
async ct => await History.ReadEventsAsync(
|
||||||
sourceName: fullRef,
|
sourceName: fullRef,
|
||||||
startUtc: details.StartTime,
|
startUtc: details.StartTime,
|
||||||
endUtc: details.EndTime,
|
endUtc: details.EndTime,
|
||||||
maxEvents: maxEvents,
|
maxEvents: maxEvents,
|
||||||
cancellationToken: CancellationToken.None).GetAwaiter().GetResult();
|
cancellationToken: ct).ConfigureAwait(false),
|
||||||
|
CancellationToken.None).AsTask().GetAwaiter().GetResult();
|
||||||
|
|
||||||
WriteResult(results, errors, i, StatusCodes.Good,
|
WriteResult(results, errors, i, StatusCodes.Good,
|
||||||
BuildHistoryEvent(driverResult.Events), driverResult.ContinuationPoint);
|
BuildHistoryEvent(driverResult.Events), driverResult.ContinuationPoint);
|
||||||
|
|||||||
Reference in New Issue
Block a user