Files
ScadaBridge/docs/components
Joseph Doherty 7c1268d85c feat(dcl+siteruntime): reconfigure a LIVE data connection in place — register row 97
`DataConnectionManagerActor.HandleCreateConnection` is create-only (warns and
returns for a name it already holds), so `EnsureDclConnection`'s documented
"a changed config re-issues the create so the DCL adopts it" was never true on
ANY node: a corrected endpoint/credential/backup/failover-count took effect only
when the connection was next built from scratch (node restart, singleton
failover, remove-then-re-add), while the DM's hash cache recorded it as applied.
Rows 89/90 made that honest with a Warning; this closes it.

New `ReconfigureConnectionCommand` (Commons, same shape as the create):

- `DeploymentManagerActor.EnsureDclConnection` now has three outcomes off its one
  per-name hash slot — unchanged -> nothing at all, new -> create, CHANGED ->
  reconfigure — and logs "Reconfigured DCL connection {Connection}
  (protocol={Protocol}) in place" at Information in place of the old Warning. The
  winner-resolution / arbitration / tombstone logic is untouched; only what
  happens after a change is detected changed.
- `DataConnectionManagerActor` FORWARDS the command to the owning connection
  actor, falling back to a create for a name it does not hold, so the command is
  safe whatever the manager's state.
- `DataConnectionActor` handles it in ALL THREE states and never stashes it — a
  connection pointed at a wrong or dead endpoint lives in Connecting/Reconnecting,
  which is exactly when a correction arrives; stashed it would wait on the broken
  configuration forever. Handling replaces protocol/primary/backup/failover-count,
  re-arms endpoint selection to Primary (the new config's primary is the intent,
  whatever the old config had failed over to), and calls the new shared
  `SwapAdapter` helper — now used by both failover sites too, so the swap exists
  once: unhook + fire-and-forget dispose -> _factory.Create -> rewire -> bump
  _adapterGeneration LAST. `BecomeReconnecting(afterReconfigure: true)` then
  reconnects immediately (StartSingleTimer replaces any armed reconnect, so no
  racing attempts) with the unstable-disconnect accounting and failover check
  suppressed — the link was dropped on purpose, and counting it as an unstable
  cycle could trip a failover onto the NEW backup before the new primary had been
  tried once. ReSubscribeAll/ReSubscribeAllAlarms then re-issue everything from
  the untouched subscription registries. Idempotent: a reconfigure carrying the
  configuration already in force is a no-op.

Stop-and-recreate was rejected as destructive: subscriptions live inside
DataConnectionActor and InstanceActor cancels its subscribe-retry timer on first
success, so a rebuilt actor would have no subscribers and nothing would ever
re-subscribe.

Tests: new DataConnectionReconfigureTests (7; 5 fail / 2 pass against a
behavioural revert). DclConnectionArbitrationTests gains two row-97 tests and its
CDC-arrival test now asserts the second push is a reconfigure; its ping-pong
guard also asserts zero reconfigures, since a flip would now show up there.
SiteRuntime-010 renamed to ..._ReissuesReconfigureCommand. 3 fail against a
reverted EnsureDclConnection. DataConnectionLayer.Tests 327/327,
SiteRuntime.Tests 643/643, solution build 0 warnings.

Docs: Component-DataConnectionLayer.md gains an "In-place reconfiguration"
section under Endpoint Redundancy; Component-SiteRuntime.md, and the
docs/components/ mirrors, updated; the arbitration decision memo gains an
appended §9 postscript resolving its residual 1 (residuals 2 and 3 stay open).
2026-08-17 06:19:13 -04:00
..

Component Reference Documentation

Developer-reference docs for each ScadaBridge component, describing how the shipped code in src/ actually works — with real code examples. These complement the design specs in docs/requirements/: the specs say what a component should do and why; these docs say how the code does it.

Reference docs exist for 24 of the 27 components (plus the shared TreeView, listed below). ScriptAnalysis (#25), KpiHistory (#26), and DelmiaNotifier (#27) are pending — tracked in ../plans/2026-07-08-deferred-work-register.md.

# Component Description
1 Template Engine Template modeling, inheritance, composition, flattening, diffs, and semantic validation as implemented by the engine's services.
2 Deployment Manager The central deployment pipeline: deployment identity and idempotency, per-instance operation locks, state transitions, all-or-nothing site apply, and artifact deployment.
3 Site Runtime The site actor hierarchy (Deployment Manager singleton, Instance, Script, and Alarm actors), script compilation and execution, the site-wide stream, native alarms, and supervision.
4 Data Connection Layer Protocol adapters (OPC UA, MxGateway), the Become/Stash connection state machine, reconnect and re-subscribe, and the native-alarm subscription seam.
5 Central–Site Communication ClusterClient command and control plus gRPC server-streaming, the central and site communication actors, receptionist registration, and per-site contact points.
6 Store-and-Forward Engine Site-only buffering, fixed-interval retry, parking, SQLite persistence, standby replication, and the operation-tracking store.
7 External System Gateway Script-facing HTTP/REST and database access, the Call and CachedCall modes, and transient versus permanent error classification.
8 Notification Service Central notification-list and SMTP definitions, the per-type delivery adapters, and OAuth2 or Basic SMTP delivery.
9 Central UI The Blazor Server app structure, authentication, real-time updates (SignalR and gRPC), and the management pages.
10 Security & Auth LDAP bind authentication, cookie and JWT sessions, role-based and site-scoped authorization, and shared Data Protection keys.
11 Health Monitoring Site metric collection and central aggregation, report and heartbeat intervals, offline detection, and dead-letter monitoring.
12 Site Event Logging The site-local SQLite event log, retention and storage cap, daily purge, and paginated central query access.
13 Cluster Infrastructure The ClusterOptions model and validation for active/standby clustering, split-brain resolution, and failover.
14 Inbound API POST /api/{method} script invocation, API-key authentication, the extended type system, and inbound-request auditing.
15 Host The deployable binary: role-based component registration, Akka bootstrap, ASP.NET Core hosting, and the readiness and active-node health endpoints.
16 Commons Shared POCO entities, repository and service interfaces, message contracts, and the Types/Interfaces/Entities/Messages namespace layout.
17 Configuration Database The EF Core DbContext, repository implementations, the audit service, secret encryption, and migration and partition maintenance.
18 Management Service The ManagementActor admin command surface, its HTTP endpoints, and ClusterClientReceptionist registration.
19 CLI The System.CommandLine tool over the HTTP Management API — its command groups, config file, and output formats.
20 Traefik Proxy The reverse proxy fronting the central cluster, active-node routing via /health/active, and the Docker topology configuration.
21 Notification Outbox The central NotificationOutboxActor, the Notifications table, the dispatcher loop, retry and parking, and KPIs.
22 Site Call Audit The central SiteCallAuditActor, the SiteCalls mirror table, telemetry ingest, and the parked-call Retry/Discard relay.
23 Audit Log The append-only audit store: site SQLite hot-path, gRPC telemetry, central ingest and reconciliation, redaction, retention, and KPIs.
24 Transport Encrypted bundle export and import, dependency resolution, conflict detection, and BundleImportId-correlated audit.
25 Tree View The reusable Blazor tree component — parameters, selection modes, and usage in the Central UI.