diff --git a/examples/tutorial/dockerfiles/slurm-cluster/reframe/Dockerfile b/examples/tutorial/dockerfiles/slurm-cluster/reframe/Dockerfile index fd0fa4fdd..662b54795 100644 --- a/examples/tutorial/dockerfiles/slurm-cluster/reframe/Dockerfile +++ b/examples/tutorial/dockerfiles/slurm-cluster/reframe/Dockerfile @@ -42,7 +42,7 @@ COPY . /workspace/reframe WORKDIR /home/admin USER admin -RUN uv tool install /workspace/reframe && \ +RUN uv tool install --reinstall /workspace/reframe && \ echo "export PATH=/home/admin/.local/bin:\$PATH" >> /home/admin/.profile && \ echo "export MANPATH=/home/admin/.local/share/uv/tools/reframe-hpc/share/man:" >> /home/admin/.profile diff --git a/reframe/core/schedulers/slurm.py b/reframe/core/schedulers/slurm.py index df68f0953..bd21d68d2 100644 --- a/reframe/core/schedulers/slurm.py +++ b/reframe/core/schedulers/slurm.py @@ -600,17 +600,21 @@ def _cancel_if_blocked(self, jobs, reasons=None): ) for line in completed.stdout.splitlines(): jobid, reason = line.split('|', maxsplit=1) - pending_reasons[pending_jobs[jobid]] = reason - cancel_joblist = {} - for job, reason_descr in pending_reasons.items(): - # The reason description may have two parts as follows: - # "ReqNodeNotAvail, UnavailableNodes:nid00[408,411-415]" - reason = reason_descr.split(',', maxsplit=1)[0].strip() - if reason not in self._cancel_reasons: - continue + # pending_reasons is a list to accommodate for job arrays + pending_job = pending_jobs[jobid] + pending_reasons[pending_job].setdefault([]) + pending_reasons[pending_job].append(reason) - cancel_joblist[job] = reason_descr + cancel_joblist = {} + for job, reasons in pending_reasons.items(): + for reason_descr in reasons: + # The reason description may have two parts as follows: + # "ReqNodeNotAvail, UnavailableNodes:nid00[408,411-415]" + reason = reason_descr.split(',', maxsplit=1)[0].strip() + if reason in self._cancel_reasons: + cancel_joblist[job] = reason_descr + break if not cancel_joblist: return