BranchesController#index is calling Gitaly n+1 times per request
BranchesController#index
is calling Gitaly n+1
times per request.
This code needs to be refactored to fetch all required information in a single call.
Known Problem Methods
-
app/controllers/projects/branches_controller.rb#index
->app/models/repository.rb#diverging_commit_counts
->Gitlab::Git::Repository.rb#count_commits_between
->Gitlab::Git::Commit#between
-
=> Fixed by !14729 (merged).app/controllers/projects/branches_controller.rb#index
->app/views/projects/branches/_branch.html.haml
->Repository#merged_to_root_ref?
->Gitlab::Git::Repository#ancestor?
->GitalyClient.call(@repository.storage, :commit_service, :commit_is_ancestor, request).value
Failing tests
rspec ./spec/features/gitlab_flavored_markdown_spec.rb:45
rspec ./spec/features/projects/branches_spec.rb:15 # Branches logged in as developer Initial branches page shows all the branches sorted by last updated by default
rspec ./spec/features/projects/branches_spec.rb:21 # Branches logged in as developer Initial branches page sorts the branches by name
rspec ./spec/features/projects/branches_spec.rb:30 # Branches logged in as developer Initial branches page sorts the branches by oldest updated
rspec ./spec/features/projects/branches_spec.rb:39 # Branches logged in as developer Initial branches page avoids a N+1 query in branches index
rspec ./spec/features/projects/branches_spec.rb:49 # Branches logged in as developer Find branches shows filtered branches
rspec ./spec/features/projects/branches_spec.rb:61 # Branches logged in as developer Delete unprotected branch removes branch after confirmation
rspec ./spec/features/projects/branches_spec.rb:85 # Branches logged in as master Initial branches page shows description for admin
rspec ./spec/features/projects/branches_spec.rb:98 # Branches logged out does not show merge request button
Stacks
lib/gitlab/gitaly_client.rb:143:in `migrate'
lib/gitlab/git/commit.rb:111:in `between'
lib/gitlab/git/repository.rb:490:in `count_commits_between'
app/models/repository.rb:260:in `block in diverging_commit_counts'
lib/repository_cache.rb:20:in `fetch'
app/models/repository.rb:256:in `diverging_commit_counts'
app/controllers/projects/branches_controller.rb:21:in `block (4 levels) in index'
app/controllers/projects/branches_controller.rb:20:in `each'
app/controllers/projects/branches_controller.rb:20:in `reduce'
app/controllers/projects/branches_controller.rb:20:in `block (3 levels) in index'
lib/gitlab/gitaly_client.rb:195:in `allow_n_plus_1_calls'
app/controllers/projects/branches_controller.rb:19:in `block (2 levels) in index'
app/controllers/projects/branches_controller.rb:15:in `index'
=> Idea in how to improve this: https://gitlab.com/gitlab-org/gitlab-ce/issues/37429#note_42284280
lib/gitlab/gitaly_client.rb:162:in `migrate'
lib/gitlab/git/repository.rb:1165:in `gitaly_migrate'
lib/gitlab/git/commit.rb:63:in `find'
app/models/repository.rb:111:in `commit'
app/models/repository.rb:906:in `merged_to_root_ref?'
app/views/projects/branches/_branch.html.haml:15:in `_app_views_projects_branches__branch_html_haml__2834358230950054379_70139107821380'
app/views/projects/branches/index.html.haml:41:in `block in _app_views_projects_branches_index_html_haml___321017019223123101_70139112231340'
=> Fixed by !14729 (merged)
Edited by Rémy Coutable