From c9a1a1552a11a9ff862bf08df7267c553f2e0e99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Sat, 13 Jan 2018 22:29:29 +0100 Subject: Fix N+1 in v3 builds API The N+1 issue was caused by loading the job_artifacts_archive for each job (build) individually. Including that in the builds AssociationRelation fixed the issue. --- lib/api/v3/builds.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'lib/api/v3/builds.rb') diff --git a/lib/api/v3/builds.rb b/lib/api/v3/builds.rb index fa0bef39602..a256a5720e1 100644 --- a/lib/api/v3/builds.rb +++ b/lib/api/v3/builds.rb @@ -35,8 +35,7 @@ module API get ':id/builds' do builds = user_project.builds.order('id DESC') builds = filter_builds(builds, params[:scope]) - - present paginate(builds), with: ::API::V3::Entities::Build + present paginate(builds.includes(:job_artifacts_archive)), with: ::API::V3::Entities::Build end desc 'Get builds for a specific commit of a project' do -- cgit v1.2.1 From c9840842f181904e7a94946066bb5ca98c1f657a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Sun, 14 Jan 2018 23:10:51 +0100 Subject: Eager load user, runner, pipeline and its creator --- lib/api/v3/builds.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib/api/v3/builds.rb') diff --git a/lib/api/v3/builds.rb b/lib/api/v3/builds.rb index a256a5720e1..7bf7329625c 100644 --- a/lib/api/v3/builds.rb +++ b/lib/api/v3/builds.rb @@ -35,7 +35,9 @@ module API get ':id/builds' do builds = user_project.builds.order('id DESC') builds = filter_builds(builds, params[:scope]) - present paginate(builds.includes(:job_artifacts_archive)), with: ::API::V3::Entities::Build + + builds = builds.includes(:user, :job_artifacts_archive, :runner, pipeline: :project) + present paginate(builds), with: ::API::V3::Entities::Build end desc 'Get builds for a specific commit of a project' do -- cgit v1.2.1 From feb3449709ce4fce62227f67233bc4d061c66ab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Mon, 15 Jan 2018 22:04:08 +0100 Subject: Use preload instead of includes to avoid joins --- lib/api/v3/builds.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/api/v3/builds.rb') diff --git a/lib/api/v3/builds.rb b/lib/api/v3/builds.rb index 7bf7329625c..ac76fece931 100644 --- a/lib/api/v3/builds.rb +++ b/lib/api/v3/builds.rb @@ -36,7 +36,7 @@ module API builds = user_project.builds.order('id DESC') builds = filter_builds(builds, params[:scope]) - builds = builds.includes(:user, :job_artifacts_archive, :runner, pipeline: :project) + builds = builds.preload(:user, :job_artifacts_archive, :runner, pipeline: :project) present paginate(builds), with: ::API::V3::Entities::Build end -- cgit v1.2.1