Files
lmxopcua/scripts/validation/opcua-lifecycle-memory/sdk1-comparator/README.md
T
Joseph Doherty 2e9cccbdef
v2-ci / unit-tests (push) Has been cancelled
test(soak): #799 SDK 1.5.378.182 comparator for the late-slope workload
Copies the reviewed baseline-canonical SDK1 port and replaces its 1..4-cycle smoke entry with the late-slope
loop (same cycle body, every-fourth-cycle active restart, 30/25/120 s bounds, 7200 s phase, cycle-3 cold
baseline with unchanged +64 MiB managed / +128 MiB RSS / +32 descriptor caps, latched first rejection,
bounded shutdown checks). Run against the immutable efb9197a publication (#807 fix included), never rebuilt.
The held-reference closed-session list assertion is recorded instead (SDK1 Close keeps lists until Dispose,
per OWNERSHIP.md) and the managed-monotonic guard is latched, so the comparator yields numbers for the whole
phase. acceptance=false by construction. Windows descriptor observer shared byte-for-byte with the SDK2 test.

Claude-Session: https://claude.ai/code/session_01GT67ACmpMR7b9LGRPLijMi
2026-11-12 12:48:44 -05:00

30 lines
2.9 KiB
Markdown

# SDK 1.5.378.182 comparator (lmxopcua#799)
The owner's #799 scope asks for the matched SDK 1.5 comparator numbers next to the SDK2 acceptance runs. This
comparator drives the canonical workload against the **immutable repaired SDK1 baseline `efb9197a`** (includes
the #807 terminal-disposal fix), published RID-specific (`win-x64`, framework-dependent) from that commit and
referenced, never rebuilt. It is `acceptance=false` by construction; it is evidence for comparison only.
Sources: `BaselineRig.cs`, `BaselineMetrics.cs`, `CanonicalOperations.cs`, `Program.cs` are copies of
`../baseline-canonical/` (the reviewed SDK1 port of the canonical operations, ported from the SDK2 soak at
`75057d8c`), with exactly these changes:
| Change | Why |
|---|---|
| `Program.cs`: the 1..4-cycle / 120 s short-smoke entry is replaced by `ComparatorAsync`, the late-slope loop: same cycle body, quiescent sample after every cycle, active restart every fourth cycle (25 s bound), 30 s cycle bound, 120 s startup bound, 7,200 s phase, cycle-3 cold baseline with the unchanged +64 MiB managed / +128 MiB RSS / +32 descriptor caps and a latched first rejection, then bounded shutdown checks. | The canonical late-slope protocol applied to SDK1. |
| `CanonicalOperations.cs`: the held-reference zero closed-session continuation-list assertion is recorded per cycle (`closedSessionPointsWhileHeld`) instead of asserted; the 250 ms observation delay is removed. | SDK 1.5 `Session.Close` keeps the lists until `Dispose`; the baseline-canonical README/OWNERSHIP.md show this is not the SDK1 close contract and the objects are collected once harness roots drop. Asserting it would end the comparator at cycle 1. |
| The 24-sample managed-monotonic guard is latched (recorded) rather than fatal. | So the comparator yields numbers for the full phase even if the old SDK grows; it is not a pass/fail gate. |
| Steady inventories use SDK1 observables: `Server/ClientCachedStoreReferences` (validator cached store references) in place of SDK2 manager cached stores; no `ApplicationInstance.DisposeAsync` / manager-disposed checks. | Not present in SDK 1.5 (reported unsupported, never as zero). |
| `WindowsDescriptors.cs`: byte-for-byte the SDK2 test's Windows descriptor observer. | Same descriptor/PKI semantics as the SDK2 Windows run. |
| Samples also carry `PrivateBytes`. | Descriptive. |
Known non-matched elements: the comparator is a standalone self-contained executable, while the SDK2 workload runs
inside the VSTest testhost (xUnit v3), so absolute RSS includes different host overhead; compare growth relative to
each run's own cycle-3 baseline. `OPCUA_CERTIFICATE_LEAK_TRACKING` has no SDK1 equivalent.
```bash
python3 build.py --host "$sdk1HostWinX64" --client "$sdk1ClientWinX64" --assertions "$dirWithShouldly" --output "$build"
# on Windows:
powershell -NoProfile -ExecutionPolicy Bypass -File launch.ps1 -Bin "$build\publish" -Output "$run" -SourceRevision "$rev"
```