2020-01-11 15:07:49 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2020-02-19 18:09:10 +00:00
|
|
|
class ContainerExpirationPolicyWorker # rubocop:disable Scalability/IdempotentWorker
|
2020-01-11 15:07:49 +00:00
|
|
|
include ApplicationWorker
|
2021-04-30 18:10:09 +00:00
|
|
|
|
2021-07-21 12:09:35 +00:00
|
|
|
data_consistency :always
|
|
|
|
|
2022-05-02 21:09:12 +00:00
|
|
|
# rubocop:disable Scalability/CronWorkerContext
|
|
|
|
# This worker does not perform work scoped to a context
|
2020-02-11 15:08:44 +00:00
|
|
|
include CronjobQueue
|
2022-05-02 21:09:12 +00:00
|
|
|
# rubocop:enable Scalability/CronWorkerContext
|
|
|
|
|
2020-10-26 18:08:27 +00:00
|
|
|
include ExclusiveLeaseGuard
|
2020-01-11 15:07:49 +00:00
|
|
|
|
|
|
|
feature_category :container_registry
|
|
|
|
|
2020-10-26 18:08:27 +00:00
|
|
|
InvalidPolicyError = Class.new(StandardError)
|
|
|
|
|
2021-03-26 03:09:21 +00:00
|
|
|
BATCH_SIZE = 1000
|
2020-10-26 18:08:27 +00:00
|
|
|
|
2020-01-11 15:07:49 +00:00
|
|
|
def perform
|
2021-05-20 15:10:13 +00:00
|
|
|
process_stale_ongoing_cleanups
|
2021-06-16 18:10:35 +00:00
|
|
|
disable_policies_without_container_repositories
|
2022-05-02 21:09:12 +00:00
|
|
|
try_obtain_lease do
|
|
|
|
ContainerExpirationPolicies::CleanupContainerRepositoryWorker.perform_with_capacity
|
|
|
|
end
|
2021-07-09 12:08:17 +00:00
|
|
|
log_counts
|
2020-10-26 18:08:27 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2021-06-16 18:10:35 +00:00
|
|
|
def disable_policies_without_container_repositories
|
|
|
|
ContainerExpirationPolicy.active.each_batch(of: BATCH_SIZE) do |policies|
|
|
|
|
policies.without_container_repositories
|
|
|
|
.update_all(enabled: false)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-07-09 12:08:17 +00:00
|
|
|
def log_counts
|
|
|
|
use_replica_if_available do
|
|
|
|
required_count = ContainerRepository.requiring_cleanup.count
|
|
|
|
unfinished_count = ContainerRepository.with_unfinished_cleanup.count
|
|
|
|
|
|
|
|
log_extra_metadata_on_done(:cleanup_required_count, required_count)
|
|
|
|
log_extra_metadata_on_done(:cleanup_unfinished_count, unfinished_count)
|
|
|
|
log_extra_metadata_on_done(:cleanup_total_count, required_count + unfinished_count)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# data_consistency :delayed not used as this is a cron job and those jobs are
|
|
|
|
# not perfomed with a delay
|
|
|
|
# https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63635#note_603771207
|
|
|
|
def use_replica_if_available(&blk)
|
|
|
|
::Gitlab::Database::LoadBalancing::Session.current.use_replicas_for_read_queries(&blk)
|
|
|
|
end
|
|
|
|
|
2021-05-20 15:10:13 +00:00
|
|
|
def process_stale_ongoing_cleanups
|
|
|
|
threshold = delete_tags_service_timeout.seconds + 30.minutes
|
|
|
|
ContainerRepository.with_stale_ongoing_cleanup(threshold.ago)
|
|
|
|
.update_all(expiration_policy_cleanup_status: :cleanup_unfinished)
|
|
|
|
end
|
|
|
|
|
2020-10-26 18:08:27 +00:00
|
|
|
def lease_timeout
|
|
|
|
5.hours
|
|
|
|
end
|
2021-05-20 15:10:13 +00:00
|
|
|
|
|
|
|
def delete_tags_service_timeout
|
|
|
|
::Gitlab::CurrentSettings.current_application_settings.container_registry_delete_tags_service_timeout || 0
|
|
|
|
end
|
2020-01-11 15:07:49 +00:00
|
|
|
end
|