From 185feca2c8523731a330058a2278105d77451100 Mon Sep 17 00:00:00 2001 From: Rongsong Shen Date: Thu, 20 Aug 2026 03:03:00 +0000 Subject: [PATCH] fix(scheduler): "info resource all" printed nothing when no global/shared resources exist Correct filtering (bug-1593: only XCE_RESF_GLOBAL/XCE_RESF_SHARED resources list under "all") but confusing UX: a session with only host-based resources (e.g. just "slots") produced zero output lines, indistinguishable from a REPL/dispatch bug. Now prints an explicit "no global/shared resources defined" message when the count is zero. --- src/scheduler/src/repl_info.c | 17 ++++++- .../test_repl_breakpoints_inspection.c | 44 +++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/scheduler/src/repl_info.c b/src/scheduler/src/repl_info.c index eb4c853b..f6391dee 100644 --- a/src/scheduler/src/repl_info.c +++ b/src/scheduler/src/repl_info.c @@ -574,8 +574,9 @@ static void repl_info_resource(xce_sched_sim_driver_t* sim, const char* arg) { if (strcmp(arg, "all") == 0) { iterator_t it; - xce_resource_t* r = NULL; - int rc = iter_make(&it, sim->core.resmgr); + xce_resource_t* r = NULL; + int n_shown = 0; + int rc = iter_make(&it, sim->core.resmgr); if (rc < 0) { return; @@ -589,8 +590,20 @@ static void repl_info_resource(xce_sched_sim_driver_t* sim, const char* arg) continue; } repl_info_resource_one(sim, r); + n_shown++; } iter_destroy(&it); + + /* Every resource in this session was host-based (e.g. only 'slots'/ + * 'mem'/'cpus'-style consumables, no GLOBAL/SHARED resource at + * all) -- say so explicitly rather than silently printing nothing, + * which reads identically to a REPL/dispatch bug from the + * operator's side. */ + if (n_shown == 0) { + fprintf(stdout, + "[sim] info resource: no global/shared resources defined " + "(host-based resources are 'info worker ''s job)\n"); + } return; } diff --git a/src/scheduler/testsuite/test_repl_breakpoints_inspection.c b/src/scheduler/testsuite/test_repl_breakpoints_inspection.c index 51a51529..4f63546a 100644 --- a/src/scheduler/testsuite/test_repl_breakpoints_inspection.c +++ b/src/scheduler/testsuite/test_repl_breakpoints_inspection.c @@ -1020,6 +1020,49 @@ static void test_info_resource_named_lookup_reports_host_based_note(void) "PASS\n"); } +/* + * 2026-08-20 (live-deployment finding): `info resource all` printed + * literally nothing when every registered resource was host-based (no + * GLOBAL/SHARED resource defined at all) -- correct per bug-1593's own + * filtering rule, but indistinguishable from a REPL/dispatch bug from the + * operator's side with no output at all. Must say so explicitly. + */ +static void test_info_resource_all_reports_when_none_are_global_shared(void) +{ + xce_sched_sim_driver_t sim; + xce_resource_t wire_resource; + char* captured; + int rc; + + memset(&sim, 0, sizeof(sim)); + rc = xce_sched_core_init(&(sim.core)); + TEST_ASSERT_EQUAL_INT(0, rc); + + memset(&wire_resource, 0, sizeof(wire_resource)); + wire_resource.name = "slots"; + wire_resource.valtype = XCE_VAL_NUMERIC; + /* flags left 0 -- host-based, no GLOBAL/SHARED bit, same as + * test_info_resource_all_lists_only_global_shared_resources()'s own + * "mem" fixture above -- but here it is the ONLY resource registered. */ + TEST_ASSERT_NOT_NULL(makeResource(sim.core.resmgr, &wire_resource)); + + captured = capture_dispatch(&sim, "info resource all"); + + TEST_ASSERT_NULL_MESSAGE( + strstr(captured, "resource slots:"), + "a host-based resource must never appear in 'info resource all' " + "(bug-1593, unchanged)"); + TEST_ASSERT_NOT_NULL_MESSAGE( + strstr(captured, "no global/shared resources defined"), + "'info resource all' must say something when zero resources " + "qualify, not print nothing at all"); + + free(captured); + + printf("test_info_resource_all_reports_when_none_are_global_shared: " + "PASS\n"); +} + /* * bug-1596 (task 12.5): repl_split_tokens() must strip one matching pair * of surrounding quote characters -- an operator quoting an argument out @@ -1622,6 +1665,7 @@ int main(void) RUN_TEST(test_info_resource_reports_string_value); RUN_TEST(test_info_resource_all_lists_only_global_shared_resources); RUN_TEST(test_info_resource_named_lookup_reports_host_based_note); + RUN_TEST(test_info_resource_all_reports_when_none_are_global_shared); RUN_TEST(test_info_job_accepts_quoted_jobid_argument); RUN_TEST(test_info_summary_reports_counts); RUN_TEST(test_info_session_reports_position_after_synthetic_events);