myxce/.wolf/bugs/bug-1736.md
Rongsong Shen 6eaccc7476
docs(buglog): bug-1736 fixed (6df644e6); bug-1902 recurred
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-02 04:15:04 +00:00

5.5 KiB

id status status_updated status_note component severity timestamp last_seen occurrences files tags related fix_commits legacy
bug-1736 fixed 2026-10-02 controller unknown 2026-08-30T10:45:00Z 2026-09-19T09:00:00Z 1
src/worker/src/xcecd_cgroups.c (collect_job_rusages -- already sends memory_swap/tasks_current
no controller-side field to receive them)
src/include/xce/types.h (xce_host_runusage_t -- would need new fields for swap/task-count; xce_job_runusage_t -- the peak/efficiency fields with no producer)
src/controller/misc.c (update_host_runusage -- would need new parse branches)
src/controller/job.c (update_job_rusages -- same open FIXME as bug-1735
this is the other half of what it would need to cover)
worker
controller
resource-usage
rusage
display-only
reporting-only
priority-low
split-2026-08-30
no-scheduling-impact
static-analysis-only
unreproduced-in-sandbox
needs-design-not-just-fix
peak-cpu-time-fixed
swap-taskcount-fixed
efficiency-fields-remain-scope-decision
bug-1735
5c2c6664
6df644e6
true

bug-1736: job CPU peak and efficiency usage fields are never computed

Description

PRIORITY: LOW -- display/reporting only, not consumed by any scheduling logic. Split 2026-08-30 from bug-1735 at user request: the 'statistics-only' half of that finding -- resource usage fields with no scheduling relevance, purely for operator-facing job accounting/reporting (bjobs -l/bhist-style views), as opposed to bug-1735's memory+CPU-time core, which is a prerequisite for future scheduling decisions. Worker (collect_job_rusages(), xcecd_cgroups.c) already measures and sends 'memory_swap' and 'tasks_current' per job, but the controller has NO field to receive them at all (xce_host_runusage_t only has cpu_time/mem_usage -- no swap or task-count field exists) -- these two are silently dropped entirely, not just misnamed. Separately, xce_job_runusage_t's peak/efficiency fields (peak_cpu_time, peak_cpu_duration, mem_efficiency, avg_cpu_efficiency, peak_cpu_efficiency) have no computation logic anywhere in the codebase (grepped) -- nothing populates them, ever, regardless of bug-1735's fix.

Environment

Not recorded (migrated from buglog.json).

Reproduction

Not recorded (migrated from buglog.json).

Root cause

See bug-1735's root_cause for the full original investigation (resname-mismatch mechanism, environment-limitation note re: this session's sandbox having no real cgroup-backed worker to live-verify against) -- this entry covers only the subset of that finding split out as lower-priority. Unlike bug-1735's memory/cpu_time (which have existing-but-mismatched fields), memory_swap/tasks_current have NO receiving field in xce_host_runusage_t at all -- the worker's measurement is a complete dead end on the controller side, not a naming mismatch. The peak/efficiency fields (xce_job_runusage_t's own top-level fields) are simply never computed by anything, anywhere -- confirmed via grep, no partial implementation exists to build on.

Fix

(1) memory_swap/tasks_current and (2) peak_cpu_time-as-running-max -- 2026-08-30, 5c2c6664 (see git history).

(3) 6df644e6, 2026-10-01: the remaining fields, with LSF bjobs -l definitions (chosen by the user). update_job_cpu_stats() (src/controller/misc.c), called by update_job_rusages() (job.c) after each report:

  • each host's cpu_rate = CPU-seconds gained / wall seconds since that host's previous report (sample_time); the job's cores = sum over its hosts. A report no later than the previous one, or with a CPU counter that went backwards, leaves the rate alone.
  • peak_cpu = highest job cores seen; peak_cpu_time = it rounded (the wire field is Int32); peak_cpu_duration = the interval that set it. This replaces the earlier peak_cpu_time = running max of cumulative CPU seconds, which only duplicated cpu_time.
  • avg_cpu_efficiency = cpu_time / elapsed since start / allocated slots; peak_cpu_efficiency = peak_cpu / slots; mem_efficiency = highest used_mem / the job-wide rusage[mem] request (calc_wanted_job_total_resval, per task by default, as the scheduler reserves it); all in percent, as the apiserver/xcecli models document; 0 when there is no slot count or no memory request (or the request is not a single primary one). New persisted fields HostRunusage.sampleTime/cpuRate and JobRunusage.peakCpu are appended to controller.capnp (old WAL entries still decode) and copied by merge_job_runusage(). The values are controller-side only: the apiserver does not map run usage into its job model and xcecli/harness do not display these fields.

Verification

  • Test: test_cpu_stats_* (rate/peak/duration/efficiency, multi-host sum, mem efficiency as a peak, guards) and test_aggregate_job_runusage_leaves_peak_cpu_alone in src/controller/testsuite/test_host_runusage.c (11/11; written before update_job_cpu_stats() existed); WAL round trip of the new fields added to test_wal_job_rusage_fact.c, and the existing-host merge test test_wru_apply_committed_entry_merges_without_freeing_live_host: RED with the new merge_job_runusage() lines removed (Expected 3.25 Was 0), GREEN with them
  • Suites: controller_unit_test 1275/1275; xce-build.sh all asan build.jai 126/127 -- the one failure was the known intermittent harness pty timeout bug-1902 (recurrence recorded; 3/3 reruns pass)
  • Live: n/a (no consumer displays these fields; the computation is unit-tested against the same report sequence update_job_rusages() applies)

References

  • Related: bug-1735