From 18d60e485a2434bdfb2234c996a109b72d573421 Mon Sep 17 00:00:00 2001 From: Guillaume CHAUVEL Date: Fri, 28 Jul 2023 21:23:38 +0200 Subject: [PATCH] Delete Git repository references on MR delete MR: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71493 --- app/models/merge_request.rb | 1 + spec/models/merge_request_spec.rb | 34 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index cc5152df12fc86..43a4379082fb0c 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 1dfd14c0993f9b..374bd9a1fc5cd8 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 -- GitLab