From 975c6fa7ac0a088249cc36e339c2c57b9eca4e12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= <sybren@stuvel.eu> Date: Tue, 31 Jan 2017 09:21:25 +0100 Subject: [PATCH] Server: separated task.priority into .job_priority and .priority Now tasks can be sorted by job and task priority, and different tasks can have different priorities within a job. This will allow for better control over task ordering than just relying on parent relationships. --- packages/flamenco/flamenco/eve_settings.py | 4 ++++ packages/flamenco/flamenco/jobs/routes.py | 2 +- packages/flamenco/flamenco/tasks/__init__.py | 12 +++++++++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/flamenco/flamenco/eve_settings.py b/packages/flamenco/flamenco/eve_settings.py index b7b637ff..0a457fb3 100644 --- a/packages/flamenco/flamenco/eve_settings.py +++ b/packages/flamenco/flamenco/eve_settings.py @@ -221,6 +221,10 @@ tasks_schema = { 'default': 'queued' }, 'priority': { + 'type': 'integer', + 'default': 0 + }, + 'job_priority': { 'type': 'integer', 'min': 1, 'max': 100, diff --git a/packages/flamenco/flamenco/jobs/routes.py b/packages/flamenco/flamenco/jobs/routes.py index f4da8bd7..de4cadb7 100644 --- a/packages/flamenco/flamenco/jobs/routes.py +++ b/packages/flamenco/flamenco/jobs/routes.py @@ -91,7 +91,7 @@ def view_job_depsgraph(project, job_id): tid_to_idx = {task['_id']: tidx for tidx, task in enumerate(tasks._items)} - for task in tasks._items: + for task in sorted(tasks._items, key=lambda task: task['priority']): task_id = tid_to_idx[task['_id']] nodes.append({ 'id': task_id, diff --git a/packages/flamenco/flamenco/tasks/__init__.py b/packages/flamenco/flamenco/tasks/__init__.py index 81049d11..4c8333d6 100644 --- a/packages/flamenco/flamenco/tasks/__init__.py +++ b/packages/flamenco/flamenco/tasks/__init__.py @@ -27,7 +27,7 @@ REQUEABLE_TASK_STATES = {'completed', 'canceled', 'failed'} class TaskManager(object): _log = attrs_extra.log('%s.TaskManager' % __name__) - def api_create_task(self, job, commands, name, parents=None): + def api_create_task(self, job, commands, name, parents=None, priority=50): """Creates a task in MongoDB for the given job, executing commands. Returns the ObjectId of the created task. @@ -43,7 +43,8 @@ class TaskManager(object): 'status': 'queued', 'job_type': job['job_type'], 'commands': [cmd.to_dict() for cmd in commands], - 'priority': job['priority'], + 'job_priority': job['priority'], + 'priority': priority, 'project': job['project'], } # Insertion of None parents is not supported @@ -68,7 +69,12 @@ class TaskManager(object): payload = { 'where': { 'job': unicode(job_id), - }} + }, + 'sorted': [ + ('priority', -1), + ('_id', 1), + ], + } if status: payload['where']['status'] = status tasks = Task.all(payload, api=api) -- GitLab