Skip to content

Commit aff57c9

Browse files
committed
Route external versions to the queue where default version was built
When a build for an external version is triggered, we find the the last build for the default version and use the same queue for this version. This should make the build to always succeed when it's merged into the default version since it's using the same build queue. I thought this was fixed originally in #7912 but that PR was wrong.
1 parent f864881 commit aff57c9

File tree

2 files changed

+37
-19
lines changed

2 files changed

+37
-19
lines changed

readthedocs/builds/tasks.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,24 @@ def route_for_task(self, task, args, kwargs, **__):
8282
)
8383
return project.build_queue
8484

85+
# Use last queue used by the default version for external versions
86+
if version.type == EXTERNAL:
87+
last_build_for_default_version = (
88+
project.builds
89+
.filter(version__slug=project.get_default_version())
90+
.order_by('-date')
91+
.first()
92+
)
93+
if 'default' in last_build_for_default_version.builder:
94+
routing_queue = self.BUILD_DEFAULT_QUEUE
95+
else:
96+
routing_queue = self.BUILD_LARGE_QUEUE
97+
log.info(
98+
'Routing task because is a external version. project=%s queue=%s',
99+
project.slug, routing_queue,
100+
)
101+
return routing_queue
102+
85103
queryset = version.builds.filter(success=True).order_by('-date')
86104
last_builds = queryset[:self.N_LAST_BUILDS]
87105

@@ -94,16 +112,6 @@ def route_for_task(self, task, args, kwargs, **__):
94112
)
95113
return self.BUILD_LARGE_QUEUE
96114

97-
# Use last queue used for external versions
98-
if version.type == EXTERNAL:
99-
for build in last_builds.iterator():
100-
if not build.builder:
101-
continue
102-
103-
if 'default' in build.builder:
104-
return self.BUILD_DEFAULT_QUEUE
105-
return self.BUILD_LARGE_QUEUE
106-
107115
# We do not have enough builds for this version yet
108116
if queryset.count() < self.N_BUILDS:
109117
log.info(

readthedocs/builds/tests/test_celery_task_router.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,21 +70,31 @@ def test_no_build_pk(self):
7070
)
7171

7272
def test_external_version(self):
73-
self.version.type = EXTERNAL
74-
self.version.save()
75-
76-
self.build.builder = 'build-default-a1b2c3'
77-
self.build.save()
73+
external_version = fixture.get(
74+
Version,
75+
project=self.project,
76+
slug='pull-request',
77+
type=EXTERNAL,
78+
)
79+
default_version = self.project.versions.get(slug=self.project.get_default_version())
80+
default_version_build = fixture.get(
81+
Build,
82+
version=default_version,
83+
project=self.project,
84+
builder='build-default-a1b2c3',
85+
)
86+
args = (external_version.pk,)
87+
kwargs = {'build_pk': default_version_build.pk}
7888

7989
self.assertEqual(
80-
self.router.route_for_task(self.task, self.args, self.kwargs),
90+
self.router.route_for_task(self.task, args, kwargs),
8191
TaskRouter.BUILD_DEFAULT_QUEUE,
8292
)
8393

84-
self.build.builder = 'build-large-a1b2c3'
85-
self.build.save()
94+
default_version_build.builder = 'build-large-a1b2c3'
95+
default_version_build.save()
8696

8797
self.assertEqual(
88-
self.router.route_for_task(self.task, self.args, self.kwargs),
98+
self.router.route_for_task(self.task, args, kwargs),
8999
TaskRouter.BUILD_LARGE_QUEUE,
90100
)

0 commit comments

Comments
 (0)