summaryrefslogtreecommitdiff
path: root/app/services
diff options
context:
space:
mode:
authorRobert Speicher <robert@gitlab.com>2018-09-19 22:03:11 +0000
committerRobert Speicher <robert@gitlab.com>2018-09-19 22:03:11 +0000
commite7df8070b23b5c417ac7e835a470fda719cb51fc (patch)
treee430344db9296df533ac7b8d427da603407f60f0 /app/services
parent3f51ec2124037177b446d620c41441673f17f161 (diff)
parent311beef242ae4fc3dd666542ca01938fb9d0e15d (diff)
downloadgitlab-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/services')
-rw-r--r--app/services/projects/container_repository/destroy_service.rb2
-rw-r--r--app/services/projects/destroy_service.rb19
2 files changed, 17 insertions, 4 deletions
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).