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/changelogs/unreleased/sh-delete-tags-outside-transaction.yml b/changelogs/unreleased/sh-delete-tags-outside-transaction.yml new file mode 100644 index 00000000000..974da70251e --- /dev/null +++ b/changelogs/unreleased/sh-delete-tags-outside-transaction.yml @@ -0,0 +1,5 @@ +--- +title: Delete container repository tags outside of transaction +merge_request: 21679 +author: +type: fixed diff --git a/spec/features/container_registry_spec.rb b/spec/features/container_registry_spec.rb index 9986206f619..0dddf6d3ec5 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!).and_return(true) + .to receive(:delete_tags!).twice.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 307ccc88865..af54e1b15e3 100644 --- a/spec/services/projects/container_repository/destroy_service_spec.rb +++ b/spec/services/projects/container_repository/destroy_service_spec.rb @@ -33,6 +33,7 @@ describe Projects::ContainerRepository::DestroyService do end it 'deletes the repository' do + expect(repository).to receive(:delete_tags!).twice.and_call_original expect { described_class.new(project, user).execute(repository) }.to change { ContainerRepository.all.count }.by(-1) end end