gitlab-org--gitlab-foss/app/workers/container_registry/delete_container_repository...

82 lines
2.4 KiB
Ruby

# frozen_string_literal: true
module ContainerRegistry
class DeleteContainerRepositoryWorker
include ApplicationWorker
include LimitedCapacity::Worker
include Gitlab::Utils::StrongMemoize
extend ::Gitlab::Utils::Override
data_consistency :always
queue_namespace :container_repository_delete
feature_category :container_registry
urgency :low
worker_resource_boundary :unknown
idempotent!
MAX_CAPACITY = 2
CLEANUP_TAGS_SERVICE_PARAMS = {
'name_regex_delete' => '.*',
'container_expiration_policy' => true # to avoid permissions checks
}.freeze
def perform_work
return unless next_container_repository
result = delete_tags
log_delete_tags_service_result(next_container_repository, result)
if result[:status] == :error || next_container_repository.tags_count != 0
return next_container_repository.set_delete_scheduled_status
end
next_container_repository.destroy!
rescue StandardError => exception
next_container_repository&.set_delete_scheduled_status
Gitlab::ErrorTracking.log_exception(exception, class: self.class.name)
end
def remaining_work_count
::ContainerRepository.delete_scheduled.limit(max_running_jobs + 1).count
end
def max_running_jobs
MAX_CAPACITY
end
private
def delete_tags
service = Projects::ContainerRepository::CleanupTagsService.new(
container_repository: next_container_repository,
params: CLEANUP_TAGS_SERVICE_PARAMS
)
service.execute
end
def next_container_repository
strong_memoize(:next_container_repository) do
ContainerRepository.transaction do
# we don't care about the order
repository = ContainerRepository.next_pending_destruction(order_by: nil)
repository&.tap(&:set_delete_ongoing_status)
end
end
end
def log_delete_tags_service_result(container_repository, delete_tags_service_result)
logger.info(
structured_payload(
project_id: container_repository.project_id,
container_repository_id: container_repository.id,
container_repository_path: container_repository.path,
tags_size_before_delete: delete_tags_service_result[:original_size],
deleted_tags_size: delete_tags_service_result[:deleted_size]
)
)
end
end
end