R2-08 Async LDAP + HistoryRead (arch-review round 2) #435

Closed
dohertj2 wants to merge 0 commits from r2/08-ldap-historyread-async into master
Owner

Round-2 arch-review plan R2-08 (findings 03/S2, 03/S3).

  • 03/S2: the OPC UA SDK raises the impersonation callback synchronously under a SessionManager-wide event lock, so one hung LDAP bind serializes every session activation. Fixed at the LdapOpcUaUserAuthenticator boundary: AuthTimeoutMs hard WaitAsync bound, MaxConcurrentAuthentications semaphore, ConnectionTimeoutMs, directory-outage circuit (OutageFailureThreshold/CooldownSeconds + half-open probe), LdapAuthResult.IsSystemFailure seam — all fail-closed.
  • 03/S3: HistoryRead per-node sequential block-bridge async-ified (all 4 arms; OCE→BadTimeout), bounded per-node fan-out (RunBounded semaphore, single arm-boundary bridge), per-request deadline CTS, process-wide batch limiter (flood → BadTooManyOperations, cap 16×4=64).

All 14 tasks; T14 full-sweep + live legs (docker-dev unreachable-LDAP, Category=LiveIntegration soak) deferred to serial heavy pass. Build clean; Host.IntegrationTests LDAP 43, Security.Tests 11, OpcUaServer.Tests HistoryRead+Impersonation 37, Runtime.Tests ServerHistorianOptions 11 (all green). Plan: archreview/plans/R2-08-ldap-historyread-async-plan.md.

Round-2 arch-review plan **R2-08** (findings 03/S2, 03/S3). - **03/S2**: the OPC UA SDK raises the impersonation callback synchronously under a SessionManager-wide event lock, so one hung LDAP bind serializes every session activation. Fixed at the `LdapOpcUaUserAuthenticator` boundary: AuthTimeoutMs hard WaitAsync bound, MaxConcurrentAuthentications semaphore, ConnectionTimeoutMs, directory-outage circuit (OutageFailureThreshold/CooldownSeconds + half-open probe), `LdapAuthResult.IsSystemFailure` seam — all fail-closed. - **03/S3**: HistoryRead per-node sequential block-bridge async-ified (all 4 arms; OCE→BadTimeout), bounded per-node fan-out (RunBounded semaphore, single arm-boundary bridge), per-request deadline CTS, process-wide batch limiter (flood → BadTooManyOperations, cap 16×4=64). All 14 tasks; T14 full-sweep + live legs (docker-dev unreachable-LDAP, Category=LiveIntegration soak) deferred to serial heavy pass. Build clean; Host.IntegrationTests LDAP 43, Security.Tests 11, OpcUaServer.Tests HistoryRead+Impersonation 37, Runtime.Tests ServerHistorianOptions 11 (all green). Plan: `archreview/plans/R2-08-ldap-historyread-async-plan.md`.
dohertj2 added 14 commits 2026-07-13 12:22:38 -04:00
docs: ServerHistorian HistoryRead knobs + Security:Ldap resilience keys; R2-08 status (03/S2, 03/S3)
v2-ci / build (pull_request) Successful in 3m33s
v2-ci / unit-tests (pull_request) Failing after 9m24s
354d74d370
Author
Owner

Landed on master via merge commit a004931f (local --no-ff merge, clean build barrier). Full-sweep + live LDAP/gateway legs deferred to serial heavy pass. Closing as merged.

Landed on `master` via merge commit `a004931f` (local --no-ff merge, clean build barrier). Full-sweep + live LDAP/gateway legs deferred to serial heavy pass. Closing as merged.
dohertj2 closed this pull request 2026-07-13 12:23:23 -04:00
Some checks are pending
v2-ci / build (pull_request) Successful in 3m33s
v2-ci / unit-tests (pull_request) Failing after 9m24s

Pull request closed

Sign in to join this conversation.