diff --git a/readthedocs/builds/tasks.py b/readthedocs/builds/tasks.py index 4534a580bc9..d06265b84a6 100644 --- a/readthedocs/builds/tasks.py +++ b/readthedocs/builds/tasks.py @@ -15,6 +15,7 @@ ) from readthedocs.builds.constants import ( BRANCH, + EXTERNAL, BUILD_STATUS_FAILURE, BUILD_STATUS_PENDING, BUILD_STATUS_SUCCESS, @@ -38,10 +39,11 @@ class TaskRouter: Celery tasks router. It allows us to decide which queue is where we want to execute the task - based on project's settings but also in queue availability. + based on project's settings. 1. the project is using conda 2. new project with less than N successful builds + 3. version to be built is external It ignores projects that have already set ``build_queue`` attribute. @@ -92,6 +94,16 @@ def route_for_task(self, task, args, kwargs, **__): ) return self.BUILD_LARGE_QUEUE + # Use last queue used for external versions + if version.type == EXTERNAL: + for build in last_builds.iterator(): + if not build.builder: + continue + + if 'default' in build.builder: + return self.BUILD_DEFAULT_QUEUE + return self.BUILD_LARGE_QUEUE + # We do not have enough builds for this version yet if queryset.count() < self.N_BUILDS: log.info( diff --git a/readthedocs/builds/tests/test_celery_task_router.py b/readthedocs/builds/tests/test_celery_task_router.py index b1077eba55f..713715038bb 100644 --- a/readthedocs/builds/tests/test_celery_task_router.py +++ b/readthedocs/builds/tests/test_celery_task_router.py @@ -3,6 +3,7 @@ from django.test import TestCase from django.test.utils import override_settings +from readthedocs.builds.constants import EXTERNAL from readthedocs.builds.models import Build, Version from readthedocs.builds.tasks import TaskRouter from readthedocs.projects.models import Project @@ -67,3 +68,23 @@ def test_no_build_pk(self): self.assertIsNone( self.router.route_for_task(self.task, self.args, {}), ) + + def test_external_version(self): + self.version.type = EXTERNAL + self.version.save() + + self.build.builder = 'build-default-a1b2c3' + self.build.save() + + self.assertEqual( + self.router.route_for_task(self.task, self.args, self.kwargs), + TaskRouter.BUILD_DEFAULT_QUEUE, + ) + + self.build.builder = 'build-large-a1b2c3' + self.build.save() + + self.assertEqual( + self.router.route_for_task(self.task, self.args, self.kwargs), + TaskRouter.BUILD_LARGE_QUEUE, + )