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
2.9 KiB
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.
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"