diff options
author | Robert Speicher <robert@gitlab.com> | 2018-09-19 22:03:11 +0000 |
---|---|---|
committer | Robert Speicher <robert@gitlab.com> | 2018-09-19 22:03:11 +0000 |
commit | e7df8070b23b5c417ac7e835a470fda719cb51fc (patch) | |
tree | e430344db9296df533ac7b8d427da603407f60f0 /app | |
parent | 3f51ec2124037177b446d620c41441673f17f161 (diff) | |
parent | 311beef242ae4fc3dd666542ca01938fb9d0e15d (diff) | |
download | gitlab-ce-e7df8070b23b5c417ac7e835a470fda719cb51fc.tar.gz |
Merge branch 'sh-delete-tags-outside-transaction' into 'master'
Delete container repository tags outside of transaction
Closes #51380
See merge request gitlab-org/gitlab-ce!21679
Diffstat (limited to 'app')
-rw-r--r-- | app/models/container_repository.rb | 2 | ||||
-rw-r--r-- | app/services/projects/container_repository/destroy_service.rb | 2 | ||||
-rw-r--r-- | app/services/projects/destroy_service.rb | 19 |
3 files changed, 17 insertions, 6 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/container_repository/destroy_service.rb b/app/services/projects/container_repository/destroy_service.rb index a8e7eab6068..1f5af7970d6 100644 --- a/app/services/projects/container_repository/destroy_service.rb +++ b/app/services/projects/container_repository/destroy_service.rb @@ -6,6 +6,8 @@ module Projects def execute(container_repository) return false unless can?(current_user, :update_container_image, project) + # Delete tags outside of the transaction to avoid hitting an idle-in-transaction timeout + container_repository.delete_tags! container_repository.destroy end end 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). |