fix(scheduler): cache hits keep the full pend reason; sim uses the cache (bug-1932)
The session-level unsatisfiable-resreq cache stored only the exhausted attempt's main reason (an int). The allocators record shortfalls as per-host/per-resource entries and leave main_reason at 0, so every cache hit in the live scheduler pended its job with an empty reason. The simulator registered no cache at all (its table lived on xce_scheduler_t), so it searched every identical pending job again and its traces differed from production. - The cache table moves to xce_sched_core_t; cache_lookup/insert/clear and the hook adapters take the core, with no cast to a driver struct. sched_init() builds it, cache_clear() rebuilds it per session, xce_sched_core_fini() destroys it. - A cache entry is a deep copy of the attempt's full xce_job_preason_t plus the job that proved the request unsatisfiable (core->alloc_jobid, set by sched_allocator()). A hit moves a copy into ctx->reason; a miss leaves ctx->reason untouched. - main.c passes the same three adapters to the simulator through new sched_sim_args_t fields; sched_sim_driver_start() sets them on the sim core (plain field writes: white-box tests include sim.c alone). - Decision trace: a hit renders "no plan generated: skipped, same request as <job> proved unsatisfiable earlier this session" (new XCE_TRACE_NOPLAN_KNOWN_UNSAT via sched_trace_known_unsat()); the outcome shows the restored reasons. - sim_verify keeps its main-only PEND compare (old recordings carry main-only hits); comments and the scheduler-sim-live-allocation design note updated. Tests: full-reason assertions in the cache dispatch tests (RED before: "a cache hit must restore the original attempt's FULL pend reason"), test_alloc_cache.c ported to the new API (deep copy, clear frees, -EEXIST frees), a sim-registered clear test, a renderer test, and a sim e2e scenario with two identical unsatisfiable jobs (204, 205) where 205 is skipped with 204's full reasons (RED before: no skip line). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
cff3304f5d
commit
0317c7af98
27 changed files with 982 additions and 737 deletions
|
|
@ -1021,6 +1021,51 @@ static void test_no_decision_pend_without_reason_keeps_hierarchy(void)
|
|||
sched_trace_rec_free(rec);
|
||||
}
|
||||
|
||||
/* bug-1932: a request the unsatisfiable-request cache already holds is
|
||||
* skipped; the line names the job whose search proved it, or says so
|
||||
* without a name when that job is unknown (0). */
|
||||
static void test_known_unsatisfiable_names_source_job(void)
|
||||
{
|
||||
static const char* const rn[] = { "slots" };
|
||||
static const float rv[] = { 1.0f };
|
||||
xce_sched_trace_rec_t* rec;
|
||||
fx_primary_t p;
|
||||
char* out;
|
||||
|
||||
rec = new_rec(XCE_TRACE_LEVEL_FULL, XCE_TRACE_LINE_BOUND_DEFAULT,
|
||||
XCE_TRACE_REC_DECISION);
|
||||
TEST_ASSERT_NOT_NULL(rec);
|
||||
set_selection(rec);
|
||||
set_glimits(rec, 0, NULL, NULL);
|
||||
make_primary(&p, 1, 1, 1, rn, rv, NULL);
|
||||
|
||||
sched_trace_path_push(rec, XCE_TRACE_PATH_SINGLE, 1, 1);
|
||||
sched_trace_resreq_begin(rec, &p.p, 0);
|
||||
/* the hit returns before the plan search: no search end follows */
|
||||
sched_trace_known_unsat(rec, (uint64_t)204);
|
||||
sched_trace_known_unsat(rec, 0);
|
||||
sched_trace_resreq_end(rec, 0, 0);
|
||||
sched_trace_path_pop(rec);
|
||||
sched_trace_rec_finish(rec, XCE_TRACE_REC_PEND_NO_REASON, 0);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(1, rec->counters.reqs_none_generated);
|
||||
|
||||
out = render(rec, XCE_REPL_UNITS_RAW);
|
||||
assert_golden(
|
||||
"[trace] job 1-2-1000-42 session 7 position 3 level full\n"
|
||||
SEL_LINE NO_LIMITS_LINE
|
||||
" requirement single tasks 1..1 requests slots=1\n"
|
||||
" no plan generated: skipped, same request as 0-0-0-204 proved "
|
||||
"unsatisfiable earlier this session\n"
|
||||
" no plan generated: skipped, same request proved unsatisfiable "
|
||||
"earlier this session\n"
|
||||
" single requirement not satisfied\n"
|
||||
" no decision: job pended without any pend reason\n",
|
||||
out);
|
||||
free(out);
|
||||
sched_trace_rec_free(rec);
|
||||
}
|
||||
|
||||
static void test_reconstructed_record(void)
|
||||
{
|
||||
xce_sched_trace_rec_t* rec;
|
||||
|
|
@ -1318,6 +1363,7 @@ int main(void)
|
|||
RUN_TEST(test_no_decision_no_schedobj);
|
||||
RUN_TEST(test_no_decision_internal_error_keeps_hierarchy);
|
||||
RUN_TEST(test_no_decision_pend_without_reason_keeps_hierarchy);
|
||||
RUN_TEST(test_known_unsatisfiable_names_source_job);
|
||||
RUN_TEST(test_reconstructed_record);
|
||||
RUN_TEST(test_selection_and_limits_unavailable);
|
||||
RUN_TEST(test_entry_kinds_and_edge_cases);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue