R4.3: measured idle-state GetStoreForwardStatusAsync over gRPC

Route GetStoreForwardStatusAsync to a gRPC path that actually contacts the
server (StatusService.GetHistorianConsoleStatus) instead of synthesizing an
all-false result blind. On a reachable/normal server it returns the
not-storing baseline but MEASURED; when the server is unreachable or the
console-status call fails it reports ErrorOccurred with the underlying error
(the old synthesis never contacted the server). The active-SF buffer
magnitude (Storing/Pending/DataStored) stays false because it lives behind
the D2 storage-engine console wall.

Non-gRPC transports keep the synthesized fallback. Live-verified against the
2023 R2 server; gated integration test
GetStoreForwardStatusAsync_OverGrpc_ReturnsMeasuredIdleState added. README
operation table updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B6mcaT2PjRFKcogzp9UkfC
This commit is contained in:
Joseph Doherty
2026-06-21 23:14:17 -04:00
parent c2d8fb9bc8
commit 53a9c87114
4 changed files with 107 additions and 2 deletions
@@ -57,7 +57,14 @@ internal sealed class Historian2020ProtocolDialect
public Task<HistorianStoreForwardStatus> GetStoreForwardStatusAsync(CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
return Wcf.HistorianWcfStatusClient.GetStoreForwardStatusAsync(_options, cancellationToken);
// Over gRPC (2023 R2) we return a MEASURED idle-state: the client actually contacts the server
// (GetHistorianConsoleStatus) and reports ErrorOccurred when unreachable. The active-SF buffer
// magnitude lives behind the D2 storage-engine console wall and stays false. Non-gRPC transports
// keep the synthesized all-false (no SF sidecar to probe). See R4.3 §9.7.
return UseGrpc
? HistorianGrpcStatusClient.GetStoreForwardStatusAsync(_options, cancellationToken)
: Wcf.HistorianWcfStatusClient.GetStoreForwardStatusAsync(_options, cancellationToken);
}
public Task<string?> GetSystemParameterAsync(string name, CancellationToken cancellationToken)