Commit 57ec78d5 authored by Sean McGivern's avatar Sean McGivern

Merge branch 'sh-fix-issues-api-gitaly-nplusone' into 'master'

Fix Gitaly N+1 calls with listing issues/MRs via API

Closes #66202

See merge request gitlab-org/gitlab-ce!31938
parents 9e6a8bb9 ba7c501f
---
title: Fix Gitaly N+1 calls with listing issues/MRs via API
merge_request: 31938
author:
type: performance
...@@ -136,7 +136,6 @@ Example response: ...@@ -136,7 +136,6 @@ Example response:
"award_emoji":"http://example.com/api/v4/projects/1/issues/76/award_emoji", "award_emoji":"http://example.com/api/v4/projects/1/issues/76/award_emoji",
"project":"http://example.com/api/v4/projects/1" "project":"http://example.com/api/v4/projects/1"
}, },
"subscribed": false,
"task_completion_status":{ "task_completion_status":{
"count":0, "count":0,
"completed_count":0 "completed_count":0
...@@ -441,7 +440,6 @@ Example response: ...@@ -441,7 +440,6 @@ Example response:
"award_emoji":"http://example.com/api/v4/projects/4/issues/41/award_emoji", "award_emoji":"http://example.com/api/v4/projects/4/issues/41/award_emoji",
"project":"http://example.com/api/v4/projects/4" "project":"http://example.com/api/v4/projects/4"
}, },
"subscribed": false,
"task_completion_status":{ "task_completion_status":{
"count":0, "count":0,
"completed_count":0 "completed_count":0
......
...@@ -645,7 +645,10 @@ module API ...@@ -645,7 +645,10 @@ module API
end end
end end
expose :subscribed do |issue, options| # Calculating the value of subscribed field triggers Markdown
# processing. We can't do that for multiple issues / merge
# requests in a single API request.
expose :subscribed, if: -> (_, options) { options.fetch(:include_subscribed, true) } do |issue, options|
issue.subscribed?(options[:current_user], options[:project] || issue.project) issue.subscribed?(options[:current_user], options[:project] || issue.project)
end end
end end
......
...@@ -96,7 +96,8 @@ module API ...@@ -96,7 +96,8 @@ module API
with: Entities::Issue, with: Entities::Issue,
with_labels_details: declared_params[:with_labels_details], with_labels_details: declared_params[:with_labels_details],
current_user: current_user, current_user: current_user,
issuable_metadata: issuable_meta_data(issues, 'Issue', current_user) issuable_metadata: issuable_meta_data(issues, 'Issue', current_user),
include_subscribed: false
} }
present issues, options present issues, options
...@@ -122,7 +123,8 @@ module API ...@@ -122,7 +123,8 @@ module API
with: Entities::Issue, with: Entities::Issue,
with_labels_details: declared_params[:with_labels_details], with_labels_details: declared_params[:with_labels_details],
current_user: current_user, current_user: current_user,
issuable_metadata: issuable_meta_data(issues, 'Issue', current_user) issuable_metadata: issuable_meta_data(issues, 'Issue', current_user),
include_subscribed: false
} }
present issues, options present issues, options
......
...@@ -342,6 +342,14 @@ describe API::Issues do ...@@ -342,6 +342,14 @@ describe API::Issues do
group_project.add_reporter(user) group_project.add_reporter(user)
end end
it 'exposes known attributes' do
get api(base_url, admin)
expect(response).to have_gitlab_http_status(200)
expect(json_response.last.keys).to include(*%w(id iid project_id title description))
expect(json_response.last).not_to have_key('subscribed')
end
it 'returns all group issues (including opened and closed)' do it 'returns all group issues (including opened and closed)' do
get api(base_url, admin) get api(base_url, admin)
......
...@@ -575,6 +575,7 @@ describe API::Issues do ...@@ -575,6 +575,7 @@ describe API::Issues do
expect(json_response['assignee']).to be_a Hash expect(json_response['assignee']).to be_a Hash
expect(json_response['author']).to be_a Hash expect(json_response['author']).to be_a Hash
expect(json_response['confidential']).to be_falsy expect(json_response['confidential']).to be_falsy
expect(json_response['subscribed']).to be_truthy
end end
it 'exposes the closed_at attribute' do it 'exposes the closed_at attribute' do
......
...@@ -216,6 +216,10 @@ describe API::Issues do ...@@ -216,6 +216,10 @@ describe API::Issues do
expect_paginated_array_response([issue.id, closed_issue.id]) expect_paginated_array_response([issue.id, closed_issue.id])
expect(json_response.first['title']).to eq(issue.title) expect(json_response.first['title']).to eq(issue.title)
expect(json_response.last).to have_key('web_url') expect(json_response.last).to have_key('web_url')
# Calculating the value of subscribed field triggers Markdown
# processing. We can't do that for multiple issues / merge
# requests in a single API request.
expect(json_response.last).not_to have_key('subscribed')
end end
it 'returns an array of closed issues' do it 'returns an array of closed issues' 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