diff options
author | Stan Hu <stanhu@gmail.com> | 2019-07-25 16:15:00 -0700 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2019-07-25 16:20:48 -0700 |
commit | 6fba685a275f3d2eaf69b9629cc89e76dfff75b4 (patch) | |
tree | 40d82373fe17d1c338d370ce5c22ecaa4591aa44 | |
parent | 767c5f63886536eefc4daf081ecba5b45fe8cc3c (diff) | |
download | gitlab-ce-sh-ignore-git-errors-delete-project.tar.gz |
Ignore Gitaly errors if cache flushing fails on project destructionsh-ignore-git-errors-delete-project
We should just ignore these errors and move along with the deletion
since the repositories are going to be trashed anyway.
Closes https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31164
-rw-r--r-- | app/services/projects/destroy_service.rb | 12 | ||||
-rw-r--r-- | changelogs/unreleased/sh-ignore-git-errors-delete-project.yml | 5 | ||||
-rw-r--r-- | spec/services/projects/destroy_service_spec.rb | 11 |
3 files changed, 25 insertions, 3 deletions
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb index b805a7f1211..ec9aeb4a077 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -210,11 +210,19 @@ module Projects end def flush_caches(project) - project.repository.before_delete + ignore_git_errors { project.repository.before_delete } - Repository.new(wiki_path, project, disk_path: repo_path).before_delete + ignore_git_errors { Repository.new(wiki_path, project, disk_path: repo_path).before_delete } Projects::ForksCountService.new(project).delete_cache end + + # If we get a Gitaly error, the repository may be corrupted. We can + # ignore these errors since we're going to trash the repositories + # anyway. + def ignore_git_errors(&block) + yield + rescue Gitlab::Git::CommandError + end end end diff --git a/changelogs/unreleased/sh-ignore-git-errors-delete-project.yml b/changelogs/unreleased/sh-ignore-git-errors-delete-project.yml new file mode 100644 index 00000000000..f5e2147f00e --- /dev/null +++ b/changelogs/unreleased/sh-ignore-git-errors-delete-project.yml @@ -0,0 +1,5 @@ +--- +title: Ignore Gitaly errors if cache flushing fails on project destruction +merge_request: 31164 +author: +type: fixed diff --git a/spec/services/projects/destroy_service_spec.rb b/spec/services/projects/destroy_service_spec.rb index 3af7ee3ad50..cd762beab99 100644 --- a/spec/services/projects/destroy_service_spec.rb +++ b/spec/services/projects/destroy_service_spec.rb @@ -121,7 +121,16 @@ describe Projects::DestroyService do it { expect(Dir.exist?(remove_path)).to be_truthy } end - context 'when flushing caches fail' do + context 'when flushing caches fail due to Git errors' do + before do + allow(project.repository).to receive(:before_delete).and_raise(::Gitlab::Git::CommandError) + perform_enqueued_jobs { destroy_project(project, user, {}) } + end + + it_behaves_like 'deleting the project' + end + + context 'when flushing caches fail due to Redis' do before do new_user = create(:user) project.team.add_user(new_user, Gitlab::Access::DEVELOPER) |