summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2017-02-20 13:15:38 +0000
committerRémy Coutable <remy@rymai.me>2017-02-20 13:15:38 +0000
commit10f5f3f18f2317df0be454c90d2f9650d1e2d11a (patch)
tree8e1f44321f311a951e13313f9c8121ef4013bd9f
parentc89449e6110c2bdf6e1410bae3e7b7d807c5e305 (diff)
parent45f94ea78cf85a58e71e9a8ae62adc7e3f86bc99 (diff)
downloadgitlab-ce-10f5f3f18f2317df0be454c90d2f9650d1e2d11a.tar.gz
Merge branch 'sh-fix-project-team-truncation-in-destroy' into 'master'
Prevent project team from being truncated too early during project destruction See merge request !9361
-rw-r--r--app/services/projects/destroy_service.rb3
-rw-r--r--spec/services/projects/destroy_service_spec.rb19
2 files changed, 20 insertions, 2 deletions
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb
index a08c6fcd94b..9716a1780a9 100644
--- a/app/services/projects/destroy_service.rb
+++ b/app/services/projects/destroy_service.rb
@@ -17,8 +17,6 @@ module Projects
def execute
return false unless can?(current_user, :remove_project, project)
- project.team.truncate
-
repo_path = project.path_with_namespace
wiki_path = repo_path + '.wiki'
@@ -30,6 +28,7 @@ module Projects
Projects::UnlinkForkService.new(project, current_user).execute
Project.transaction do
+ project.team.truncate
project.destroy!
unless remove_registry_tags
diff --git a/spec/services/projects/destroy_service_spec.rb b/spec/services/projects/destroy_service_spec.rb
index 3faa88c00a1..74bfba44dfd 100644
--- a/spec/services/projects/destroy_service_spec.rb
+++ b/spec/services/projects/destroy_service_spec.rb
@@ -50,6 +50,25 @@ describe Projects::DestroyService, services: true do
it { expect(Dir.exist?(remove_path)).to be_truthy }
end
+ context 'when flushing caches fail' do
+ before do
+ new_user = create(:user)
+ project.team.add_user(new_user, Gitlab::Access::DEVELOPER)
+ allow_any_instance_of(Projects::DestroyService).to receive(:flush_caches).and_raise(Redis::CannotConnectError)
+ end
+
+ it 'keeps project team intact upon an error' do
+ Sidekiq::Testing.inline! do
+ begin
+ destroy_project(project, user, {})
+ rescue Redis::CannotConnectError
+ end
+ end
+
+ expect(project.team.members.count).to eq 1
+ end
+ end
+
context 'with async_execute' do
let(:async) { true }