myxce/.wolf/bugs/bug-1964.md
Rongsong Shen f45b85c9e5
docs(buglog): record Gitea sync for bug-1958..bug-1967
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-10 10:51:33 +00:00

3.4 KiB

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
bug-1943
3224e906
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

  1. 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)