Skip to content

fix: stabilize native release candidate verification - #315

Open
YunaBraska wants to merge 8 commits into
mainfrom
ci/release-candidate-proof-20260930
Open

YunaBraska wants to merge 8 commits into
mainfrom
ci/release-candidate-proof-20260930

Conversation

@YunaBraska

@YunaBraska YunaBraska commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Change

Expose the existing prepare_publication input on manual Verify so the full release candidate can be checked without publishing. PR, snapshot and release policies are unchanged. Maven Central and Homebrew remain disabled.

Candidate checks exposed runtime and compiler-resource failures, addressed here:

  • Retain compiler diagnostics on failure or signals, report compiler CPU/RSS through the existing timing helper, and sample memory while compilation is running. The owned monitor and timer are reaped on completion and interruption; process arguments are not logged.
  • Protect both generated InetSocketAddress constructors through result publication. A concurrent GC could otherwise reclaim the new address before its caller rooted it. Reuse the existing runtime lock for these in-memory factories; blocking calls remain unlocked.
  • Use Clang by default for standalone and package-backed self-host sanitizer compilation, preserving explicit CC overrides. Normal package builds and other sanitizer checks keep their existing compiler and all sanitizer flags remain enabled.
  • Accept failed POSIX process-group setup only when the requested cleanup group already exists; preserve genuine denial and descendant timeout cleanup. macOS returned EPERM despite successful group creation in both parent and child paths.
  • Include tool, image, exit code and both output streams in JDK metadata extraction failures. Print the successful self-host sanitizer JSON so counters and probe scope remain available in CI logs.
  • Convert manual bootstrap-generation inputs to numbers before passing them to reusable jobs. GitHub otherwise rejects ARM64/macOS package jobs with Unexpected value '3' even though x64 succeeds.

No new scripts, runtime types, dependencies, or skipped required checks.

Evidence

  • ARM64 failure: AddressSanitizer reported an InetAddress use-after-free during HTTP server creation. The new concurrent-constructor CLI regression failed before the fix and passes after it.
  • Compiler resource evidence: GCC cc1 reached 15,410,424 KiB RSS on a 16,372,440 KiB host before runner shutdown. This proves severe memory pressure; the last complete OOM counter was zero, so it does not establish a kernel OOM kill. Linux Clang verification subsequently passed the full self-host sanitizer probes: compilation took 50 seconds at 366,952,448 bytes peak RSS, with no swap used.
  • 102 network integration tests plus the blocking-call code generation guard passed.
  • 129 focused workflow, packaging and constructor tests passed. The compiler-default regression failed before the change. Tests cover explicit overrides, compiler/probe failures, signals, cleanup, timing parsing, unavailable metrics, and monitor/timer reaping.
  • Five real HTTP loopback runs passed ASan/UBSan with forced GC, zero final live allocations/bytes, and the macOS leaks fallback.
  • The full local suite exposed one native JDK metadata failure among 7,105 tests. A standalone macOS process probe then captured seven group-setup errors in 10,000 launches, with the requested group already owned; repeating it with the ownership check produced zero failures in 10,000 launches. Four deterministic regressions failed before the fix. All five now pass, including genuine denial and descendant timeout cleanup.
  • 151 focused tests passed after the process fix, including all 38 packaging integration tests. Extraction-diagnostic and retained-report regressions also failed before their respective changes.
  • Full local ./mvnw -B clean verify passed on 9d2b6682: 7,114 tests, zero failures/errors, three skips, 25:34 elapsed. Compatibility generation passed and tracked status documents remained current. The subsequent two-file workflow/input regression change does not change compiler or runtime code.
  • Final-candidate full self-host sanitizer proof passed all five probes with leak detection enabled: 41,272,012 allocations, 18 collections, zero final live allocations/bytes/root frames/root entries. Its retained JSON records the full scope and Clang ASan/UBSan configuration. Compilation took 44 seconds at 367,206,400 bytes peak RSS.
  • Shell syntax, shellcheck -x -S warning on the changed scripts and git diff --check passed. Independent diff review found no remaining actionable findings.
  • The manual-input regression failed at all three reusable bindings before the correction. All 112 workflow/packaging tests and Actionlint on the affected workflows pass afterward. Whole-repository Actionlint still flags the existing queue: max syntax and intentionally disabled publisher conditions; neither is changed here.
  • CI then caught an obsolete raw-input assertion in the separate parallel-workflow suite. That duplicate expectation was removed; the new regression checks every normalized binding. The entire ./mvnw -B -Dexec.skip=true -Pquick verify suite passed: 4,621 tests, zero failures/errors, three skips, 2:17 elapsed. Superseded 3faaa1d3 runs were stopped after this confirmed failure to free runners; their logs remain available.
  • Final-candidate ./mvnw -B clean verify passed: 7,115 tests, zero failures/errors, three skips, 24:44 elapsed. Automatic compatibility generation passed without changes to tracked status reports.

Current candidate

Commit: 67f8beb4929c2f2e317bffaff1dd98fba5ca49f9.

  • PR verification: passed, including all three native packages; 30 successful jobs plus the intended disabled/skipped rows.
  • Full nonpublishing candidate verification: all three first-attempt package steps uploaded passing full rehearsal reports. Downloaded archives and sidecars pass their checksums; all reports identify the candidate, five completed checks and disabled publication. Linux import and sanitizer counters are verified. The macOS job then stalled in GitHub's Complete job phase from 19:53:56 UTC, after all project steps, uploads and post actions succeeded. It was cancelled at 20:38:50 UTC, beyond its configured 90-minute job timeout. Artifacts and job metadata are retained; GitHub did not finalize that job's log. Attempt two repeated the macOS package proof with debug logging on the unchanged commit and a different runner. All project steps, uploads and post actions passed again, but Complete job stalled from 21:29:43 UTC. GitHub cancelled the retry at 22:15:46 UTC with an annotation that the 90-minute limit was exceeded; dependent artifact staging was skipped. The second archive and sidecar were downloaded separately, checksum-checked and verified against the candidate and passing rehearsal report. Runner diagnostics and the retained macOS sanitizer log remain unavailable after cancellation. No project-owned process leak or runner defect is established; no cleanup has been disabled. Candidate acceptance remains blocked.
  • Three-platform build baselines: passed on the same commit. All three JSON reports were checked: three cold builds, three warm builds and one changed-source build; object cache counts are respectively 7/0, 0/7 and 1/6 rebuilt/reused. Cold example builds took 11-12 s on Linux x64, 21-22 s on Linux ARM64 and 17 s on macOS ARM64. These measure the example, not the preceding compiler bootstrap or whole workflow. Milestone acceptance still waits for full candidate verification.
  • Local full verification passed on this exact commit. A subsequent ./mvnw -B -Pquick verify also passed 4,621 tests with zero failures/errors and three skips in 2:26, including automatic compatibility refresh. An initial sandboxed invocation could not enumerate child processes; the authorized invocation passed without code or assertion changes. Candidate acceptance requires the missing diagnostics and a completed verification workflow; no third attempt has been started.

The PR is marked ready for review and its ordinary checks pass. Merge still waits for the complete candidate evidence and the latest required checks, including the repository's automatic ready-for-review run. No Release workflow has been dispatched and nothing has been published or merged by this PR.

@YunaBraska

Copy link
Copy Markdown
Contributor Author

The new manual entrypoint was exercised on commit 627adce with prepare_publication=true, snapshot=false, and bootstrap_generation=3.

The full self-host sanitizer job failed after about 5 minutes: https://github.com/NanoNative/javan/actions/runs/36724079108/job/109917247164

The log repeats the main-branch failure: Terminated, exit 143, and a runner shutdown signal during sanitizer compilation. This is not evidence of the configured 45-minute job timeout. Its cleanup trap removes the temporary compiler log, explaining the subsequent missing cc.err diagnostic. The cause of the runner shutdown remains unproven.

Normal PR CI and full local verification are still running. No release workflow was dispatched and no publisher is called by this candidate workflow. Keep candidate readiness unclaimed; the draft remains open pending review of the complete results.

@YunaBraska YunaBraska changed the title ci: expose nonpublishing release candidate verification fix: stabilize native release candidate verification Sep 30, 2026
@YunaBraska
YunaBraska marked this pull request as ready for review September 30, 2026 18:43

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant