diff options
author | Stan Hu <stanhu@gmail.com> | 2018-04-19 08:02:04 +0300 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2018-04-19 08:04:22 +0300 |
commit | 775211bc7076bba14d6e268fb324391124a2751f (patch) | |
tree | 0de01c4d207929f79628b5b1109452a91f4d2ba7 /spec/models/note_spec.rb | |
parent | d66f1882ffc5780723bbb38593aac9db590c6efe (diff) |
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
Diffstat (limited to 'spec/models/note_spec.rb')
-rw-r--r-- | spec/models/note_spec.rb | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb index 86962cd8d61..6a6c71e6c82 100644 --- a/spec/models/note_spec.rb +++ b/spec/models/note_spec.rb @@ -91,6 +91,23 @@ describe Note do it "keeps the commit around" do expect(note.project.repository.kept_around?(commit.id)).to be_truthy 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 describe 'authorization' do |