| id |
status |
status_updated |
status_note |
component |
severity |
timestamp |
last_seen |
occurrences |
files |
tags |
related |
fix_commits |
gitea_issue |
gitea_synced_status |
gitea_synced_hash |
| bug-1964 |
fixed |
2026-10-10 |
|
scheduler |
wrong-result |
2026-10-10T10:16:12Z |
2026-10-10T10:16:12Z |
1 |
| src/scheduler/src/sim_limit.c |
| src/scheduler/src/core_events.c |
|
| scheduler |
| sim |
| equivalence |
| limit |
|
|
|
395 |
fixed |
97658c96f870 |
bug-1964: xce_scheduler --sim does not re-seed limits when a config push arrives mid-replay
Description
Observed: (source reading; follow-up of the 2026-10-10 P0 fixes (bug-1936..1957))
Reported by the bug-1943 fix: the simulator seeds the limit plugin only at bootstrap (sim_bootstrap_limit_plugin); a CONFIG_PUSH during replay updates groups (bug-1943) but a new or changed limit config never reaches the limit plugin, while the live scheduler applies it (plugin_config_update).
Expected: Live and simulated scheduling apply the same limits after a config change.
Impact: Replays that span a limit config change decide differently than live.
Found by: follow-up of the 2026-10-10 P0 fixes (bug-1936..1957)
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 (xce.build)
- Code: scheduler-framework @ 19be145d-dirty
- Deployment: any (found by source reading; confirmed by the RED test of the fix)
Reproduction
- Replay a recording with a CONFIG_PUSH that changes a limit; compare decisions with live.
- Frequency: deterministic (by code reading; confirmed by the RED test of the fix)
- Evidence: the code sites quoted in Description; no logs kept.
Root cause
Live sched_init_config() calls plugin_config_update(), but the core's CONFIG_PUSH handler (core_events.c:xce_core_push_events) did not, and the simulator loaded limits only at bootstrap (sim_limit.c:sim_bootstrap_limit_plugin). Pre-existing.
Fix
plugin_config_update_core(core, config) (plugin.c/.h) is the shared update (live's plugin_config_update() calls it); a driver-registered core hook (xce_core_set_config_cb, core.h/core_session.c, modelled on the cache-clear hook, keeping the core free of plugin calls) is called by CONFIG_PUSH after loading groups; the simulator registers it; limit_update_config() reads plugin->core instead of casting plugin->sched (absent in sim); fixtures set plugin->core.
Verification
- Test:
test_config_push_reaches_limit_plugin_in_sim_as_in_live (src/scheduler/testsuite/test_sim_limit_config_push_parity.c): RED test_sim_limit_config_push_parity.c:311: FAIL: Expected 1 Was 0 (sim: a CONFIG_PUSH during replay must configure its limit as live does), GREEN after; test_sim_group_limit_parity, test_limit_plugin (6/6), test_repl_limit_table (35/35) pass.
- Suites:
xce-build.sh all asan xce.build --incremental on the merged branch, 2026-10-10: C suites Ok 157 / Fail 0; frontend Go tests ok (the build now also runs apiserver cmd, middleware, models and router)
- Live: n/a: unit/fixture-level verification; no live deployment was run
References
- Fix commits:
3224e906 (on scheduler-framework)
- Found as a follow-up of the 2026-10-10 P0 fixes (bug-1936..1957)