SDK2 validation: client/server lifecycle soak exceeds RSS guard on macOS and Linux #799

Open
opened 2026-11-10 12:55:11 -05:00 by dohertj2 · 5 comments
Owner

Active finding from #782, not a release pass. Exact SDK2 server source fa823378 completed 250 lifecycle cycles and 62 in-process server restarts before the full-run RSS guard failed at 1,045.53 seconds (~17m27s). RSS 365,215,744 bytes exceeded the initial baseline +128MiB limit (363,331,584). The required two-hour run did not complete.

At the preceding quiescent sample, managed live memory was ~40MB, descriptors ~191, cached SDK certificate stores 2, and sessions/subscriptions/items/browse/history continuation points/live monitored nodes all returned to zero. This is a process-memory finding; the evidence does not yet establish an application-object leak or SDK regression. Original PKI-specific descriptor zeros are not valid because macOS canonicalized /var→/private/var; the measurement was repaired separately with open-file 0→1→0 and timeout controls, plus a successful 90s smoke. Global descriptors and SDK collection/disposal measurements remain meaningful.

Original failed logs/TRX/JSONL are retained under the opcua2-server worktree artifacts/opcua2/fa823378/soak-full-coordinator1. No budget was raised, no failed run was counted as passing, and no production change has been made on an unproven hypothesis.

Current investigation: unchanged-resource-budget 30-minute profile with GC committed/heap/fragmentation, finalizer/pinned counts, JIT methods/IL, threads/timers and native vmmap/heap checkpoints; matched original1.5.378.182 public-lifecycle control is being prepared. DefaultTelemetry undisposed vs disposed isolated control did not show a large memory differential, so that is not accepted as the RSS cause. Determine warmup/allocator retention versus continuing growth, correct proven ownership defects if any, and rerun real >=7200s guard before closing this finding. Keep #782 G4 and release approval open.

A separate root-owned two-hour Linux harness using actual Shared client, driver live reinitialization and AdminUI browser is running with strict mutual trust and actual ownership probes; its scope/result will be recorded independently, not substituted for this failing server-restart workload.

Active finding from #782, not a release pass. Exact SDK2 server source fa823378 completed 250 lifecycle cycles and 62 in-process server restarts before the full-run RSS guard failed at 1,045.53 seconds (~17m27s). RSS 365,215,744 bytes exceeded the initial baseline +128MiB limit (363,331,584). The required two-hour run did not complete. At the preceding quiescent sample, managed live memory was ~40MB, descriptors ~191, cached SDK certificate stores 2, and sessions/subscriptions/items/browse/history continuation points/live monitored nodes all returned to zero. This is a process-memory finding; the evidence does not yet establish an application-object leak or SDK regression. Original PKI-specific descriptor zeros are not valid because macOS canonicalized /var→/private/var; the measurement was repaired separately with open-file 0→1→0 and timeout controls, plus a successful 90s smoke. Global descriptors and SDK collection/disposal measurements remain meaningful. Original failed logs/TRX/JSONL are retained under the opcua2-server worktree artifacts/opcua2/fa823378/soak-full-coordinator1. No budget was raised, no failed run was counted as passing, and no production change has been made on an unproven hypothesis. Current investigation: unchanged-resource-budget 30-minute profile with GC committed/heap/fragmentation, finalizer/pinned counts, JIT methods/IL, threads/timers and native vmmap/heap checkpoints; matched original1.5.378.182 public-lifecycle control is being prepared. DefaultTelemetry undisposed vs disposed isolated control did not show a large memory differential, so that is not accepted as the RSS cause. Determine warmup/allocator retention versus continuing growth, correct proven ownership defects if any, and rerun real >=7200s guard before closing this finding. Keep #782 G4 and release approval open. A separate root-owned two-hour Linux harness using actual Shared client, driver live reinitialization and AdminUI browser is running with strict mutual trust and actual ownership probes; its scope/result will be recorded independently, not substituted for this failing server-restart workload.
dohertj2 added the queue/in-progresspriority:p1 labels 2026-11-10 12:55:11 -05:00
Author
Owner

The unchanged Linux ARM64 full server/node-manager workload also failed the original RSS guard: cycle 248, 61 restarts, 903.508 seconds; RSS 353,931,264 bytes >351,850,496 (cycle-3 baseline +128MiB). Self-contained runtime 10.0.14, exact SDK2.0.1, network-none task container. Retained managed memory ~20.5MB, descriptors189, PKI descriptors0, cached stores2, and all logical collections remained bounded/zero. Test exit1 and launcher validation failed; no completion or two-hour pass exists. Evidence: /tmp/opcua2-server-linux-full-20261110/{result.json,source.json} and task/{soak.jsonl,results/soak.trx} (selected sanitized receipts will be checked in).

This broadens the finding beyond macOS. Mac controls prove retained native Apple Security objects from repeated private-key PFX imports and SDK copies, but do not yet attribute the complete workload RSS growth; both client and server share the measured process. Astra found no safe narrow public copy-policy seam in exact SDK2.0.1 and advises against substituting channel/session factories merely to pass this gate. No production workaround or resource-budget change has been applied. Independent Linux production Shared/driver/browser two-hour run remains active and cannot replace this failed workload. #782 G4 remains open.

The unchanged Linux ARM64 full server/node-manager workload also failed the original RSS guard: cycle 248, 61 restarts, 903.508 seconds; RSS 353,931,264 bytes >351,850,496 (cycle-3 baseline +128MiB). Self-contained runtime 10.0.14, exact SDK2.0.1, network-none task container. Retained managed memory ~20.5MB, descriptors189, PKI descriptors0, cached stores2, and all logical collections remained bounded/zero. Test exit1 and launcher validation failed; no completion or two-hour pass exists. Evidence: `/tmp/opcua2-server-linux-full-20261110/{result.json,source.json}` and `task/{soak.jsonl,results/soak.trx}` (selected sanitized receipts will be checked in). This broadens the finding beyond macOS. Mac controls prove retained native Apple Security objects from repeated private-key PFX imports and SDK copies, but do not yet attribute the complete workload RSS growth; both client and server share the measured process. Astra found no safe narrow public copy-policy seam in exact SDK2.0.1 and advises against substituting channel/session factories merely to pass this gate. No production workaround or resource-budget change has been applied. Independent Linux production Shared/driver/browser two-hour run remains active and cannot replace this failed workload. #782 G4 remains open.
dohertj2 changed title from SDK2 validation: repeated-server soak exceeds RSS growth guard after 250 cycles to SDK2 validation: client/server lifecycle soak exceeds RSS guard on macOS and Linux 2026-11-10 13:28:57 -05:00
dohertj2 added the type:review-finding label 2026-11-10 13:29:59 -05:00
Author
Owner

The fixed, prospectively Astra-reviewed canonical candidate saturation diagnostic is complete:384 lifecycle cycles/96 restarts plus one settling cycle in1,425.242s, within the1,800s cutoff. Both fixed windows321–352 and353–384 and the entire continuous attached interval had zero generated-factory JIT/load events, zero new SDK assembly loads and zero lost events. Shutdown ownership checks passed. Other JIT287; summed CLR MethodSize60,760bytes, not RSS/PSS.

The original cold failure remains: at cycle248 RSS362,409,984 >358,838,272bytes (cycle3+128MiB). The first assertion was rethrown; test/container/launcher exit1, one executed failed lifecycle test, no ordinary complete/two-hour result. Readiness=true is restricted to the selected generated-factory criterion; it is not G4 acceptance or a replacement baseline.

Exact source2738d7cc, SDK2.0.1/HG1.0.0, target and observer self-contained LinuxARM64 runtime10.0.14. Astra verified all1,275 immutable bundle files,1,064 module identities and6/6 Linux provider/protocol controls before launch. OPCUA_CERTIFICATE_LEAK_TRACKING=1 adds allocation StackTrace/tracker overhead; this is instrumented diagnostic evidence, not an uninstrumented performance denominator.

Versioned scoped result and hashed receipts. Prior cold failures and continued macOS native certificate-object retention are unchanged. No budget, factory/runtime setting, production crypto implementation or acceptance baseline was changed.

The independent actual production client/driver/browser lifecycle completed7,200.984s/5,420cycles/43,360manager disposals with zero weak survivors/PKI FDs; its client-only pass does not replace this failed workload. A diagnostic original-SDK canonical adapter is being prepared to examine matched coverage; original1.5 lacks SDK2 certificate-manager disposal observables, which will be reported explicitly rather than fabricated as zeros. #799 stays OPEN/failed; no release approval.

The fixed, prospectively Astra-reviewed **canonical candidate** saturation diagnostic is complete:384 lifecycle cycles/96 restarts plus one settling cycle in1,425.242s, within the1,800s cutoff. Both fixed windows321–352 and353–384 and the entire continuous attached interval had zero generated-factory JIT/load events, zero new SDK assembly loads and zero lost events. Shutdown ownership checks passed. Other JIT287; summed CLR MethodSize60,760bytes, not RSS/PSS. **The original cold failure remains:** at cycle248 RSS362,409,984 >358,838,272bytes (cycle3+128MiB). The first assertion was rethrown; test/container/launcher exit1, one executed failed lifecycle test, no ordinary complete/two-hour result. Readiness=true is restricted to the selected generated-factory criterion; it is not G4 acceptance or a replacement baseline. Exact source2738d7cc, SDK2.0.1/HG1.0.0, target and observer self-contained LinuxARM64 runtime10.0.14. Astra verified all1,275 immutable bundle files,1,064 module identities and6/6 Linux provider/protocol controls before launch. OPCUA_CERTIFICATE_LEAK_TRACKING=1 adds allocation StackTrace/tracker overhead; this is instrumented diagnostic evidence, not an uninstrumented performance denominator. [Versioned scoped result and hashed receipts](https://gitea.dohertylan.com/dohertj2/lmxopcua/src/commit/4a04806d/docs/plans/evidence/2026-11-10-opcua2/saturation-candidate.md). Prior cold failures and continued macOS native certificate-object retention are unchanged. No budget, factory/runtime setting, production crypto implementation or acceptance baseline was changed. The independent actual production client/driver/browser lifecycle completed7,200.984s/5,420cycles/43,360manager disposals with zero weak survivors/PKI FDs; its client-only pass does not replace this failed workload. A diagnostic original-SDK canonical adapter is being prepared to examine matched coverage; original1.5 lacks SDK2 certificate-manager disposal observables, which will be reported explicitly rather than fabricated as zeros. #799 stays OPEN/failed; no release approval.
Author
Owner

Follow-on #799 diagnostics are pushed on draft PR #802 at 2cf7c1d2; Astra reviewed the designs/code before execution and verified the raw results and selected evidence.

Candidate close ownership: final source564f1091, one browse/six history points, 1 executed/pass/no skips. Exact old-auth rejection BadSessionIdInvalid; old browse/history tokens denied while fresh positives work and invalid history never reaches the backend. All23 old-object weak witnesses collect with the same host live; all13 fixture/application/manager/core/store witnesses collect after normal shutdown. Two managers disposed, caches empty, PKI FDs0. Six affected history tests pass. Their initial launcher incorrectly expected7; original false guard receipt is retained with a separately reviewed4+2 source/TRX correction. Report and hashed receipts.

Native attribution remains unresolved: fixed200 configured-store acquisitions retain AppleDatabase inventory3→203 versus registry AddRefs3→3. After disposal+5s idle, both arms have0 SDK certificate owners, runtime temporary-keychain owners/files, keychain FDs and PKI FDs. Installed runtime does call CFRelease after native deletion. This does not prove missing managed disposal, native delete failure, complete RSS attribution or an application-safe fix. Registry substitution changes deliberate configured-store replacement semantics and was not adopted. Exact source/runtime map and control evidence.

The original-SDK semantic control is being examined separately: closed session/point witnesses collect, but a stopped server graph remains during the bounded observation. A pure Apple create/delete/release control is being prepared to isolate the native boundary. Neither investigation is a usable RSS denominator yet.

#799 stays OPEN; original cold RSS failures remain failed. No resource cap, SDK/factory/crypto architecture or acceptance baseline changed. No new long acceptance run was approved, no release approval and no deployment. Prospective resolution design, explicitly not launch approval.

Follow-on #799 diagnostics are pushed on draft PR #802 at **2cf7c1d2**; Astra reviewed the designs/code before execution and verified the raw results and selected evidence. **Candidate close ownership:** final source564f1091, one browse/six history points, 1 executed/pass/no skips. Exact old-auth rejection BadSessionIdInvalid; old browse/history tokens denied while fresh positives work and invalid history never reaches the backend. All23 old-object weak witnesses collect with the same host live; all13 fixture/application/manager/core/store witnesses collect after normal shutdown. Two managers disposed, caches empty, PKI FDs0. Six affected history tests pass. Their initial launcher incorrectly expected7; original false guard receipt is retained with a separately reviewed4+2 source/TRX correction. [Report and hashed receipts](https://gitea.dohertylan.com/dohertj2/lmxopcua/src/commit/2cf7c1d2/docs/plans/evidence/2026-11-10-opcua2/close-ownership-candidate.md). **Native attribution remains unresolved:** fixed200 configured-store acquisitions retain AppleDatabase inventory3→203 versus registry AddRefs3→3. After disposal+5s idle, both arms have0 SDK certificate owners, runtime temporary-keychain owners/files, keychain FDs and PKI FDs. Installed runtime does call CFRelease after native deletion. This does not prove missing managed disposal, native delete failure, complete RSS attribution or an application-safe fix. Registry substitution changes deliberate configured-store replacement semantics and was not adopted. [Exact source/runtime map and control evidence](https://gitea.dohertylan.com/dohertj2/lmxopcua/src/commit/2cf7c1d2/scripts/validation/opcua-lifecycle-memory/native-retention/README.md). The original-SDK semantic control is being examined separately: closed session/point witnesses collect, but a stopped server graph remains during the bounded observation. A pure Apple create/delete/release control is being prepared to isolate the native boundary. Neither investigation is a usable RSS denominator yet. **#799 stays OPEN; original cold RSS failures remain failed.** No resource cap, SDK/factory/crypto architecture or acceptance baseline changed. No new long acceptance run was approved, no release approval and no deployment. [Prospective resolution design, explicitly not launch approval](https://gitea.dohertylan.com/dohertj2/lmxopcua/src/commit/2cf7c1d2/scripts/validation/opcua-lifecycle-memory/RESOLUTION.md).
Author
Owner

Ownership repairs and native attribution are pushed on draft PR #802 at fbf73436. #799 remains open; these results do not pass the server RSS gate.

  • Original host: unchanged SDK1 publications reject old tokens and release closed-session/point objects with the same host live. Normal Stop retains five server graph objects; one separately controlled public Dispose releases them, timers7→2, with the original exit1 preserved. Exact source confirms the old host omitted terminal server disposal. The independent SDK1 repair is on master efb9197a, #807 closed, five RED→GREEN cases,1032 owning passes/1 existing skip. Frozen83 publications/oracles unchanged; no accepted RSS denominator.
  • SDK2 host: one owner now shares disposal completion and retains server/authentication state until shutdown; only a server not yet adopted by ApplicationInstance is directly disposed. Actual encrypted SessionClosing RED→GREEN and seven ownership tests pass. Integrated sourcece21f5db: whole solution0 warnings/errors,1122 server unit passes/1 existing skip,193 wire passes/3 existing opt-in diagnostic skips (including enabled weak close control and trusted/PKI checks). Astra verified source, TRX and hashes. Selected receipts.
  • Native boundary: empty-keychain create/delete/release stayed1→1. The corrected installed-bridge import child has no CLR or OPC UA SDK and retains AppleDatabase1→201 after200 imports and idle, despite2402/2402 returned CF refs and200/200 keychains released, zero owned files/FDs and unchanged fingerprints. This narrows reproduction to native import; it does not identify the retaining owner, exclusive RSS cause or safe application mitigation. Reproducer and receipts. Failed partial attempt A is preserved. A matched native deletion-order control is in implementation review.

The fixed7200s Linux late-slope procedure is approved for implementation only. It preserves the original cold baseline/caps, first failure and workload, and cannot emit acceptance. Actual code, controls and immutable artifacts require Astra review before launch. No new long acceptance run, baseline reset, SDK/factory substitution, merge or deployment. #782 G4 remains on HOLD.

Ownership repairs and native attribution are pushed on draft PR #802 at **fbf73436**. **#799 remains open**; these results do not pass the server RSS gate. - **Original host:** unchanged SDK1 publications reject old tokens and release closed-session/point objects with the same host live. Normal Stop retains five server graph objects; one separately controlled public Dispose releases them, timers7→2, with the original exit1 preserved. Exact source confirms the old host omitted terminal server disposal. The independent SDK1 repair is on master **efb9197a**, [#807 closed](https://gitea.dohertylan.com/dohertj2/lmxopcua/issues/807#issuecomment-10783), five RED→GREEN cases,1032 owning passes/1 existing skip. Frozen83 publications/oracles unchanged; no accepted RSS denominator. - **SDK2 host:** one owner now shares disposal completion and retains server/authentication state until shutdown; only a server not yet adopted by ApplicationInstance is directly disposed. Actual encrypted SessionClosing RED→GREEN and seven ownership tests pass. Integrated sourcece21f5db: whole solution0 warnings/errors,1122 server unit passes/1 existing skip,193 wire passes/3 existing opt-in diagnostic skips (including enabled weak close control and trusted/PKI checks). Astra verified source, TRX and hashes. [Selected receipts](https://gitea.dohertylan.com/dohertj2/lmxopcua/src/commit/fbf73436/docs/plans/evidence/2026-11-10-opcua2/disposal-ownership-integrated.json). - **Native boundary:** empty-keychain create/delete/release stayed1→1. The corrected installed-bridge import child has no CLR or OPC UA SDK and retains AppleDatabase1→201 after200 imports and idle, despite2402/2402 returned CF refs and200/200 keychains released, zero owned files/FDs and unchanged fingerprints. This narrows reproduction to native import; it does not identify the retaining owner, exclusive RSS cause or safe application mitigation. [Reproducer and receipts](https://gitea.dohertylan.com/dohertj2/lmxopcua/src/commit/fbf73436/scripts/validation/opcua-lifecycle-memory/native-retention/NATIVE_IMPORT.md). Failed partial attempt A is preserved. A matched native deletion-order control is in implementation review. The fixed7200s Linux late-slope procedure is approved for implementation only. It preserves the original cold baseline/caps, first failure and workload, and cannot emit acceptance. Actual code, controls and immutable artifacts require Astra review before launch. No new long acceptance run, baseline reset, SDK/factory substitution, merge or deployment. #782 G4 remains on HOLD.
Author
Owner

The single Astra-approved fixed 7,200-second Linux late-slope diagnostic is running (source b18f9723, SDK2.0.1/HG1.0.0, self-contained Linux ARM64 .NET10.0.14, bundle receipt f446a736…). Live mapped runtime and cycle-3 cold baseline are recorded. The same +64MiB managed/+128MiB RSS/+32 descriptor limits and first-rejection latch remain; all canonical operations and independent shutdown checks stay required. No warmed baseline or acceptance is being adopted.

The read-only startup failure is retained. The private /tmp correction preserves read-only root/app/tools; the corrected separate rehearsal passed 2/2 descriptor tests and 1/1 canonical test (16 cycles/4 restarts/60.053s), verified mapped CLR and cleanup. Protocol and linked receipts.

The final paired native control retained the same AppleDatabase inventory with both deletion orders. Astra reviewed the private upstream handoff; no supported application-only mitigation was found and nothing was posted upstream. #799/G4 remain open. A completed Linux diagnostic cannot resolve the macOS component or approve release.

The single Astra-approved fixed **7,200-second Linux late-slope diagnostic is running** (source `b18f9723`, SDK2.0.1/HG1.0.0, self-contained Linux ARM64 .NET10.0.14, bundle receipt `f446a736…`). Live mapped runtime and cycle-3 cold baseline are recorded. The same +64MiB managed/+128MiB RSS/+32 descriptor limits and first-rejection latch remain; all canonical operations and independent shutdown checks stay required. No warmed baseline or acceptance is being adopted. The read-only startup failure is retained. The private `/tmp` correction preserves read-only root/app/tools; the corrected separate rehearsal passed 2/2 descriptor tests and 1/1 canonical test (16 cycles/4 restarts/60.053s), verified mapped CLR and cleanup. [Protocol and linked receipts](https://gitea.dohertylan.com/dohertj2/lmxopcua/src/commit/1e4b017f/scripts/validation/opcua-lifecycle-memory/LATE_SLOPE.md). The final paired native control retained the same AppleDatabase inventory with both deletion orders. Astra reviewed the [private upstream handoff](https://gitea.dohertylan.com/dohertj2/lmxopcua/src/commit/1e4b017f/scripts/validation/opcua-lifecycle-memory/native-retention/PRIVATE_UPSTREAM_HANDOFF.md); no supported application-only mitigation was found and nothing was posted upstream. **#799/G4 remain open**. A completed Linux diagnostic cannot resolve the macOS component or approve release.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dohertj2/lmxopcua#799