fix(opcua): #855 perf review 3 — weak filter-group registry; where clause validated; sharing pinned
- The filter-group registry holds groups weakly (the filter->group table is the only strong reference), sweeps dead entries amortised and counts only live shapes against the 4096 cap; filters past the cap are counted on the new meter otopcua.opcua.condition_events.filter_groups_unshared. - A group validates its where clause too (restored, never-validated filters evaluate like validated ones). - Test: value-equal filters cost one projection per locale set per report. Claude-Session: https://claude.ai/code/session_01GT67AD99zQQqpLCVm3p7xk
This commit is contained in:
@@ -177,6 +177,15 @@ public static class OtOpcUaTelemetry
|
||||
/// item had already replayed a newer state (Gitea #854) — one per item and event. Every other subscriber still
|
||||
/// receives them; this only stops a refresh being overtaken by older events.
|
||||
/// </summary>
|
||||
/// <summary>
|
||||
/// Event filters given a private projection group because the server-wide registry of distinct live filter shapes is
|
||||
/// full (Gitea #855 perf). Delivery is unchanged; only the per-report sharing of where-clause / field projection
|
||||
/// stops for those filters, so a steadily rising count means more per-item work under the node-manager lock.
|
||||
/// </summary>
|
||||
public static readonly Counter<long> ConditionEventFilterGroupsUnshared =
|
||||
Meter.CreateCounter<long>("otopcua.opcua.condition_events.filter_groups_unshared", unit: "{filter}",
|
||||
description: "Event filters not shared because the registry of live filter shapes is full.");
|
||||
|
||||
public static readonly Counter<long> ConditionEventDeliveriesSuperseded =
|
||||
Meter.CreateCounter<long>("otopcua.opcua.condition_events.superseded", unit: "{delivery}",
|
||||
description: "Deferred condition events withheld from a Server-object item whose ConditionRefresh already replayed a newer state.");
|
||||
|
||||
Reference in New Issue
Block a user