summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2018-09-19 05:37:02 -0700
committerStan Hu <stanhu@gmail.com>2018-09-19 06:36:29 -0700
commit311beef242ae4fc3dd666542ca01938fb9d0e15d (patch)
tree4dcaf0d71384b5b0c856c74145d846a606be4f76
parenta1912ccc894386b112faba2932f1dd98c03aea0e (diff)
downloadgitlab-ce-311beef242ae4fc3dd666542ca01938fb9d0e15d.tar.gz
Move registry destroy out of project transaction
-rw-r--r--app/models/container_repository.rb2
-rw-r--r--app/services/projects/destroy_service.rb19
-rw-r--r--spec/features/container_registry_spec.rb2
-rw-r--r--spec/services/projects/container_repository/destroy_service_spec.rb2
-rw-r--r--spec/services/projects/destroy_service_spec.rb2
5 files changed, 18 insertions, 9 deletions
diff --git a/app/models/container_repository.rb b/app/models/container_repository.rb
index 93ca3a5daf4..2c08a8e1acf 100644
--- a/app/models/container_repository.rb
+++ b/app/models/container_repository.rb
@@ -8,8 +8,6 @@ class ContainerRepository < ActiveRecord::Base
delegate :client, to: :registry
- before_destroy :delete_tags!
-
# rubocop: disable CodeReuse/ServiceClass
def registry
@registry ||= begin
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb
index 5090ebf8f51..210571b6b4e 100644
--- a/app/services/projects/destroy_service.rb
+++ b/app/services/projects/destroy_service.rb
@@ -133,11 +133,11 @@ module Projects
end
def attempt_destroy_transaction(project)
- Project.transaction do
- unless remove_legacy_registry_tags
- raise_error('Failed to remove some tags in project container registry. Please try again or contact administrator.')
- end
+ unless remove_registry_tags
+ raise_error('Failed to remove some tags in project container registry. Please try again or contact administrator.')
+ end
+ Project.transaction do
log_destroy_event
trash_repositories!
@@ -156,6 +156,17 @@ module Projects
log_info("Attempting to destroy #{project.full_path} (#{project.id})")
end
+ def remove_registry_tags
+ return false unless remove_legacy_registry_tags
+
+ project.container_repositories.find_each do |container_repository|
+ service = Projects::ContainerRepository::DestroyService.new(project, current_user)
+ service.execute(container_repository)
+ end
+
+ true
+ end
+
##
# This method makes sure that we correctly remove registry tags
# for legacy image repository (when repository path equals project path).
diff --git a/spec/features/container_registry_spec.rb b/spec/features/container_registry_spec.rb
index 0dddf6d3ec5..9986206f619 100644
--- a/spec/features/container_registry_spec.rb
+++ b/spec/features/container_registry_spec.rb
@@ -39,7 +39,7 @@ describe "Container Registry", :js do
visit_container_registry
expect_any_instance_of(ContainerRepository)
- .to receive(:delete_tags!).twice.and_return(true)
+ .to receive(:delete_tags!).and_return(true)
click_on(class: 'js-remove-repo')
end
diff --git a/spec/services/projects/container_repository/destroy_service_spec.rb b/spec/services/projects/container_repository/destroy_service_spec.rb
index af54e1b15e3..affcc66d2bb 100644
--- a/spec/services/projects/container_repository/destroy_service_spec.rb
+++ b/spec/services/projects/container_repository/destroy_service_spec.rb
@@ -33,7 +33,7 @@ describe Projects::ContainerRepository::DestroyService do
end
it 'deletes the repository' do
- expect(repository).to receive(:delete_tags!).twice.and_call_original
+ expect(repository).to receive(:delete_tags!).and_call_original
expect { described_class.new(project, user).execute(repository) }.to change { ContainerRepository.all.count }.by(-1)
end
end
diff --git a/spec/services/projects/destroy_service_spec.rb b/spec/services/projects/destroy_service_spec.rb
index e428808ab68..beff499f2be 100644
--- a/spec/services/projects/destroy_service_spec.rb
+++ b/spec/services/projects/destroy_service_spec.rb
@@ -204,7 +204,7 @@ describe Projects::DestroyService do
context 'when image repository deletion fails' do
it 'raises an exception' do
expect_any_instance_of(ContainerRepository)
- .to receive(:delete_tags!).and_return(false)
+ .to receive(:delete_tags!).and_raise(RuntimeError)
expect(destroy_project(project, user)).to be false
end