def itest_flow_without_runnable_tasks(fwp): """ Test the behaviour of the scheduler when we ignore errrors and all the task that can be executed have been submitted. The scheduler should detect this condition and exit. """ # Get the SCF and the NSCF input. scf_input, nscf_input = make_scf_nscf_inputs() # Build the flow. flow = flowtk.Flow(fwp.workdir, manager=fwp.manager) work0 = flowtk.BandStructureWork(scf_input, nscf_input) flow.register_work(work0) scf_task, nscf_task = work0.scf_task, work0.nscf_task flow.allocate() # Mock an Errored nscf_task. This will cause a deadlock in the flow. nscf_task = mocks.change_task_start(nscf_task) sched = flow.make_scheduler() sched.max_num_abierrs = 10000 assert sched.start() == 0 flow.check_status(show=True) assert not flow.all_ok assert scf_task.status == scf_task.S_OK assert nscf_task.status == nscf_task.S_ERROR g = flow.find_deadlocks() assert not g.deadlocked and not g.runnables and not g.running
def test_infinite_flow(self): si_structure = abidata.structure_from_cif("si.cif") gsinp = gs_input(si_structure, pseudos=abidata.pseudos("14si.pspnc"), ecut=4) flow = flowtk.Flow.temporary_flow() work = flowtk.Work() gstask = work.register_scf_task(gsinp) flow.register_work(work) flow.allocate() mocks.infinite_flow(flow) flow.check_status() assert (t.status == flow.S_INIT for t in flow) mocks.change_task_start(gstask, mocked_status="Error") assert gstask.start() == 1 and gstask.status == gstask.S_ERROR
def itest_flow_with_deadlocks(fwp): """ Test the behaviour of the scheduler in the presence of a deadlock when we ignore errored tasks and we try to run all tasks in the flow. The scheduler should detect the deadlock and exit when no other task can be executed. """ # Get the SCF and the NSCF input. scf_input, nscf_input = make_scf_nscf_inputs() # Build the flow. flow = flowtk.Flow(fwp.workdir, manager=fwp.manager) work0 = flowtk.BandStructureWork(scf_input, nscf_input, dos_inputs=nscf_input) flow.register_work(work0) scf_task, nscf_task, dos_task = work0[0], work0[1], work0[2] work1 = flowtk.Work() work1.register_nscf_task(nscf_input, deps={ scf_task: "DEN", dos_task: "WFK" }) # This task will deadlock when nscf_task reaches S_ERROR. work1.register_nscf_task(nscf_input, deps={ scf_task: "DEN", nscf_task: "WFK" }) flow.register_work(work1) flow.allocate() # Mock an Errored nscf_task. This will cause a deadlock in the flow. nscf_task = mocks.change_task_start(nscf_task) # Here we set max_num_abierrs to a very large number. sched = flow.make_scheduler() sched.max_num_abierrs = 10000 assert sched.start() == 0 flow.check_status(show=True) assert not flow.all_ok assert all(task.status == task.S_OK for task in [scf_task, dos_task, work1[0]]) assert all(task.status == task.S_ERROR for task in [nscf_task]) g = flow.find_deadlocks() assert g.deadlocked and not g.runnables and not g.running assert work1[1] in g.deadlocked
def itest_flow_with_deadlocks(fwp): """ Test the behaviour of the scheduler in the presence of a deadlock when we ignore errored tasks and we try to run all tasks in the flow. The scheduler should detect the deadlock and exit when no other task can be executed. """ # Get the SCF and the NSCF input. scf_input, nscf_input = make_scf_nscf_inputs() # Build the flow. flow = flowtk.Flow(fwp.workdir, manager=fwp.manager) work0 = flowtk.BandStructureWork(scf_input, nscf_input, dos_inputs=nscf_input) flow.register_work(work0) scf_task, nscf_task, dos_task = work0[0], work0[1], work0[2] work1 = flowtk.Work() work1.register_nscf_task(nscf_input, deps={scf_task: "DEN", dos_task: "WFK"}) # This task will deadlock when nscf_task reaches S_ERROR. work1.register_nscf_task(nscf_input, deps={scf_task: "DEN", nscf_task: "WFK"}) flow.register_work(work1) flow.allocate() # Mock an Errored nscf_task. This will cause a deadlock in the flow. nscf_task = mocks.change_task_start(nscf_task) # Here we set max_num_abierrs to a very large number. sched = flow.make_scheduler() sched.max_num_abierrs = 10000 assert sched.start() == 0 flow.check_status(show=True) assert not flow.all_ok assert all(task.status == task.S_OK for task in [scf_task, dos_task, work1[0]]) assert all(task.status == task.S_ERROR for task in [nscf_task]) g = flow.find_deadlocks() assert g.deadlocked and not g.runnables and not g.running assert work1[1] in g.deadlocked