diff options
| author | Rémy Coutable <remy@rymai.me> | 2017-11-06 13:29:17 +0100 | 
|---|---|---|
| committer | Rémy Coutable <remy@rymai.me> | 2017-11-06 13:31:23 +0100 | 
| commit | b20984dea2fbbb20bc2807903115076b2a1de461 (patch) | |
| tree | c8fa65db75e4b84b85ab70a34769dd08e69f310e | |
| parent | d77b9715406f027a060f376199dbd1f56dd866b3 (diff) | |
| download | gitlab-ce-b20984dea2fbbb20bc2807903115076b2a1de461.tar.gz | |
Improve performance of the /projects/:id/repository/branches API endpoint
Mitigate a N+1 requests to Gitaly problem. Still one left.
Signed-off-by: Rémy Coutable <remy@rymai.me>
| -rw-r--r-- | changelogs/unreleased/37442-api-branches-id-repository-branches-is-calling-gitaly-n-1-times-per-request.yml | 5 | ||||
| -rw-r--r-- | lib/api/branches.rb | 9 | ||||
| -rw-r--r-- | lib/api/entities.rb | 2 | ||||
| -rw-r--r-- | lib/api/v3/branches.rb | 6 | 
4 files changed, 14 insertions, 8 deletions
diff --git a/changelogs/unreleased/37442-api-branches-id-repository-branches-is-calling-gitaly-n-1-times-per-request.yml b/changelogs/unreleased/37442-api-branches-id-repository-branches-is-calling-gitaly-n-1-times-per-request.yml new file mode 100644 index 00000000000..11a11a289bf --- /dev/null +++ b/changelogs/unreleased/37442-api-branches-id-repository-branches-is-calling-gitaly-n-1-times-per-request.yml @@ -0,0 +1,5 @@ +--- +title: Improve performance of the /projects/:id/repository/branches API endpoint +merge_request: 15215 +author: +type: performance diff --git a/lib/api/branches.rb b/lib/api/branches.rb index 19152c9f395..cdef1b546a9 100644 --- a/lib/api/branches.rb +++ b/lib/api/branches.rb @@ -29,12 +29,11 @@ module API          use :pagination        end        get ':id/repository/branches' do -        branches = ::Kaminari.paginate_array(user_project.repository.branches.sort_by(&:name)) +        repository = user_project.repository +        branches = ::Kaminari.paginate_array(repository.branches.sort_by(&:name)) +        merged_branch_names = repository.merged_branch_names(branches.map(&:name)) -        # n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/37442 -        Gitlab::GitalyClient.allow_n_plus_1_calls do -          present paginate(branches), with: Entities::Branch, project: user_project -        end +        present paginate(branches), with: Entities::Branch, project: user_project, merged_branch_names: merged_branch_names        end        resource ':id/repository/branches/:branch', requirements: BRANCH_ENDPOINT_REQUIREMENTS do diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 398a7906dcb..df78e49b8cf 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -244,7 +244,7 @@ module API        expose :merged do |repo_branch, options|          # n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/37442          Gitlab::GitalyClient.allow_n_plus_1_calls do -          options[:project].repository.merged_to_root_ref?(repo_branch.name) +          options[:project].repository.merged_to_root_ref?(repo_branch.name, options[:merged_branch_names])          end        end diff --git a/lib/api/v3/branches.rb b/lib/api/v3/branches.rb index 69cd12de72c..b201bf77667 100644 --- a/lib/api/v3/branches.rb +++ b/lib/api/v3/branches.rb @@ -14,9 +14,11 @@ module API            success ::API::Entities::Branch          end          get ":id/repository/branches" do -          branches = user_project.repository.branches.sort_by(&:name) +          repository = user_project.repository +          branches = repository.branches.sort_by(&:name) +          merged_branch_names = repository.merged_branch_names(branches.map(&:name)) -          present branches, with: ::API::Entities::Branch, project: user_project +          present branches, with: ::API::Entities::Branch, project: user_project, merged_branch_names: merged_branch_names          end          desc 'Delete a branch'  | 
