myxce/.wolf/bugs/bug-1888.md
Rongsong Shen 7b001cb0f7
chore(buglog): bug-1885..1889 fixed
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 10:35:43 +00:00

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
src/scheduler/src/snapshot_wire.c
src/scheduler/src/snapshot_load.c
scheduler
snapshot
persistence
resreq
bug-1887
077b1213

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

  1. Build the scheduler tests; run src/xce.build.discrete/scheduler/testsuite/sched_snapshot_save_load_test at a commit before 077b1213 with test_snapshot_round_trip_keeps_job_resreq_text added.
  2. 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