Repository navigation
ci: collect QEMU gates, add 32-vCPU SMP and split Extended lanes - #85
Conversation
The entrypoint tests ran the group with the full ambient environment, so an exported CI_GUEST_RETRIES=0 disabled the retry that two of them pin and made them fail on a correct entrypoint. Found during the f998237 baseline run, where the lanes export CI_GUEST_RETRIES=0.
Every guest gate runs to its full observation window, so one 180-minute job could not hold smp-8/16, ext3, seven 900-second stress profiles and iommu in series, and the guest retry of a failed stress group pushed it further over budget. The last three Extended runs failed or were cancelled at about three hours. The entrypoint gains extended-smp, extended-ext3 and extended-stress groups built from the same gate functions as the combined extended group, which keeps its order for local use. extended-stress runs one profile named by CI_STRESS_PROFILE and never retries a failed soak. The workflow runs one job per lane and OS with its own timeout, plus an aggregate result job. Durations, CPU counts and the profile set are unchanged. A drift test keeps one stress lane per default stress_test.sh profile.
Current-head CI and 32-vCPU SMP — 1667afcRun 42358985265 completed successfully on The 32-vCPU job returned QUALIFIED (3) in one attempt. Its downloaded
This tests 32 guest vCPUs on a standard runner reporting four host CPUs. It is functional topology coverage, not physical 32-core throughput. The gate runs once without automatic retry and fails a partial 32-CPU topology or missing/duplicate AP acknowledgement. The committed regression fixtures cover those cases and completion-mode collection. The new 32-vCPU Extended lanes retain full-window mode but have not been run on this head. Historical functional and Extended results below keep their original commit scope; STRESS-7 remains open. Historical functional CI — f90b448Regular CI run 42357546969 completed successfully on
Boot/runtime/SMP now take 40.9 seconds of gate execution, versus the former three mandatory 900-second windows. This excludes build/setup and reflects the explicitly changed observation scope, not a kernel execution speedup. These gates and musl/IOMMU activation required no retry. IOMMU's failure and device probes also PASS. The uploaded Functional completion covers the workload through synchronous PID 1 cleanup plus a two-second tail. It does not claim the former 900-second post-completion stability observation. Extended explicitly retains window mode and the stress profiles retain their full 900-second soak after READY. The regular workflow's manual The full Extended acceptance below is historical evidence for Historical Extended acceptance — 429d613Run 42348591710 completed on
Elapsed times cover job start through completion, including setup and artifact upload, but exclude queue time. IOMMU activation is QUALIFIED; both device and failure probes are PASS on both images. A successful Actions job that accepts exit 3 is not a strict guest PASS. Retained failure: Ubuntu 24.04 stress-block exhausted its existing 12 bounded writer/crash attempts without capturing an active Zero-Intent JBD2 tail. It returned The formerly interrupted Ubuntu 22.04 stress-smp lane now completed with QUALIFIED and an artifact. This outcome does not prove what caused the previous runner shutdowns. Parser repair: EXT-CI runtime acceptance is complete: each split lane returns evidence inside its budget, including a genuine failure. PR #85 remains unmerged for review. No guest window, CPU count, workload, heartbeat threshold or verdict rule was weakened. STRESS-7 remains open, and the 4-vCPU thread lanes do not satisfy #62's 16-vCPU requirement. Preserved historical acceptance and runner interruptions at 524e624Tested head: The first attempt produced 17 QUALIFIED guest verdicts, 2 FAIL verdicts, and 1 infrastructure-interrupted lane. A green job here accepts exit 3; it is not a strict guest PASS. Build steps passed. The workflow and its aggregate correctly remain failed.
IOMMU's activation gate is QUALIFIED; its device/failure probes are PASS. Times above include job setup and artifact upload. The longest completed lane took 40:37 against its 60-minute budget. The Ubuntu 22.04 Both failing gates report
These are retained FAIL outcomes. No duration, CPU count, profile, heartbeat threshold, or verdict parser was changed. This does not close STRESS-7. The thread results are the existing 4-vCPU scope and do not qualify the 16-vCPU requirement in #62. The same Ubuntu 22.04 stress-smp lane was interrupted again in attempt 2 after 17:34, and in attempt 3 after 18:22. Both received runner shutdown signals, cancelled the gate step and skipped artifact upload. Neither produced a guest verdict. The public job logs record runner shutdown and cancelled gate steps; they do not identify the underlying cause. |
Run the 8/16-vCPU suite once so its two 900-second observation windows leave time for build, log analysis and artifact upload. Preserve failures and report generation in both the dedicated and combined Extended entrypoints. Add failure/incomplete regressions that reject an automatic whole-suite retry even with CI_GUEST_RETRIES=1, and document the single-attempt policy.
Use a 3600-second default and upper bound only for the 32-vCPU gate, retaining the existing 900-second bounds for 8/16 vCPUs. Update the shared supervisor and receipt limit together. Allow 90 minutes for regular CI and 120 for Extended so setup, log analysis and upload have time beyond the guest deadline. Retain the single-attempt policy and final workload assertions. Cover topology-dependent defaults and bounds, workflow headroom, and controlled completion with a 3600-second receipt.
Problem and outcome
Finite QEMU checks currently wait for a mandatory 900-second observation window even after their guest has finished. This PR collects those checks after a verified PID 1 cleanup witness and a two-second diagnostic tail. The existing timeout becomes a maximum deadline; all final workload assertions and PASS / QUALIFIED / FAIL distinctions remain. An independent 32-vCPU SMP lane now checks the larger guest topology in regular CI and Extended.
Extended previously serialized its lanes inside one 180-minute job per OS. This PR also splits those lanes into independent jobs and scans multi-GiB stress diagnostics in bounded chunks, avoiding the reproduced whole-file reader memory failure.
Related issue or audit finding
Related: #63 (EXT-CI). Plan item: EXT-CI.
Design and scope
qemu_run.pyowns each functional QEMU process. It requires an ordered runtime summary, fixture result where applicable, consistent PID 1 exit evidence, and exactly oneCI-EXIT ... stage=teardown-completewitness. After two seconds it negotiates QMP, sendsquit, reaps QEMU, and records the exit status, timing, stop method and final serial-text hash.make test-smp-32coreexposes the same gate locally. Its guest CPUs share the host runner's CPUs; this is functional coverage, not physical 32-core throughput. The original 8/16-vCPU suite retains its qualification rules.completion. Manual dispatch acceptsqemu_gate_mode=windowfor the former full observation scope, including musl.QEMU_GATE_MODE=windowpreserves GNU timeout status 124, one TERM and no KILL.windowmode. Its 11 lanes × two Ubuntu images include the new independent 32-vCPU lane and preserve the existing lanes' CPU counts, guest durations, profiles and verdict rules; stress keeps the complete 900-second soak after READY. The 8/16-vCPU suite and stress lanes have no automatic retry. The combined localextendedentrypoint remains available and applies the same single-attempt SMP policy.The scope and receipt format are documented in scripts/ci/README.md.
Kernel safety and invariants
The kernel change is logging only. Completion results cover the workload through synchronous PID 1 cleanup plus the bounded tail; they do not claim the former 900-second post-completion observation coverage. Extended and explicit window mode retain that coverage. Old images without the new witness require window mode.
QUALIFIED remains distinct from PASS. No stress threshold is relaxed. The existing 4-vCPU thread lane does not qualify the 16-vCPU THREAD-HB requirement in #62.
Validation evidence
Current head:
28159ee5097fd5903eb4c9443c8af24c53f10829.CI_GUEST_RETRIES=1: all four subcases fail before the repair and pass after it. The focused local suite passed 15 tests, with shell syntax and whitespace checks passing.35dcb3e: 13 jobs successful; 32-vCPU and aggregate failed. The quality job passed 244 tests, zero failures/errors/skips. The 32-vCPU receipt records a 900-second deadline, 32/32 CPUs online, no completed runtime summary or full AP acknowledgement, QMP quit and no forced kill. Its interrupt trace is 22,338,066,065 bytes uncompressed. Increasing the deadline is a requested configuration change; it has not yet demonstrated completion of that workload.Previous-head regular CI, head
1667afcbefore the retry-budget repair:Historical functional validation, head
f90b448before the 32-vCPU lane:make lint,make fmt-check,make clippy, normal kernel build, and whitespace checks passed.f90b448: 14/14 jobs, including the aggregate; 12 artifacts uploaded. The quality job reports 238 tests, zero failures/errors/skips, and actionlint passed.Historical Extended acceptance, head
429d613before the completion change:Compatibility, performance, and rollout
Finite gates now finish when their recorded completion protocol finishes, bounded by the configured deadline (3600 seconds for 32 vCPUs; otherwise unchanged). Extended retains its full stability windows and per-lane job budgets. Actions' existing always-upload steps retain results after success or failure while the runner remains available.
Use
QEMU_GATE_MODE=windowor the regular workflow's manual window input to restore the former observation scope without changing the final workload assertions.Checklist