diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index cc5152df12fc860ae362c75cedf26c68ed77b364..43a4379082fb0cc3a8d4d80ef521e319e47895d1 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -139,6 +139,7 @@ def merge_request_diff after_save :keep_around_commit, unless: :importing? after_commit :ensure_metrics!, on: [:create, :update], unless: :importing? after_commit :expire_etag_cache, unless: :importing? + after_commit :schedule_cleanup_refs, on: :destroy # When this attribute is true some MR validation is ignored # It allows us to close or modify broken merge requests diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 1dfd14c0993f9b193124c89cc1238d48ef390acb..374bd9a1fc5cd8a846071ab79e24c50bacc65d4d 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -4368,6 +4368,40 @@ def create_build(pipeline, coverage, name) BatchLoader::Executor.clear_current end.to change { project.open_merge_requests_count }.from(1).to(0) end + + it 'deletes refs asynchronously' do + allow(subject.target_project.repository).to receive(:async_delete_refs) + subject.destroy! + expect(subject.target_project.repository).to have_received(:async_delete_refs) + .with(subject.ref_path, subject.merge_ref_path, subject.train_ref_path) + end + + context 'when merge_request_delete_gitaly_refs_in_batches is disabled' do + before do + stub_feature_flags(merge_request_delete_gitaly_refs_in_batches: false) + end + + it 'does schedule MergeRequests::CleanupRefWorker' do + allow(MergeRequests::CleanupRefWorker).to receive(:perform_async) + subject.destroy! + expect(MergeRequests::CleanupRefWorker).to have_received(:perform_async) + .with(subject.id, 'all') + end + + context 'when merge_request_cleanup_ref_worker_async is disabled' do + before do + stub_feature_flags(merge_request_delete_gitaly_refs_in_batches: false) + stub_feature_flags(merge_request_cleanup_ref_worker_async: false) + end + + it 'deletes all refs from the target project' do + allow(subject.target_project.repository).to receive(:delete_refs) + subject.destroy! + expect(subject.target_project.repository).to have_received(:delete_refs) + .with(subject.ref_path, subject.merge_ref_path, subject.train_ref_path) + end + end + end end it_behaves_like 'throttled touch' do