myxce/src
Rongsong Shen f7b732a300
fix(controller): WAL_JOB_RUSAGE loses job.run_usage on replay (bug-1690)
Same class as bug-1678/1687/1689: the WAL fact for WAL_JOB_RUSAGE only
carried {jobid, state}, so job.run_usage (client-reported per-host
CPU/mem usage) was never restored on either apply seam after a restart.

Unlike the prior three, xce_job_runusage_t/xce_host_runusage_t had no
existing Cap'n Proto mapping -- a genuine new schema addition
(HostRunusage/JobRunusage in controller.capnp, mirroring JobPendReason's
List(NestedStruct)+$C.maplistcount style), verified against the real
struct definitions in types.h, codegen confirmed via nm on the built
binary rather than assumed.

Two deliberate deviations from the established precedent, found by
reading the real code rather than copying the pattern blindly:

1. Adoption is unconditional, not gated on a state transition -- a
   rusage report almost never changes job.state (repeat reports keep
   state at RUN), so gating on JOB_TRANSITION_APPLIED like START/FINISH/
   DISPATCH do would make the fix dead code for the realistic case.

2. Merge, not free-and-replace. update_host_runusage() builds run_usage
   with host_name sourced from makeString() -- an RTTI-managed pointer,
   not malloc() -- and the primary's own live apply pump re-applies every
   fact it just wrote. A naive free_JobRunusage_ptr()-then-adopt (matching
   the prior three fixes exactly) would free() a non-malloc'd pointer on
   the very first live rusage report for a new host -- guaranteed heap
   corruption. Fixed with merge_job_runusage(): existing hosts get
   scalar-only in-place updates (host_name pointer never touched), only
   genuinely new hosts adopt their freshly-decoded (safe, malloc'd)
   host_name. Proved via a real makeString()-backed test asserting
   pointer identity survives, not just value equality. job_destroy()
   (src/lib/jobj.c) was found to have this identical latent mismatch,
   pre-existing and independent of this fix -- flagged, not fixed here.

Found by an /xce-audit-invariants controller pass (field-complete apply
parity dimension). 8 new tests in test_wal_job_rusage_fact.c; RED/GREEN
independently verified. Full controller suite: 1160 tests, 2 failures --
both the pre-existing, unrelated bug-1561 overlayfs sandbox flake. No
ASAN/heap-corruption findings. Backward compatibility confirmed for
old-format bare-payload entries.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AgYRU3zDTqNGV5Jk8aiKLg
2026-08-25 10:53:32 +00:00
..
autoscaler support shared libxce(for api server) 2026-01-19 11:02:49 +08:00
configs fix(controller): close 6 data-safety races + apply-pump O(N^2) regression + boot TOCTOU 2026-08-16 10:20:02 +00:00
controller fix(controller): WAL_JOB_RUSAGE loses job.run_usage on replay (bug-1690) 2026-08-25 10:53:32 +00:00
docs update documents 2026-08-10 17:51:51 +08:00
frontend fix(apiserver): FilterRows must not route non-bitmask operators through bitmask matching (bug-1680) 2026-08-25 04:04:08 +00:00
include fix(controller): WAL_JOB_RUSAGE loses job.run_usage on replay (bug-1690) 2026-08-25 10:53:32 +00:00
lib fix(lib): thread from_host through the wire format and the job-submit interning object (bug-1676, gitea #44) 2026-08-24 15:14:42 +00:00
nixSupport feat(dirty-content-fingerprint): Nix flake computes fingerprint via self.narHash 2026-08-21 04:57:56 +00:00
scheduler fix(scheduler): invalidate stale builtin_fcfs picker cursors across calls (bug-1686) 2026-08-25 08:49:43 +00:00
schema fix(controller): WAL_JOB_RUSAGE loses job.run_usage on replay (bug-1690) 2026-08-25 10:53:32 +00:00
tools test(dirty-content-fingerprint): add Nix production path fingerprint check 2026-08-21 11:12:15 +00:00
worker fix(worker): job ids print human-readable format via fmt_jobid() (bug-1588) 2026-08-22 02:42:01 +00:00
xceadmin feat(dirty-content-fingerprint): xceadmin shows fingerprint in --version 2026-08-21 09:20:27 +00:00
flake.lock fix librtti package leak issue 2026-07-27 15:31:50 +08:00
flake.nix feat(dirty-content-fingerprint): Nix flake computes fingerprint via self.narHash 2026-08-21 04:57:56 +00:00
meson.build feat(dirty-content-fingerprint): add dirty_fingerprint meson option and C define 2026-08-21 03:54:37 +00:00
meson.options feat(dirty-content-fingerprint): add dirty_fingerprint meson option and C define 2026-08-21 03:54:37 +00:00