diff options
author | Kamil Trzcinski <ayufan@ayufan.eu> | 2016-06-14 00:14:30 +0200 |
---|---|---|
committer | Kamil Trzcinski <ayufan@ayufan.eu> | 2016-06-14 00:14:30 +0200 |
commit | 1685b9dc2eccdabeea2dbe61d4f9fb28d06f9c3c (patch) | |
tree | 398cbf5e7d2b11fc4a45c10f21e87d859a693287 /app/services/ci | |
parent | ee2e583500360385c9b3f8d9231233223ab72b42 (diff) | |
download | gitlab-ce-1685b9dc2eccdabeea2dbe61d4f9fb28d06f9c3c.tar.gz |
Optimise SQL query
Diffstat (limited to 'app/services/ci')
-rw-r--r-- | app/services/ci/register_build_service.rb | 24 |
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 |