Commit 775211bc authored by Stan Hu's avatar Stan Hu

Fix N+1 queries when loading participants for a commit note

We saw about 10,000 SQL queries for some commits in the NewNoteWorker,
which stalled the Sidekiq queue for other new notes. The notification
service took up to 8 minutes to process the commits. Avoiding this
N+1 query brings the time down significantly.

Closes #45526
parent d66f1882
...@@ -248,7 +248,7 @@ class Commit ...@@ -248,7 +248,7 @@ class Commit
end end
def notes_with_associations def notes_with_associations
notes.includes(:author) notes.includes(:author, :award_emoji)
end end
def merge_requests def merge_requests
......
---
title: Fix N+1 queries when loading participants for a commit note
merge_request:
author:
type: performance
...@@ -91,6 +91,23 @@ describe Note do ...@@ -91,6 +91,23 @@ describe Note do
it "keeps the commit around" do it "keeps the commit around" do
expect(note.project.repository.kept_around?(commit.id)).to be_truthy expect(note.project.repository.kept_around?(commit.id)).to be_truthy
end end
it 'does not generate N+1 queries for participants', :request_store do
def retrieve_participants
commit.notes_with_associations.map(&:participants).to_a
end
# Project authorization checks are cached, establish a baseline
retrieve_participants
control_count = ActiveRecord::QueryRecorder.new do
retrieve_participants
end
create(:note_on_commit, project: note.project, note: 'another note', noteable_id: commit.id)
expect { retrieve_participants }.not_to exceed_query_limit(control_count)
end
end end
describe 'authorization' do describe 'authorization' do
......
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