Skip to content
Snippets Groups Projects
Commit 4b5a28dc authored by Linjie Zhang's avatar Linjie Zhang
Browse files

Fix merge train merge failed when check_mergeability obtain lock error

Fix merge train merge failed when check_mergeability obtain lock error

Changelog: fixed
MR: !128202
EE: true
parent 22668bff
No related branches found
No related tags found
1 merge request!128202Fix merge train merge failed when check_mergeability obtain lock error
......@@ -1155,7 +1155,7 @@ def reload_diff(current_user = nil)
MergeRequests::ReloadDiffsService.new(self, current_user).execute
end
def check_mergeability(async: false)
def check_mergeability(async: false, sync_retry_lease: false)
return unless recheck_merge_status?
check_service = MergeRequests::MergeabilityCheckService.new(self)
......@@ -1163,7 +1163,7 @@ def check_mergeability(async: false)
if async
check_service.async_execute
else
check_service.execute(retry_lease: false)
check_service.execute(retry_lease: sync_retry_lease)
end
end
# rubocop: enable CodeReuse/ServiceClass
......@@ -1207,14 +1207,14 @@ def skipped_mergeable_checks(options = {})
}
end
def mergeable?(skip_ci_check: false, skip_discussions_check: false, skip_approved_check: false)
def mergeable?(skip_ci_check: false, skip_discussions_check: false, skip_approved_check: false, check_mergeability_retry_lease: false)
return false unless mergeable_state?(
skip_ci_check: skip_ci_check,
skip_discussions_check: skip_discussions_check,
skip_approved_check: skip_approved_check
)
check_mergeability
check_mergeability(sync_retry_lease: check_mergeability_retry_lease)
can_be_merged? && !should_be_rebased?
end
......
......@@ -67,7 +67,7 @@ def error_check!
error =
if @merge_request.should_be_rebased?
'Only fast-forward merge is allowed for your project. Please update your source branch'
elsif !@merge_request.mergeable?(skip_discussions_check: @options[:skip_discussions_check])
elsif !@merge_request.mergeable?(skip_discussions_check: @options[:skip_discussions_check], check_mergeability_retry_lease: @options[:check_mergeability_retry_lease])
'Merge request is not mergeable'
elsif !@merge_request.squash && project.squash_always?
'This project requires squashing commits when merge requests are accepted.'
......
......@@ -73,7 +73,7 @@ def merge!
merge_train_car.start_merge!
MergeRequests::MergeService.new(project: project, current_user: merge_user, params: merge_request.merge_params.with_indifferent_access)
.execute(merge_request, skip_discussions_check: true)
.execute(merge_request, skip_discussions_check: true, check_mergeability_retry_lease: true)
raise ProcessError, "failed to merge. #{merge_request.merge_error}" unless merge_request.merged?
......
......@@ -90,7 +90,7 @@
expect(merge_request.merge_train_car).to receive(:start_merge!).and_call_original
expect(merge_request.merge_train_car).to receive(:finish_merge!).and_call_original
expect_next_instance_of(MergeRequests::MergeService, project: project, current_user: maintainer, params: instance_of(HashWithIndifferentAccess)) do |service|
expect(service).to receive(:execute).with(merge_request, skip_discussions_check: true).and_call_original
expect(service).to receive(:execute).with(merge_request, skip_discussions_check: true, check_mergeability_retry_lease: true).and_call_original
end
expect { subject }.to change { merge_request.merge_train_car.status_name }.from(:fresh).to(:merged)
......
......@@ -3257,6 +3257,15 @@ def set_compare(merge_request)
end
end
end
context 'with check_mergeability_retry_lease option' do
it 'call check_mergeability with sync_retry_lease' do
allow(subject).to receive(:mergeable_state?) { true }
expect(subject).to receive(:check_mergeability).with(sync_retry_lease: true)
subject.mergeable?(check_mergeability_retry_lease: true)
end
end
end
describe '#skipped_mergeable_checks' do
......@@ -3291,6 +3300,14 @@ def set_compare(merge_request)
subject.check_mergeability
end
context 'when sync_retry_lease is true' do
it 'executes MergeabilityCheckService' do
expect(mergeability_service).to receive(:execute).with(retry_lease: true)
subject.check_mergeability(sync_retry_lease: true)
end
end
context 'when async is true' do
it 'executes MergeabilityCheckService asynchronously' do
expect(mergeability_service).to receive(:async_execute)
......
......@@ -577,6 +577,14 @@
end
end
end
context 'when passing `check_mergeability_retry_lease: true` as `options` parameter' do
it 'call mergeable? with check_mergeability_retry_lease' do
expect(merge_request).to receive(:mergeable?).with(hash_including(check_mergeability_retry_lease: true)).and_call_original
service.execute(merge_request, check_mergeability_retry_lease: true)
end
end
end
end
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment