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: 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()