No description
Find a file
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
.claude docs(steering): add Decision Log fidelity as controller audit dimension 8 2026-08-25 07:49:37 +00:00
.kiro docs(steering): add field-complete apply-parity invariant; extend xce-audit-invariants 2026-08-25 06:40:20 +00:00
.wolf fix(controller): WAL_JOB_RUSAGE loses job.run_usage on replay (bug-1690) 2026-08-25 10:53:32 +00:00
docs/superpowers/plans update documents 2026-08-10 17:51:51 +08:00
raft chore: checkpoint all prior work for clean state 2026-06-04 13:04:16 +00:00
reports chore(specs): add scheduler-sim-eager-reconciliation spec, weekly report, cross-spec sequencing notes 2026-08-24 12:56:35 +00:00
scripts fix(gitea-sync): unwrap buglog.json's {version,bugs} wrapper before iterating (bug-1677) 2026-08-24 14:23:31 +00:00
src fix(controller): WAL_JOB_RUSAGE loses job.run_usage on replay (bug-1690) 2026-08-25 10:53:32 +00:00
.clang-format reformat code and job array 2025-11-07 16:14:27 +08:00
.gitignore chore: gitignore generated capnp-c codegen output 2026-08-24 13:05:49 +00:00
.mcp.json checkpoint: bug-851 root cause + raft TLA+ conformance spec family 2026-06-21 14:02:15 +00:00
.opencode.json checkpoint: bug-851 root cause + raft TLA+ conformance spec family 2026-06-21 14:02:15 +00:00
CLAUDE.md update documents 2026-08-10 17:51:51 +08:00
README.md save works 2026-03-03 16:49:26 +08:00

1. commit 规则

  • 每个人 fork 自己的 branch, 从自己的 branch 做 PR,review 完再 commit

2. code format

2.1. C

推荐使用 clang-format,公共配置放在源码里面 xce/.clang-format

(理论上直接使用源码里面 xce/.clang-format 文件格式不会变)

2.1.1. vscode 可以在配置中加上如下内容

"C_Cpp.clang_format_style": "WebKit",
"C_Cpp.clang_format_fallbackStyle": "WebKit",

2.1.2. vim & emacs

clang-format -style="{BasedOnStyle: webkit}" -i XX.c

2.2. golang

使用默认 gofmt

3. build environment and build (example of ubuntu)

3.1 build environment

  • Install nix package management tool
sh <(curl -L https://nixos.org/nix/install) --daemon
  • Edit /etc/nix/nix.conf to make sure
experimental-features = nix-command flakes
sandbox = true
sandbox-fallback = false
substituters = https://mirrors.ustc.edu.cn/nix-channels/store https://cache.nixos.org https://cache.nixos.org/
trusted-users = root <your account>

make sure that you have restarted nix-daemon service after you have changed /etc/nix/nix.conf

  • Install socat and config ssh (for clone by ssh protocol)
nix profile add nixpkgs#socat

.ssh/config

Host gitea.shenrs.eu
	HostName gitea.shenrs.eu
	IdentityFile ~/.ssh/id_ed25519
	ProxyCommand socat - openssl-connect:gitea.shenrs.eu:2022,snihost=gitea.shenrs.eu,verify=0

3.2 checkout source code

3.3 build (for package and release)

cd xce/src

# for build debug version
nix build --option sandbox false .#xcecore_debug

# for normal build
nix build --option sandbox false .#xcecore

You can find the generated binaries at =result= directory

3.4 build (for daily develop)

cd xce/src
nix develop

# using meson to generated build configuration (debug and address sanitize)

meson setup build --buildtype=debug -Db_sanitize=address

# run meson to build
meson compile -C  build

# The generated files will be in build/

3.5 build AppImage package

cd xce/src
nix bundle --bundler github:ralismark/nix-appimage --option sandbox false .#xce

This will create all in one AppImage file which contains everything for package delivery.

4. misc

4.1. Windows remap ctrl and alt key

create a reg file, e.g. remapkey.reg

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,05,00,00,00,38,00,1d,00,1d,00,38,00,38,e0,1d,e0,1d,e0,38,e0,00,00,00,00

then double click remapkey.reg to import it. Restart OS.