Commit 694705bc authored by GitLab Bot's avatar GitLab Bot

Automatic merge of gitlab-org/gitlab master

parents 9905d102 b3311e0d
...@@ -13,12 +13,12 @@ module MergeRequests ...@@ -13,12 +13,12 @@ module MergeRequests
class MergeToRefService < MergeRequests::MergeBaseService class MergeToRefService < MergeRequests::MergeBaseService
extend ::Gitlab::Utils::Override extend ::Gitlab::Utils::Override
def execute(merge_request) def execute(merge_request, cache_merge_to_ref_calls = false)
@merge_request = merge_request @merge_request = merge_request
error_check! error_check!
commit_id = commit commit_id = commit(cache_merge_to_ref_calls)
raise_error('Conflicts detected during merge') unless commit_id raise_error('Conflicts detected during merge') unless commit_id
...@@ -65,8 +65,9 @@ module MergeRequests ...@@ -65,8 +65,9 @@ module MergeRequests
params[:allow_conflicts] || false params[:allow_conflicts] || false
end end
def commit def commit(cache_merge_to_ref_calls = false)
if Feature.enabled?(:cache_merge_to_ref_calls, project, default_enabled: false) if cache_merge_to_ref_calls &&
Feature.enabled?(:cache_merge_to_ref_calls, project, default_enabled: false)
Rails.cache.fetch(cache_key, expires_in: 1.day) do Rails.cache.fetch(cache_key, expires_in: 1.day) do
extracted_merge_to_ref extracted_merge_to_ref
end end
......
...@@ -152,7 +152,7 @@ describe('EpicHeaderComponent', () => { ...@@ -152,7 +152,7 @@ describe('EpicHeaderComponent', () => {
expect(toggleButton.exists()).toBeTruthy(); expect(toggleButton.exists()).toBeTruthy();
expect(toggleButton.attributes('aria-label')).toBe('Toggle sidebar'); expect(toggleButton.attributes('aria-label')).toBe('Toggle sidebar');
expect(toggleButton.classes()).toEqual( expect(toggleButton.classes()).toEqual(
expect.arrayContaining([('d-block', 'd-sm-none', 'gutter-toggle')]), expect.arrayContaining(['gl-display-block', 'd-sm-none', 'gutter-toggle']),
); );
}); });
......
...@@ -99,10 +99,14 @@ describe('LeaveModal', () => { ...@@ -99,10 +99,14 @@ describe('LeaveModal', () => {
}); });
}); });
it("does NOT display oncall schedules list when member's user is NOT a part of on-call schedules ", () => { it("does NOT display oncall schedules list when member's user is NOT a part of on-call schedules ", async () => {
wrapper.destroy();
const memberWithoutOncallSchedules = cloneDeep(member); const memberWithoutOncallSchedules = cloneDeep(member);
delete (memberWithoutOncallSchedules, 'user.oncallSchedules'); delete memberWithoutOncallSchedules.user.oncallSchedules;
createComponent({ member: memberWithoutOncallSchedules }); createComponent({ member: memberWithoutOncallSchedules });
await nextTick();
expect(findOncallSchedulesList().exists()).toBe(false); expect(findOncallSchedulesList().exists()).toBe(false);
}); });
}); });
......
...@@ -43,12 +43,22 @@ RSpec.describe MergeRequests::MergeToRefService do ...@@ -43,12 +43,22 @@ RSpec.describe MergeRequests::MergeToRefService do
# warm the cache # warm the cache
# #
service.execute(merge_request) service.execute(merge_request, true)
end
context 'when cache_merge_to_ref_calls parameter is true' do
it 'caches the response', :request_store do
expect { 3.times { service.execute(merge_request, true) } }
.not_to change(Gitlab::GitalyClient, :get_request_count)
end
end end
it 'caches the response', :request_store do context 'when cache_merge_to_ref_calls parameter is false' do
expect { 3.times { service.execute(merge_request) } } it 'does not cache the response', :request_store do
.not_to change(Gitlab::GitalyClient, :get_request_count) expect(Gitlab::GitalyClient).to receive(:call).at_least(3).times.and_call_original
3.times { service.execute(merge_request, false) }
end
end end
end end
...@@ -58,13 +68,15 @@ RSpec.describe MergeRequests::MergeToRefService do ...@@ -58,13 +68,15 @@ RSpec.describe MergeRequests::MergeToRefService do
# warm the cache # warm the cache
# #
service.execute(merge_request) service.execute(merge_request, true)
end end
it 'does not cache the response', :request_store do [true, false].each do |cache_merge_to_ref_calls|
expect(Gitlab::GitalyClient).to receive(:call).at_least(3).times.and_call_original it 'does not cache the response, regardless of cache_merge_to_ref_calls state', :request_store do
expect(Gitlab::GitalyClient).to receive(:call).at_least(3).times.and_call_original
3.times { service.execute(merge_request) } 3.times { service.execute(merge_request, cache_merge_to_ref_calls) }
end
end end
end end
end end
......
...@@ -74,7 +74,9 @@ module Database ...@@ -74,7 +74,9 @@ module Database
return if cross_database_context[:transaction_depth_by_db].values.all?(&:zero?) return if cross_database_context[:transaction_depth_by_db].values.all?(&:zero?)
tables = PgQuery.parse(sql).dml_tables parsed_query = PgQuery.parse(sql)
tables = sql.downcase.include?(' for update') ? parsed_query.tables : parsed_query.dml_tables
return if tables.empty? return if tables.empty?
cross_database_context[:modified_tables_by_db][database].merge(tables) cross_database_context[:modified_tables_by_db][database].merge(tables)
......
...@@ -99,6 +99,25 @@ RSpec.describe 'Database::PreventCrossDatabaseModification' do ...@@ -99,6 +99,25 @@ RSpec.describe 'Database::PreventCrossDatabaseModification' do
end end
end end
end end
context 'when executing a SELECT FOR UPDATE query' do
def run_queries
project.touch
pipeline.lock!
end
context 'outside transaction' do
it { expect { run_queries }.not_to raise_error }
end
context 'when data modification happens in a transaction' do
it 'raises error' do
Project.transaction do
expect { run_queries }.to raise_error /Cross-database data modification/
end
end
end
end
end end
context 'when CI association is modified through project' do context 'when CI association is modified through project' 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