fix(scheduler-sim-decision-trace): render an unset pend main reason as none
The pend outcome printed 'main reason: code 0' for every pend the allocator builds, because 0 (libxce's 'no main reason set') fell through to the unknown-code fallback. Found by the 6.1 end-to-end review. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
625663af59
commit
4d1a245fd9
3 changed files with 43 additions and 2 deletions
|
|
@ -248,9 +248,12 @@ static void put_pend(FILE* f, const sched_trace_pend_out_t* p)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 0 is libxce's "no main reason set" (preason.c), not a code */
|
||||||
rtr_indent(f, 2);
|
rtr_indent(f, 2);
|
||||||
fprintf(f, "main reason: %s\n",
|
fprintf(f, "main reason: %s\n",
|
||||||
rtr_reason_name(r->main_reason, buf, sizeof(buf)));
|
(r->main_reason == 0)
|
||||||
|
? "none"
|
||||||
|
: rtr_reason_name(r->main_reason, buf, sizeof(buf)));
|
||||||
|
|
||||||
/* entries tied to no host (a shared resource carries host "") */
|
/* entries tied to no host (a shared resource carries host "") */
|
||||||
for (k = 0; (r->host_based_reasons != NULL) && (k < r->nhost_reasons);
|
for (k = 0; (r->host_based_reasons != NULL) && (k < r->nhost_reasons);
|
||||||
|
|
|
||||||
|
|
@ -338,6 +338,7 @@ static void test_step_mode_full_all_jobs_and_file_copy(void)
|
||||||
"\n cluster-wide check failed; no placement plans tried\n",
|
"\n cluster-wide check failed; no placement plans tried\n",
|
||||||
"\n single requirement not satisfied\n",
|
"\n single requirement not satisfied\n",
|
||||||
"\n outcome: PEND\n",
|
"\n outcome: PEND\n",
|
||||||
|
"\n main reason: none\n",
|
||||||
"\n resource license: NO_RESOURCE\n",
|
"\n resource license: NO_RESOURCE\n",
|
||||||
"\n resource limit=cluster_slots: NO_RESOURCE\n");
|
"\n resource limit=cluster_slots: NO_RESOURCE\n");
|
||||||
TEST_ASSERT_NULL(strstr(b, "plan 1"));
|
TEST_ASSERT_NULL(strstr(b, "plan 1"));
|
||||||
|
|
@ -362,7 +363,7 @@ static void test_step_mode_full_all_jobs_and_file_copy(void)
|
||||||
"\n alternative 2/2 not satisfied\n",
|
"\n alternative 2/2 not satisfied\n",
|
||||||
"\n no alternative chosen: none of the 2 alternatives was "
|
"\n no alternative chosen: none of the 2 alternatives was "
|
||||||
"satisfied\n",
|
"satisfied\n",
|
||||||
"\n outcome: PEND\n");
|
"\n outcome: PEND\n", "\n main reason: none\n");
|
||||||
free(b);
|
free(b);
|
||||||
|
|
||||||
/* 105, session 5: per-host shortfall rows next to limit rows, the
|
/* 105, session 5: per-host shortfall rows next to limit rows, the
|
||||||
|
|
|
||||||
|
|
@ -865,6 +865,42 @@ static void test_pend_outcome_null_entries(void)
|
||||||
sched_trace_rec_free(rec);
|
sched_trace_rec_free(rec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* A pend whose set carries no main reason (0, preason.c's "none set"), as
|
||||||
|
* every pend the allocator builds from per-host and per-resource reasons
|
||||||
|
* does: the line says none instead of a bare code. */
|
||||||
|
static void test_pend_outcome_without_main_reason(void)
|
||||||
|
{
|
||||||
|
xce_sched_trace_rec_t* rec;
|
||||||
|
xce_res_reason_t rr = { "license", "", PREASON_NO_RESOURCE };
|
||||||
|
xce_res_reason_t* rrp[1] = { &rr };
|
||||||
|
xce_job_preason_t jr;
|
||||||
|
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);
|
||||||
|
|
||||||
|
memset(&jr, 0, sizeof(jr));
|
||||||
|
jr.nres_reasons = 1;
|
||||||
|
jr.res_based_reasons = rrp;
|
||||||
|
rec->outcome = SCHED_TRACE_OUTCOME_PEND;
|
||||||
|
rec->pend.reasons = &jr; /* read only by the renderer */
|
||||||
|
|
||||||
|
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
|
||||||
|
" outcome: PEND\n"
|
||||||
|
" main reason: none\n"
|
||||||
|
" resource license: NO_RESOURCE\n",
|
||||||
|
out);
|
||||||
|
free(out);
|
||||||
|
rec->pend.reasons = NULL;
|
||||||
|
sched_trace_rec_free(rec);
|
||||||
|
}
|
||||||
|
|
||||||
/* ---- no-decision and reconstructed records (2.4, 2.5) ------------------- */
|
/* ---- no-decision and reconstructed records (2.4, 2.5) ------------------- */
|
||||||
|
|
||||||
static void test_no_decision_not_found(void)
|
static void test_no_decision_not_found(void)
|
||||||
|
|
@ -1277,6 +1313,7 @@ int main(void)
|
||||||
RUN_TEST(test_dispatch_outcome_cap);
|
RUN_TEST(test_dispatch_outcome_cap);
|
||||||
RUN_TEST(test_pend_outcome);
|
RUN_TEST(test_pend_outcome);
|
||||||
RUN_TEST(test_pend_outcome_null_entries);
|
RUN_TEST(test_pend_outcome_null_entries);
|
||||||
|
RUN_TEST(test_pend_outcome_without_main_reason);
|
||||||
RUN_TEST(test_no_decision_not_found);
|
RUN_TEST(test_no_decision_not_found);
|
||||||
RUN_TEST(test_no_decision_no_schedobj);
|
RUN_TEST(test_no_decision_no_schedobj);
|
||||||
RUN_TEST(test_no_decision_internal_error_keeps_hierarchy);
|
RUN_TEST(test_no_decision_internal_error_keeps_hierarchy);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue