diff --git a/reframe/core/schedulers/torque.py b/reframe/core/schedulers/torque.py index cb07b42cf7..5504fb605a 100644 --- a/reframe/core/schedulers/torque.py +++ b/reframe/core/schedulers/torque.py @@ -35,6 +35,13 @@ class TorqueJobScheduler(PbsJobScheduler): TASKS_OPT = '-l nodes={num_nodes}:ppn={num_cpus_per_node}' + def _set_nodelist(self, job, nodespec): + if job.nodelist is not None: + return + + job.nodelist = [x.split('/')[0] for x in nodespec.split('+')] + job.nodelist.sort() + def _update_state(self, job): '''Check the status of the job.''' @@ -53,6 +60,13 @@ def _update_state(self, job): if completed.returncode != 0: raise JobError('qstat failed: %s' % completed.stderr, job.jobid) + nodelist_match = re.search( + r'exec_host = (?P\S+)', completed.stdout + ) + if nodelist_match: + nodespec = nodelist_match.group('nodespec') + self._set_nodelist(job, nodespec) + state_match = re.search( r'^\s*job_state = (?P[A-Z])', completed.stdout, re.MULTILINE ) diff --git a/unittests/test_schedulers.py b/unittests/test_schedulers.py index 5a8599f4ac..b2111d60aa 100644 --- a/unittests/test_schedulers.py +++ b/unittests/test_schedulers.py @@ -274,7 +274,7 @@ def test_submit(make_job, exec_ctx): if sched_name == 'local': assert [socket.gethostname()] == minimal_job.nodelist assert 0 == minimal_job.exitcode - elif sched_name == ('slurm', 'squeue'): + elif sched_name == ('slurm', 'squeue', 'pbs', 'torque'): num_tasks_per_node = minimal_job.num_tasks_per_node or 1 num_nodes = minimal_job.num_tasks // num_tasks_per_node assert num_nodes == len(minimal_job.nodelist)