summaryrefslogtreecommitdiff
path: root/app/services/ci
diff options
context:
space:
mode:
authorKamil Trzcinski <ayufan@ayufan.eu>2016-06-14 00:14:30 +0200
committerKamil Trzcinski <ayufan@ayufan.eu>2016-06-14 00:14:30 +0200
commit1685b9dc2eccdabeea2dbe61d4f9fb28d06f9c3c (patch)
tree398cbf5e7d2b11fc4a45c10f21e87d859a693287 /app/services/ci
parentee2e583500360385c9b3f8d9231233223ab72b42 (diff)
downloadgitlab-ce-1685b9dc2eccdabeea2dbe61d4f9fb28d06f9c3c.tar.gz
Optimise SQL query
Diffstat (limited to 'app/services/ci')
-rw-r--r--app/services/ci/register_build_service.rb24
1 files changed, 11 insertions, 13 deletions
diff --git a/app/services/ci/register_build_service.rb b/app/services/ci/register_build_service.rb
index 54aceba1c87..9583f6c7c49 100644
--- a/app/services/ci/register_build_service.rb
+++ b/app/services/ci/register_build_service.rb
@@ -7,10 +7,14 @@ module Ci
builds =
if current_runner.shared?
- # this returns builds that are ordered by number of running builds
- # we prefer projects that don't use shared runners at all
- builds.joins("JOIN (#{projects_with_builds_for_shared_runners.to_sql}) AS projects ON ci_builds.gl_project_id=projects.gl_project_id").
- order('projects.running_builds ASC', 'ci_builds.id ASC')
+ builds.
+ # don't run projects which have not enables shared runners
+ joins(:project).where(projects: { builds_enabled: true, shared_runners_enabled: true }).
+
+ # this returns builds that are ordered by number of running builds
+ # we prefer projects that don't use shared runners at all
+ joins("LEFT JOIN (#{running_builds_for_shared_runners.to_sql}) AS project_builds ON ci_builds.gl_project_id=project_builds.gl_project_id").
+ order('COALESCE(project_builds.running_builds, 0) ASC', 'ci_builds.id ASC')
else
# do run projects which are only assigned to this runner (FIFO)
builds.where(project: current_runner.projects.where(builds_enabled: true)).order('created_at ASC')
@@ -38,15 +42,9 @@ module Ci
private
- def projects_with_builds_for_shared_runners
- Ci::Build.running_or_pending.
- joins(:project).where(projects: { builds_enabled: true, shared_runners_enabled: true }).
- group(:gl_project_id).
- select(:gl_project_id, "count(case when status = 'running' AND runner_id = (#{shared_runners.to_sql}) then 1 end) as running_builds")
- end
-
- def shared_runners
- Ci::Runner.shared.select(:id)
+ def running_builds_for_shared_runners
+ Ci::Build.running.where(runner: Ci::Runner.shared).
+ group(:gl_project_id).select(:gl_project_id, 'count(*) AS running_builds')
end
end
end