Commit 14174892 authored by Rémy Coutable's avatar Rémy Coutable

Merge branch '44657-reuse-root_ref_hash-on-branches' into 'master'

Avoid Gitaly n+1 times per request for Project Branches performance

Closes #44657 et #37429

See merge request gitlab-org/gitlab-ce!17998
parents be944a64 05b4b2d9
......@@ -21,10 +21,7 @@ class Projects::BranchesController < Projects::ApplicationController
fetch_branches_by_mode
@refs_pipelines = @project.pipelines.latest_successful_for_refs(@branches.map(&:name))
@merged_branch_names =
repository.merged_branch_names(@branches.map(&:name))
# n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/37429
Gitlab::GitalyClient.allow_n_plus_1_calls do
@merged_branch_names = repository.merged_branch_names(@branches.map(&:name))
@max_commits = @branches.reduce(0) do |memo, branch|
diverging_commit_counts = repository.diverging_commit_counts(branch)
[memo, diverging_commit_counts[:behind], diverging_commit_counts[:ahead]].max
......@@ -32,7 +29,6 @@ class Projects::BranchesController < Projects::ApplicationController
render
end
end
format.json do
branches = BranchesFinder.new(@repository, params).execute
branches = Kaminari.paginate_array(branches).page(params[:page])
......
......@@ -249,13 +249,13 @@ class Repository
end
def diverging_commit_counts(branch)
root_ref_hash = raw_repository.commit(root_ref).id
@root_ref_hash ||= raw_repository.commit(root_ref).id
cache.fetch(:"diverging_commit_counts_#{branch.name}") do
# Rugged seems to throw a `ReferenceError` when given branch_names rather
# than SHA-1 hashes
number_commits_behind, number_commits_ahead =
raw_repository.count_commits_between(
root_ref_hash,
@root_ref_hash,
branch.dereferenced_target.sha,
left_right: true,
max_count: MAX_DIVERGING_COUNT)
......
---
title: Reuse root_ref_hash for performance on Branches
merge_request: 17998
author: Takuya Noguchi
type: performance
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