Commit 5a55dd99 authored by Yorick Peterse's avatar Yorick Peterse

Merge branch 'fix-performance-problem-of-tags-query' into 'master'

Fix performance problem of tags query

Closes gitlab-com/infrastructure#4550

See merge request gitlab-org/gitlab-ce!20555
parents d5e53119 1399eb05
---
title: Fix performance problem of accessing tag list for projects api endpoints
merge_request:
author:
type: performance
...@@ -135,10 +135,13 @@ module API ...@@ -135,10 +135,13 @@ module API
expose :custom_attributes, using: 'API::Entities::CustomAttribute', if: :with_custom_attributes expose :custom_attributes, using: 'API::Entities::CustomAttribute', if: :with_custom_attributes
def self.preload_relation(projects_relation, options = {}) def self.preload_relation(projects_relation, options = {})
# Preloading tags, should be done with using only `:tags`,
# as `:tags` are defined as: `has_many :tags, through: :taggings`
# N+1 is solved then by using `subject.tags.map(&:name)`
# MR describing the solution: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20555
projects_relation.preload(:project_feature, :route) projects_relation.preload(:project_feature, :route)
.preload(:import_state) .preload(:import_state, :tags)
.preload(namespace: [:route, :owner], .preload(namespace: [:route, :owner])
tags: :taggings)
end end
end end
...@@ -212,11 +215,15 @@ module API ...@@ -212,11 +215,15 @@ module API
expose :statistics, using: 'API::Entities::ProjectStatistics', if: :statistics expose :statistics, using: 'API::Entities::ProjectStatistics', if: :statistics
def self.preload_relation(projects_relation, options = {}) def self.preload_relation(projects_relation, options = {})
# Preloading tags, should be done with using only `:tags`,
# as `:tags` are defined as: `has_many :tags, through: :taggings`
# N+1 is solved then by using `subject.tags.map(&:name)`
# MR describing the solution: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20555
super(projects_relation).preload(:group) super(projects_relation).preload(:group)
.preload(project_group_links: :group, .preload(project_group_links: :group,
fork_network: :root_project, fork_network: :root_project,
forked_project_link: :forked_from_project, forked_project_link: :forked_from_project,
forked_from_project: [:route, :forks, namespace: :route, tags: :taggings]) forked_from_project: [:route, :forks, :tags, namespace: :route])
end end
def self.forks_counting_projects(projects_relation) def self.forks_counting_projects(projects_relation)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment