Merge branch 'fix/use-fewer-queries-for-mr-notes' into 'master'
Reduce number of queries made for merge_requests/:id/diffs ## What does this MR do? It reduces the number of DB queries made while processing and rendering MR notes. ## Are there points in the code the reviewer needs to double check? N/A ## Why was this MR needed? For `https://staging.gitlab.com/gitlab-org/gitlab-ce/merge_requests/3142/diffs.json`, for each note we make number of DB queries, almost all of them are handled by the AR caching layer, but they seem to add up a few seconds. Testing on staging, calling `merge_requests/3142/diffs.json` was reduced to ~5.5 seconds from ~8 seconds. ## What are the relevant issue numbers? N/A ## Screenshots (if relevant) N/A ## Does this MR meet the acceptance criteria? - [x] [CHANGELOG](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CHANGELOG) entry added - [ ] ~~[Documentation created/updated](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/development/doc_styleguide.md)~~ - [ ] ~~API support added~~ - ~~Tests~~ - [ ] ~~Added for this feature/bug~~ - [ ] ~~All builds are passing~~ - [x] Conform by the [style guides](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#style-guides) - [x] Branch has no merge conflicts with `master` (if you do - rebase it please) - [x] [Squashed related commits together](https://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits) See merge request !5551
This commit is contained in:
commit
b9b0c0283a
4 changed files with 12 additions and 3 deletions
|
@ -28,6 +28,7 @@ v 8.11.0 (unreleased)
|
|||
- Add commit stats in commit api. !5517 (dixpac)
|
||||
- Make error pages responsive (Takuya Noguchi)
|
||||
- Change requests_profiles resource constraint to catch virtually any file
|
||||
- Reduce number of queries made for merge_requests/:id/diffs
|
||||
|
||||
v 8.10.3 (unreleased)
|
||||
|
||||
|
|
|
@ -407,7 +407,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
|
|||
}
|
||||
|
||||
@use_legacy_diff_notes = !@merge_request.support_new_diff_notes?
|
||||
@grouped_diff_discussions = @merge_request.notes.grouped_diff_discussions
|
||||
@grouped_diff_discussions = @merge_request.notes.inc_author_project_award_emoji.grouped_diff_discussions
|
||||
|
||||
Banzai::NoteRenderer.render(
|
||||
@grouped_diff_discussions.values.flat_map(&:notes),
|
||||
|
|
|
@ -17,7 +17,7 @@ module Issuable
|
|||
belongs_to :assignee, class_name: "User"
|
||||
belongs_to :updated_by, class_name: "User"
|
||||
belongs_to :milestone
|
||||
has_many :notes, as: :noteable, dependent: :destroy do
|
||||
has_many :notes, as: :noteable, inverse_of: :noteable, dependent: :destroy do
|
||||
def authors_loaded?
|
||||
# We check first if we're loaded to not load unnecessarily.
|
||||
loaded? && to_a.all? { |note| note.association(:author).loaded? }
|
||||
|
|
|
@ -25,6 +25,14 @@ class LegacyDiffNote < Note
|
|||
@discussion_id ||= self.class.build_discussion_id(noteable_type, noteable_id || commit_id, line_code)
|
||||
end
|
||||
|
||||
def project_repository
|
||||
if RequestStore.active?
|
||||
RequestStore.fetch("project:#{project_id}:repository") { self.project.repository }
|
||||
else
|
||||
self.project.repository
|
||||
end
|
||||
end
|
||||
|
||||
def diff_file_hash
|
||||
line_code.split('_')[0] if line_code
|
||||
end
|
||||
|
@ -34,7 +42,7 @@ class LegacyDiffNote < Note
|
|||
end
|
||||
|
||||
def diff_file
|
||||
@diff_file ||= Gitlab::Diff::File.new(diff, repository: self.project.repository) if diff
|
||||
@diff_file ||= Gitlab::Diff::File.new(diff, repository: project_repository) if diff
|
||||
end
|
||||
|
||||
def diff_line
|
||||
|
|
Loading…
Reference in a new issue