From 62422d9ba315069537253cdbe90e91178ce2f228 Mon Sep 17 00:00:00 2001 From: jlnav Date: Thu, 15 Oct 2026 11:45:25 -0500 Subject: [PATCH 1/2] Add regression test for final_gen_send PERSIS_STOP with zero H_rows --- .../tests/unit_tests/test_manager_main.py | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/libensemble/tests/unit_tests/test_manager_main.py b/libensemble/tests/unit_tests/test_manager_main.py index e34bc7630..4c8a14be3 100644 --- a/libensemble/tests/unit_tests/test_manager_main.py +++ b/libensemble/tests/unit_tests/test_manager_main.py @@ -5,10 +5,21 @@ import libensemble.manager as man import libensemble.tests.unit_tests.setup as setup +from libensemble.message_numbers import PERSIS_STOP libE_specs = {"comms": "local", "gen_on_worker": True} +class FakeComm: + """Records sent messages instead of transmitting them to a real worker.""" + + def __init__(self): + self.sent = [] + + def send(self, tag, obj): + self.sent.append((tag, obj)) + + def test_term_test_1(): # termination_test should be True when we want to stop @@ -52,7 +63,32 @@ def test_term_test_3(): assert mgr.term_test() +def test_send_work_order_persis_stop_empty_rows(): + # Regression test: a PERSIS_STOP work order with zero H_rows (e.g. final_gen_send + # with nothing left to forward to a persistent gen) must still send the meta-message. + # Otherwise, a persistent worker blocked in PersistentSupport.recv() waiting on this + # message hangs forever, since nothing would ever be sent to it. + hist, sim_specs, gen_specs, exit_criteria, al = setup.hist_setup2() + final_libE_specs = dict(libE_specs, final_gen_send=True) + fake_wcomm = FakeComm() + mgr = man.Manager(hist, final_libE_specs, al, sim_specs, gen_specs, exit_criteria, wcomms=[fake_wcomm]) + + work = { + "H_fields": ["x"], + "persis_info": {}, + "tag": PERSIS_STOP, + "libE_info": {"persistent": True, "H_rows": np.array([], dtype=int)}, + } + mgr._send_work_order(work, 1) + + assert len(fake_wcomm.sent) == 1, "Expected the PERSIS_STOP meta-message to be sent even with zero H_rows" + tag, sent_work = fake_wcomm.sent[0] + assert tag == PERSIS_STOP + assert len(sent_work["libE_info"]["H_rows"]) == 0 + + if __name__ == "__main__": test_term_test_1() test_term_test_2() test_term_test_3() + test_send_work_order_persis_stop_empty_rows() From 3e17582aa0be829f4cd289833adf51baa762f808 Mon Sep 17 00:00:00 2001 From: jlnav Date: Mon, 19 Oct 2026 07:57:32 -0500 Subject: [PATCH 2/2] in set up resources function, return early if resources are disabled or the resource manager hasn't yet been started --- libensemble/manager.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libensemble/manager.py b/libensemble/manager.py index c076b78b6..2f0e6df25 100644 --- a/libensemble/manager.py +++ b/libensemble/manager.py @@ -418,6 +418,9 @@ def _set_resources(self, Work: dict, w: int) -> None: If rsets are not assigned, then assign using default mapping """ resource_manager = self.resources.resource_manager # type: ignore + if resource_manager is None: + return + rset_req = Work["libE_info"].get("rset_team") if rset_req is None: