diff options
author | Stan Hu <stanhu@gmail.com> | 2019-06-23 07:54:08 -0700 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2019-06-24 09:57:38 -0700 |
commit | 211a00473b78ada629d1c401ec443b766392185e (patch) | |
tree | 4932e6f52a698ec8ffbc6756d53ede7695616ff0 | |
parent | 7f6de7fe29c2731975166b1a864c5a5cf3141132 (diff) | |
download | gitlab-ce-211a00473b78ada629d1c401ec443b766392185e.tar.gz |
Eliminate N+1 queries in Dashboard::TodosController
This appears to bring down the number of SQL queries on GitLab.com for
my Todos page from 672 to 100.
Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/43042
-rw-r--r-- | app/controllers/dashboard/todos_controller.rb | 1 | ||||
-rw-r--r-- | app/helpers/todos_helper.rb | 2 | ||||
-rw-r--r-- | changelogs/unreleased/sh-optimize-todos-controller.yml | 5 | ||||
-rw-r--r-- | spec/controllers/dashboard/todos_controller_spec.rb | 28 |
4 files changed, 35 insertions, 1 deletions
diff --git a/app/controllers/dashboard/todos_controller.rb b/app/controllers/dashboard/todos_controller.rb index f173c263474..6417cb8e933 100644 --- a/app/controllers/dashboard/todos_controller.rb +++ b/app/controllers/dashboard/todos_controller.rb @@ -10,6 +10,7 @@ class Dashboard::TodosController < Dashboard::ApplicationController def index @sort = params[:sort] @todos = @todos.page(params[:page]) + @todos = @todos.with_api_entity_associations return if redirect_out_of_range(@todos) end diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb index 6bd78336ed3..645160077f5 100644 --- a/app/helpers/todos_helper.rb +++ b/app/helpers/todos_helper.rb @@ -170,7 +170,7 @@ module TodosHelper end def todo_group_options - groups = current_user.authorized_groups.map do |group| + groups = current_user.authorized_groups.with_route.map do |group| { id: group.id, text: group.full_name } end diff --git a/changelogs/unreleased/sh-optimize-todos-controller.yml b/changelogs/unreleased/sh-optimize-todos-controller.yml new file mode 100644 index 00000000000..181ddd1b3bc --- /dev/null +++ b/changelogs/unreleased/sh-optimize-todos-controller.yml @@ -0,0 +1,5 @@ +--- +title: Eliminate N+1 queries in Dashboard::TodosController +merge_request: 29954 +author: +type: performance diff --git a/spec/controllers/dashboard/todos_controller_spec.rb b/spec/controllers/dashboard/todos_controller_spec.rb index 6243ddc03c0..9a3fbfaac51 100644 --- a/spec/controllers/dashboard/todos_controller_spec.rb +++ b/spec/controllers/dashboard/todos_controller_spec.rb @@ -44,6 +44,34 @@ describe Dashboard::TodosController do end end + context "with render_views" do + render_views + + it 'avoids N+1 queries', :request_store do + merge_request = create(:merge_request, source_project: project) + create(:todo, project: project, author: author, user: user, target: merge_request) + create(:issue, project: project, assignees: [user]) + + group = create(:group) + group.add_owner(user) + + get :index + + control = ActiveRecord::QueryRecorder.new { get :index } + + create(:issue, project: project, assignees: [user]) + group_2 = create(:group) + group_2.add_owner(user) + project_2 = create(:project) + project_2.add_developer(user) + merge_request_2 = create(:merge_request, source_project: project_2) + create(:todo, project: project, author: author, user: user, target: merge_request_2) + + expect { get :index }.not_to exceed_query_limit(control) + expect(response.status).to eq(200) + end + end + context 'group authorization' do it 'renders 404 when user does not have read access on given group' do unauthorized_group = create(:group, :private) |