X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/f77d08dd57a1021525717c8669296eb3e463c5f7..9fdfd5c5b229ea42193710f891e953b452bd90e7:/services/nodemanager/arvnodeman/jobqueue.py?ds=sidebyside diff --git a/services/nodemanager/arvnodeman/jobqueue.py b/services/nodemanager/arvnodeman/jobqueue.py index 895e03d5ba..4d2d3e0c0a 100644 --- a/services/nodemanager/arvnodeman/jobqueue.py +++ b/services/nodemanager/arvnodeman/jobqueue.py @@ -8,6 +8,8 @@ from __future__ import absolute_import, print_function import logging import subprocess +import arvados.util + from . import clientactor from .config import ARVADOS_ERRORS @@ -154,7 +156,7 @@ class JobQueueMonitorActor(clientactor.RemotePollLoopActor): for out in squeue_out.splitlines(): try: cpu, ram, disk, reason, jobname = out.split("|", 4) - if ("ReqNodeNotAvail" in reason) or ("Resources" in reason): + if ("ReqNodeNotAvail" in reason) or ("Resources" in reason) or ("Priority" in reason): queuelist.append({ "uuid": jobname, "runtime_constraints": { @@ -173,17 +175,23 @@ class JobQueueMonitorActor(clientactor.RemotePollLoopActor): def _got_response(self, queue): server_list, unsatisfiable_jobs = self._calculator.servers_for_queue(queue) - # Cancel any job with unsatisfiable requirements, emitting a log - # explaining why. + # Cancel any job/container with unsatisfiable requirements, emitting + # a log explaining why. for job_uuid, reason in unsatisfiable_jobs.iteritems(): - self._logger.debug("Cancelling unsatisfiable job '%s'", job_uuid) try: self._client.logs().create(body={ 'object_uuid': job_uuid, 'event_type': 'stderr', 'properties': {'text': reason}, }).execute() - self._client.jobs().cancel(uuid=job_uuid).execute() + # Cancel the job depending on its type + if arvados.util.container_uuid_pattern.match(job_uuid): + subprocess.check_call(['scancel', '--name='+job_uuid]) + elif arvados.util.job_uuid_pattern.match(job_uuid): + self._client.jobs().cancel(uuid=job_uuid).execute() + else: + raise Exception('Unknown job type') + self._logger.debug("Cancelled unsatisfiable job '%s'", job_uuid) except Exception as error: self._logger.error("Trying to cancel job '%s': %s", job_uuid,