Commit 46ffa7b8 authored by Igor Drozdov's avatar Igor Drozdov

Calculate mergeability check sync on first widget load

When an MR is loaded, we perform an async widget.json call
Currently, this first call performs mergeability check async
Let's perform it sync in order to deliver the current state
of the merge request faster

Changelog: fixed
parent 7b06f6bc
...@@ -14,8 +14,6 @@ class Projects::MergeRequests::ContentController < Projects::MergeRequests::Appl ...@@ -14,8 +14,6 @@ class Projects::MergeRequests::ContentController < Projects::MergeRequests::Appl
SLOW_POLLING_INTERVAL = 5.minutes.in_milliseconds SLOW_POLLING_INTERVAL = 5.minutes.in_milliseconds
def widget def widget
check_mergeability_async!
respond_to do |format| respond_to do |format|
format.json do format.json do
render json: serializer(MergeRequestPollWidgetEntity) render json: serializer(MergeRequestPollWidgetEntity)
...@@ -40,13 +38,6 @@ class Projects::MergeRequests::ContentController < Projects::MergeRequests::Appl ...@@ -40,13 +38,6 @@ class Projects::MergeRequests::ContentController < Projects::MergeRequests::Appl
def serializer(entity) def serializer(entity)
serializer = MergeRequestSerializer.new(current_user: current_user, project: merge_request.project) serializer = MergeRequestSerializer.new(current_user: current_user, project: merge_request.project)
serializer.represent(merge_request, { async_mergeability_check: params[:async_mergeability_check] }, entity) serializer.represent(merge_request, {}, entity)
end
def check_mergeability_async!
return unless Feature.enabled?(:check_mergeability_async_in_widget, merge_request.project, default_enabled: :yaml)
return if params[:async_mergeability_check].blank?
merge_request.check_mergeability(async: true)
end end
end end
...@@ -31,7 +31,6 @@ class MergeRequestPollWidgetEntity < Grape::Entity ...@@ -31,7 +31,6 @@ class MergeRequestPollWidgetEntity < Grape::Entity
expose :mergeable do |merge_request, options| expose :mergeable do |merge_request, options|
next merge_request.mergeable? if Feature.disabled?(:check_mergeability_async_in_widget, merge_request.project, default_enabled: :yaml) next merge_request.mergeable? if Feature.disabled?(:check_mergeability_async_in_widget, merge_request.project, default_enabled: :yaml)
next false if options[:async_mergeability_check].present? && merge_request.checking?
merge_request.mergeable? merge_request.mergeable?
end end
......
...@@ -36,7 +36,7 @@ class MergeRequestWidgetEntity < Grape::Entity ...@@ -36,7 +36,7 @@ class MergeRequestWidgetEntity < Grape::Entity
end end
expose :merge_request_widget_path do |merge_request| expose :merge_request_widget_path do |merge_request|
widget_project_json_merge_request_path(merge_request.target_project, merge_request, async_mergeability_check: true, format: :json) widget_project_json_merge_request_path(merge_request.target_project, merge_request, format: :json)
end end
expose :merge_request_cached_widget_path do |merge_request| expose :merge_request_cached_widget_path do |merge_request|
......
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
- add_page_startup_api_call notes_url - add_page_startup_api_call notes_url
- else - else
- add_page_startup_api_call discussions_path(@merge_request) - add_page_startup_api_call discussions_path(@merge_request)
- add_page_startup_api_call widget_project_json_merge_request_path(@project, @merge_request, async_mergeability_check: true, format: :json) - add_page_startup_api_call widget_project_json_merge_request_path(@project, @merge_request, format: :json)
- add_page_startup_api_call cached_widget_project_json_merge_request_path(@project, @merge_request, format: :json) - add_page_startup_api_call cached_widget_project_json_merge_request_path(@project, @merge_request, format: :json)
#js-vue-mr-discussions{ data: { notes_data: notes_data(@merge_request, Feature.enabled?(:paginated_notes, @project)).to_json, #js-vue-mr-discussions{ data: { notes_data: notes_data(@merge_request, Feature.enabled?(:paginated_notes, @project)).to_json,
endpoint_metadata: @endpoint_metadata_url, endpoint_metadata: @endpoint_metadata_url,
......
...@@ -57,17 +57,6 @@ RSpec.describe Projects::MergeRequests::ContentController do ...@@ -57,17 +57,6 @@ RSpec.describe Projects::MergeRequests::ContentController do
expect(response.headers['Poll-Interval']).to eq('10000') expect(response.headers['Poll-Interval']).to eq('10000')
end end
context 'when async_mergeability_check param is passed' do
it 'checks mergeability asynchronously' do
expect_next_instance_of(MergeRequests::MergeabilityCheckService) do |service|
expect(service).not_to receive(:execute)
expect(service).to receive(:async_execute).and_call_original
end
do_request(:widget, { async_mergeability_check: true })
end
end
context 'merged merge request' do context 'merged merge request' do
let(:merge_request) do let(:merge_request) do
create(:merged_merge_request, :with_test_reports, target_project: project, source_project: project) create(:merged_merge_request, :with_test_reports, target_project: project, source_project: project)
......
...@@ -229,21 +229,13 @@ RSpec.describe MergeRequestPollWidgetEntity do ...@@ -229,21 +229,13 @@ RSpec.describe MergeRequestPollWidgetEntity do
expect(subject[:mergeable]).to eq(true) expect(subject[:mergeable]).to eq(true)
end end
context 'when async_mergeability_check is passed' do context 'when check_mergeability_async_in_widget is disabled' do
let(:options) { { async_mergeability_check: true } } before do
stub_feature_flags(check_mergeability_async_in_widget: false)
it 'returns false' do
expect(subject[:mergeable]).to eq(false)
end end
context 'when check_mergeability_async_in_widget is disabled' do it 'calculates mergeability and returns true' do
before do expect(subject[:mergeable]).to eq(true)
stub_feature_flags(check_mergeability_async_in_widget: false)
end
it 'calculates mergeability and returns true' do
expect(subject[:mergeable]).to eq(true)
end
end end
end end
end end
......
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