ci: run Frontier CI on the g1 partition, and raise the queue-wait budget to 4h - #1767
Merged
sbryngelson merged 3 commits intoAug 27, 2026
Merged
Conversation
Frontier CI jobs went to `batch`, where they queue behind the rest of the machine; a full matrix routinely sat pending for a long time before any node was handed over. `g1` is a dedicated 64-node carve-out (`frontier10177-10240`). Those nodes belong to `g1` only and are not part of `batch`, so CI starts promptly instead of competing for the general pool. The nodes are otherwise ordinary Frontier hardware -- `Gres=gpu:8`, 112 allocatable cores -- so the GPU (`acc`/`omp`) and CPU matrices run unchanged. Point both the CPU and GPU device blocks at `g1` for `frontier` and `frontier_amd`. Everything else about the job header is untouched: `--stepmgr`, `--qos=normal`, `-N 1`, and the 01:59:00 walltime all carry over, and the 2-day cap on `g1` leaves that walltime well inside the limit. The QOS deliberately stays `normal`. `g1` carries a partition QOS that is also named `g1`, which slurmctld applies on its own once a job lands in the partition; requesting it explicitly fails, since CFD154 holds no association with it. A comment records this so the next reader does not "fix" the partition change by adding `--qos=g1`. Verified by stubbing `sbatch` to capture the generated header and running each one through `sbatch --test-only` against the live controller. All four combinations (frontier/frontier_amd x cpu/gpu) are accepted and schedule immediately onto g1. One tradeoff worth watching: the `g1` QOS caps a user at 16 running nodes (`MaxTRESPU=node=16`), against a measured peak of 25 concurrent CI jobs, so a full matrix will run in roughly two waves. If the dedicated-node speedup does not net out ahead of that throttle, `-p g1,batch` on the non-bench jobs is the fallback. Claude-Session: https://claude.ai/code/session_01RPGyAS6S7BRDELsANWaBpR
Contributor
There was a problem hiding this comment.
Pull request overview
This PR updates the Frontier CI SLURM submission header generation to target the dedicated g1 partition (instead of batch) so CI jobs start sooner, and documents the partition QoS behavior to prevent incorrect --qos=g1 additions.
Changes:
- Switch Frontier/Frontier-AMD CPU and GPU job submissions from
#SBATCH -p batchto#SBATCH -p g1. - Expand inline documentation explaining why
--qos=normalmust remain and why--qos=g1should not be requested.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
The 90-minute budget was sized against Phoenix's preemptible `embers` QOS, where the failure it guards against is a job that sits PENDING indefinitely. Applied as a global default, it also lands on Frontier, whose `batch` partition has a much longer and fatter wait distribution -- so routine queue pressure started surfacing as red CI. Measured over one week of MFC CI jobs on Frontier `batch` (n=1230 that eventually started): p50=1m, p75=22m, p90=96m, p95=176m, max=466m. A 90m budget sits at roughly p89 and tripped 11% of those jobs, and that undercounts -- a further 162 jobs over three days never started at all. The result reads as a test failure on the PR even though the message correctly says it is not. Raise the default to 4h. That clears p95 with margin while staying well inside the job-level `timeout-minutes: 480`, which remains the real backstop, and it keeps the bound finite so a wedged `embers` job still cannot hold a runner slot indefinitely. `SLURM_MAX_QUEUE_SECONDS` remains overridable per workflow, and 0 still means wait forever. Claude-Session: https://claude.ai/code/session_01RPGyAS6S7BRDELsANWaBpR
sbryngelson
changed the base branch from
master
to
ci/phoenix-queue-timeout-combined-alloc
August 27, 2026 00:07
sbryngelson
merged commit Aug 27, 2026
28545a4
into
ci/phoenix-queue-timeout-combined-alloc
20 checks passed
sbryngelson
added a commit
that referenced
this pull request
Aug 27, 2026
…llocation (#1763) * ci(phoenix): bound SLURM queue wait and combine build+test into one allocation Phoenix CI jobs were failing as opaque ~8h 'cancelled': jobs sat PENDING for hours on the preemptible 'embers' QOS, burning the 480-min job timeout and holding self-hosted runner slots (which backs up unrelated PRs). A) monitor_slurm_job.sh: bound the queue wait (SLURM_MAX_QUEUE_SECONDS, default 90m). If a job never starts, scancel and fail fast with an explicit 'queue starvation — infrastructure, not code' message and exit 75. A RUNNING job with a merely NFS-delayed output file is exempt. B) Phoenix builds+tests in a single SLURM allocation (build-and-test.sh) so the scheduler queue wait is paid once instead of twice. submit-slurm-job.sh exports job_* so the child scripts inherit them; adds a 'buildtest' time budget (3h30m). Other clusters keep the separate build/test steps. * ci: fall back buildtest_time to test_time for non-phoenix clusters Addresses review: buildtest_time was only defined in the phoenix cluster config, so a build-and-test.sh submission on any other cluster would hit an unbound-variable crash under 'set -u'. Use ${buildtest_time:-$test_time} so the combined job type is safe on every cluster (only phoenix uses it today). * ci: reject non-integer SLURM_MAX_QUEUE_SECONDS instead of silently disabling A mistyped override (e.g. '90m') would make the '[ -gt ]' comparison fail its if-condition and silently skip the queue-wait budget — disabling the feature without warning. Validate up front and exit 1 with a clear message. * ci: trim verbose comments in Phoenix CI changes * ci: fix Print Logs failing on Phoenix combined jobs The 'Print Logs' loop used '[ -f ] && ...', whose last iteration returns non-zero when the file is absent. On Phoenix combined jobs the loop ends with test_slug.out, which never exists (Phoenix now emits build-and-test-*.out), so under 'bash -e' the step exited 1 — failing every Phoenix job, even successful ones. Use 'if [ -f ]' so a missing file is skipped without failing the step. * ci: run Frontier CI on the g1 partition, and raise the queue-wait budget to 4h (#1767)
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## ci/phoenix-queue-timeout-combined-alloc #1767 +/- ##
========================================================================
Coverage 61.67% 61.67%
========================================================================
Files 84 84
Lines 21619 21619
Branches 3196 3196
========================================================================
Hits 13334 13334
Misses 6093 6093
Partials 2192 2192 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two related fixes for Frontier CI reliability.
1. Run Frontier CI on the
g1partitionFrontier CI jobs are submitted to
batch, where they queue behind the rest of the machine. A full matrix routinely sits pending for a long stretch before any node is handed over.g1is a dedicated 64-node carve-out (frontier10177-10240). Those nodes belong tog1only and are not part ofbatch, so CI starts promptly instead of competing for the general pool. They are otherwise ordinary Frontier hardware —Gres=gpu:8, 112 allocatable cores — so both the GPU (acc/omp) and CPU matrices run unchanged.This points the CPU and GPU device blocks at
g1forfrontierandfrontier_amd. Nothing else about the job header changes:--stepmgr,--qos=normal,-N 1, and the01:59:00walltime all carry over, comfortably insideg1's 2-day cap.The QOS deliberately stays
normalg1carries a partition QOS that is also namedg1. slurmctld applies it on its own once a job lands in the partition — requesting it explicitly fails, because CFD154 holds no association with it:A comment in the script records this, so the next reader doesn't "fix" the partition change by adding
--qos=g1.2. Raise the queue-wait budget to 4h for all clusters
#1763's
SLURM_MAX_QUEUE_SECONDS:=5400was sized against Phoenix's preemptibleembersQOS, where the failure it guards against is a job that sits PENDING indefinitely. As a global default it also lands on Frontier, whosebatchwaits are much longer and fatter — so routine queue pressure surfaces as red CI. That is what thisbench-gpu-ompfailure is: job 5351071 sat inbatchfor the full 90 minutes and was cancelled,Elapsed=00:00:00.One week of MFC CI jobs on Frontier
batch(n=1230 that eventually started):A 90m budget sits at roughly p89 and tripped 11% of those jobs — and that undercounts, since a further 162 jobs over three days never started at all.
4h clears p95 with margin, stays well inside the job-level
timeout-minutes: 480that remains the real backstop, and keeps the bound finite so a wedgedembersjob still can't hold a runner slot forever.SLURM_MAX_QUEUE_SECONDSis still overridable per workflow, and0still means wait indefinitely.This matters even with
g1in place: theg1QOS caps a user at 16 running nodes (MaxTRESPU=node=16) against a measured peak of 25 concurrent CI jobs, so a full matrix runs in about two waves and wave-2 bench jobs can legitimately wait behind a01:59:00allocation.Verification
I stubbed
sbatchonPATHto capture the header the script actually generates, then ran each captured header throughsbatch --test-onlyagainst the live controller. All eight combinations —frontier/frontier_amd×cpu/gpu×test/build-and-test(the new job type from #1763) — are accepted and schedule immediately ontog1:CPU headers are identical apart from
-n 32. Phoenix is untouched — its dynamicselect-gpu-partition.shpath is unaffected, and it keeps the same budget semantics, just with a longer default.https://claude.ai/code/session_01RPGyAS6S7BRDELsANWaBpR