feat(opcua): make MaterialiseAlarmCondition idempotent for same-kind re-applies (R2-07 T4a)
This commit is contained in:
@@ -591,6 +591,17 @@ public sealed class OtOpcUaNodeManager : CustomNodeManager2
|
||||
|
||||
lock (Lock)
|
||||
{
|
||||
// R2-07 T4a: idempotent skip-if-present-and-same-kind. On a PURE-ADD apply,
|
||||
// MaterialiseScriptedAlarms + the native-alarm materialise re-run over the FULL composition, so
|
||||
// an existing enabled condition is re-materialised with the SAME id + kind. Skip it — KEEP the
|
||||
// existing AlarmConditionState instance alive so every MonitoredItem on that condition node
|
||||
// survives the deploy (the drop-and-recreate below would otherwise kill them). A genuine
|
||||
// re-severity/type change arrives as a ChangedAlarms delta ⇒ full rebuild (the map is cleared
|
||||
// first), so it never reaches this path with a stale-but-present entry; the drop-and-recreate
|
||||
// stays ONLY for the kind-swap (native↔scripted) case, which flips the native flag.
|
||||
if (_alarmConditions.ContainsKey(alarmNodeId) && _nativeAlarmNodeIds.Contains(alarmNodeId) == isNative)
|
||||
return;
|
||||
|
||||
// Idempotent: drop any prior node for this id so a re-materialise (e.g. changed
|
||||
// type/severity on redeploy) reflects cleanly instead of leaking the old node.
|
||||
if (_alarmConditions.TryRemove(alarmNodeId, out var existing))
|
||||
|
||||
Reference in New Issue
Block a user