docs(index): OtOpcUa follow-up batch #674-#678 (fast OpcUaClient recovery, reverse history reads, HistoryUpdate Primary-only, role overlays)

This commit is contained in:
Joseph Doherty
2026-10-11 13:20:46 -04:00
parent 0adfb244b2
commit 17cb91a315
@@ -221,3 +221,42 @@ AddRoute of the dev Mac (`oee-tagdump-mac`, `10.181.206.245.1.1`) on the two tes
- On SqlServer/QuestDB nodes, `Total` aggregate values change meaning.
- Event HistoryRead may now return continuation points, which a client must follow.
- Otherwise none by default.
- **2026-10-12 follow-up batch #674–#678 (OtOpcUa `6d5c1c76`).** #674, #676 and #678 are closed. #675 and #677 stay
open only for live AVEVA checks that need the VPN. New issues: #679 (Gateway `Count`/`Average` mode mapping) and
#680 (pre-existing forward differences from the SDK aggregate calculator). Three docker-dev live gates passed; one
failure (A1) was fixed and re-gated.
- **#674 (HistoryUpdate):**
- **Primary-only:** a non-Primary node returns `BadInvalidState`. The gate stays closed until the node's first
redundancy snapshot.
- **Future skew:** a timestamp beyond `now + ServerHistorian:HistoryUpdateMaxFutureSkew` (default 1 day) is
rejected with `BadOutOfRange`.
- **SqlServer v1 schema:** v1 is accepted again. On v1, modified reads and HistoryUpdate return
`BadHistoryOperationUnsupported`, but historization continues.
- **QuestDB TTL:** confirmed to follow the wall clock, so a far-future row cannot wipe history. The issue's
premise was false.
- **#675 (events):** reverse event HistoryRead pages newest-first on SqlServer and QuestDB. Gateway refuses an
explicit reverse read. An end-only capped read goes backward where the backend supports it and stays forward on
Gateway.
- **#677 (aggregates):**
- ⚠️ Reverse processed reads now follow the SDK / Part 13: anchored at the later time, partial bucket earliest,
later-edge timestamps. Forward reads are unchanged.
- A start-of-data Partial bit is set on forward reads.
- A non-default client `AggregateConfiguration` is rejected with `BadAggregateConfigurationRejected`.
- Gateway `IntegralDivisor` is now 1.
- **#676 (OpcUaClient):**
- Fast recovery: a definitive session loss re-initialises immediately instead of waiting for the ~90 s watchdog.
Definitive means a session status, `BadServerHalted`, a sustained closed secure channel, or a subscription the
server dropped. This is exposed through the new `IDriverConnectionLossSource`.
- Restart recovery went from ~122 s to 12–27 s. Pause blips still recover in place.
- The driver now rewrites the advertised endpoint's host and port.
- A trailing re-read repairs values lost in flight.
- The `ReconnectPeriod` setting is removed.
- **#678 (clients and role overlays):**
- Client.CLI/UI now rewrite the endpoint port, which fixes the rig `:4841` "certificate" error.
- ⚠️ Per-role appsettings overlays never loaded on cluster-role nodes; they now do. Cluster-role nodes therefore
pick up `Security.Ldap.Transport=Ldaps`, so set `Security__Ldap__Transport` explicitly on any plaintext-LDAP
central node.
- **ScadaBridge impact:**
- OpcUaClient-backed tags recover much faster after an upstream restart.
- Only reverse reads change shape (ScadaBridge issues no processed or event history reads).
- HistoryUpdate is refused off-Primary.