ci: identify faulted node via sacct when the .out marker is missing - #1835
Conversation
|
Claude Code Review Head SHA: f1f9cce Files changed:
Findings:
|
There was a problem hiding this comment.
🟡 Changes recommended
The new sacct | head pipeline is unguarded under set -euo pipefail and can abort the resubmit flow on non-zero/SIGPIPE unless it’s made failure-tolerant (as in other sacct usages).
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This PR improves CI resilience for SLURM-based GitHub Actions jobs by ensuring a faulted compute node can still be identified and excluded from resubmission even when the job’s .out marker file is missing/unreadable (e.g., due to early job death or NFS latency).
Changes:
- Adds a fallback path to query SLURM accounting (
sacct) for the job’sNodeListwhenMFC_FAULT_NODE=cannot be read from the output file. - Filters out non-actionable
sacctnode outputs (empty,None…, ranges, comma-lists) before merging into the--excludelist.
File summaries
| File | Description |
|---|---|
| .github/scripts/submit-slurm-job.sh | Adds sacct fallback node identification to ensure resubmitted jobs avoid the same faulted node when .out is missing. |
Review details
- Files reviewed: 1/1 changed files
- Comments generated: 1
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| # 34183404644 exactly this way. sacct knows the node whether or not the | ||
| # .out exists, so identification no longer depends on the marker. | ||
| if [ -z "$faulted_node" ]; then | ||
| faulted_node=$(sacct -j "$job_id" -X -n -o NodeList 2>/dev/null | head -n1 | tr -d ' ') |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #1835 +/- ##
==========================================
+ Coverage 62.35% 62.81% +0.46%
==========================================
Files 84 84
Lines 21621 21975 +354
Branches 3199 3224 +25
==========================================
+ Hits 13482 13804 +322
- Misses 5939 5949 +10
- Partials 2200 2222 +22 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Problem
In run 34183404644 the Case Opt gpu-acc job hit a dead-GPU V100 (
atl1-1-02-006-34-0,cuInit returned error 999 CUDA_ERROR_UNKNOWN). Preflight correctly flagged it (exit 77) and resubmitted — but both attempts ran on the exact same node, so it exhausted the resubmit budget and red-crossed.Root cause
submit-slurm-job.shidentifies the faulted node only from theMFC_FAULT_NODE=marker in the job's.out:faulted_node=$(bash "$SCRIPT_DIR/node-exclude.sh" node-from "$output_file")When the job dies before its
.outis flushed / visible over NFS, the monitor reports "reached terminal state (FAILED) without creating output file",node-fromreturns empty, themergeadds nothing, and the--excludelist stays at the seed only. SLURM then re-schedules onto the same bad node. The logs show it plainly:failed preflight on an unidentified node…Excluding: <seed only>.Fix
Fall back to SLURM's own accounting when the marker is unreadable —
sacctknows the node whether or not the.outexists:Now the offending node is excluded on resubmit, so the retry lands elsewhere. With reliable identification, the existing
MFC_MAX_NODE_RESUBMITS=1budget gives one genuine retry on a different node — which would have turned this run green (both attempts were the same node).Notes / scope
--bind-to nonefix (ci: add --bind-to none to Phoenix syscheck smoke-test (fixes GPU-node MPI bind failure) #1834): that addressed a binding false-failure; this addresses a genuine bad node that wasn't being excluded.MFC_MAX_NODE_RESUBMITS=1. Riding out multiple distinct dead-GPU nodes would need a higher cap, but "two distinct bad nodes in a row after excluding the first" is a legitimate cluster-health signal — better surfaced than silently absorbed. Bad nodes should still be reported to PACE (e.g.atl1-1-02-006-34-0, still undrained).Verification
bash -nandpython3 toolchain/mfc/lint_source.pypass."",None assigned,atl1-[1-2]ranges, and comma-lists.