MergeRequest#create_merge_request_diff is calling Gitaly n+1 times per invocation

MergeRequest#create_merge_request_diff is calling Gitaly n+1 times per invocation.

This code needs to be refactored to fetch all required information in a single Gitaly call.

See https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/13996/diffs#ef51b30fcc35462117070f3fe498d3949c279cb9_420_418

Known Problem Methods

  • app/models/merge_request.rb#create_merge_request_diff -> app/models/merge_request_diff.rb#keep_around_commits -> Gitlab::Git::Commit#find

Failing Tests

rspec './spec/features/merge_requests/user_uses_slash_commands_spec.rb[1:1:2:4:1:1]' 
rspec ./spec/features/merge_requests/user_uses_slash_commands_spec.rb:141 
rspec ./spec/features/projects/merge_requests/user_edits_merge_request_spec.rb:15

Stacks

lib/gitlab/gitaly_client.rb:143:in `migrate'
lib/gitlab/git/repository.rb:1110:in `gitaly_migrate'
lib/gitlab/git/commit.rb:63:in `find'
app/models/repository.rb:108:in `commit'
app/models/repository.rb:231:in `keep_around'
app/models/merge_request_diff.rb:331:in `block in keep_around_commits'
app/models/merge_request_diff.rb:330:in `each'
app/models/merge_request_diff.rb:330:in `keep_around_commits'
app/models/merge_request_diff.rb:54:in `save_git_content'
app/models/merge_request.rb:426:in `block in create_merge_request_diff'
lib/gitlab/gitaly_client.rb:195:in `allow_n_plus_1_calls'
app/models/merge_request.rb:425:in `create_merge_request_diff'
app/models/merge_request.rb:472:in `reload_diff'
app/services/merge_requests/reopen_service.rb:11:in `execute'
app/services/issuable_base_service.rb:278:in `change_state'
app/services/issuable_base_service.rb:213:in `update'
app/services/merge_requests/update_service.rb:21:in `execute'
app/services/notes/quick_actions_service.rb:33:in `execute'
app/services/notes/create_service.rb:39:in `execute'
app/controllers/concerns/notes_actions.rb:38:in `create'
app/controllers/projects/notes_controller.rb:19:in `create'
Edited Jun 18, 2025 by 🤖 GitLab Bot 🤖
Assignee Loading
Time tracking Loading