3.4 KiB
| id | status | status_updated | status_note | component | severity | timestamp | last_seen | occurrences | files | tags | related | fix_commits | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| bug-1888 | fixed | 2026-09-29 | scheduler | wrong-result | 2026-09-29T10:32:13Z | 2026-09-29T10:32:13Z | 1 |
|
|
|
|
bug-1888: snapshots save a job's resreq as a debug dump; restored jobs lose select and rusage
Description
Observed: saving a snapshot of a pending job whose resreq is rusage[mem=2] stores submit->resreq as
Primary:
Tasks: min = 1, max = 1
Rusages:
res mem value 2.000000 per 3 duration -1.000000 decay 0
and the loaded job has no rusage (and no select). With bug-1887 fixed the loader rejects that text outright (snapshot tests failed: "parse_resreq failed for jobid 201: Primary: ...").
Expected: the snapshot stores the resreq text the job was submitted with, and the restored job parses to the same request.
Impact: wrong result: every job restored from a snapshot -- a .replay start snapshot (simulator replays), REPL snapshots -- lost its select and rusage, so replays of sessions with pending jobs at snapshot time could decide differently from the live scheduler. A save/restore field-completeness violation (persistence.md).
Found by: test (while fixing bug-1887, 2026-09-29)
Environment
- OS: no /etc/os-release; Docker container; NixOS kernel; kernel Linux 6.18.33 x86_64
- libc: glibc 2.42-47 (interpreter /nix/store/wb6rhpznjfczwlwx23zmdrrw74bayxw4-glibc-2.42-47/lib/ld-linux-x86-64.so.2)
- Toolchain: gcc (GCC) 15.2.0, meson 1.9.1
- Build: asan (src/xce.build.discrete)
- Code: scheduler-framework @ 9c51de88-dirty
- Deployment: n/a (unit test)
Reproduction
- Build the scheduler tests; run
src/xce.build.discrete/scheduler/testsuite/sched_snapshot_save_load_testat a commit before077b1213with test_snapshot_round_trip_keeps_job_resreq_text added. - Observe the saved text is the dump, not
rusage[mem=2].
- Frequency: deterministic
- Evidence: test output quoted above
Root cause
build_wire_job() (snapshot_wire.c) filled submit->resreq with format_resreq(), a human-readable debug dump, because the scheduler job kept only the parsed resreq, not its text. The loader's parser accepted the dump as a primary with neither select nor rusage (the bug-1887 leniency).
Fix
xce_sched_job_t keeps the resreq text (resreq_str, set at ingest, JOB_UPDATE and snapshot load, freed at teardown) and the snapshot saves it; a job without it restores as the loader's "type == any" default (077b1213).
Verification
- Test: test_snapshot_round_trip_keeps_job_resreq_text in src/scheduler/testsuite/test_snapshot_save_load.c (push a job with rusage[mem=2], save, load into a second core): RED before (saved text was the dump), GREEN after (text kept, restored rusage count 1)
- Suites: ASAN debug build (src/xce.build.discrete),
meson test --no-suite xceadmin: 117/117 OK, 0 sanitizer reports; xcelib_test 695 tests 0 failures (2026-09-29) - Live: 3-round sequential HA soak on rebuilt ASAN binaries (/home/claude/tmp/xce-bug1885-soak, 2026-09-29): PASS, 15 jobs, zero job loss, all 3 nodes led; SIMVERIFY 4 files 0 mismatches; each recording replays with detect_leaks=1 at exit 0, 0 mismatches; no sanitizer report in the scheduler or controller stderr
References
- Related: none