2020-09-11 12:08:50 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
class MergeRequestCleanupRefsWorker
|
|
|
|
include ApplicationWorker
|
2021-07-14 12:09:23 +00:00
|
|
|
include LimitedCapacity::Worker
|
|
|
|
include Gitlab::Utils::StrongMemoize
|
2020-09-11 12:08:50 +00:00
|
|
|
|
2021-07-21 12:09:35 +00:00
|
|
|
data_consistency :always
|
|
|
|
|
2021-04-30 18:10:09 +00:00
|
|
|
sidekiq_options retry: 3
|
|
|
|
|
2020-12-02 18:09:35 +00:00
|
|
|
feature_category :code_review
|
2020-09-11 12:08:50 +00:00
|
|
|
idempotent!
|
|
|
|
|
2021-07-14 12:09:23 +00:00
|
|
|
# Hard-coded to 4 for now. Will be configurable later on via application settings.
|
|
|
|
# This means, there can only be 4 jobs running at the same time at maximum.
|
|
|
|
MAX_RUNNING_JOBS = 4
|
|
|
|
FAILURE_THRESHOLD = 3
|
2021-01-20 12:11:06 +00:00
|
|
|
|
2021-07-14 12:09:23 +00:00
|
|
|
def perform_work
|
2022-05-06 15:09:03 +00:00
|
|
|
return unless Feature.enabled?(:merge_request_refs_cleanup)
|
2020-09-11 12:08:50 +00:00
|
|
|
|
|
|
|
unless merge_request
|
2021-07-14 12:09:23 +00:00
|
|
|
logger.error('No existing merge request to be cleaned up.')
|
2020-09-11 12:08:50 +00:00
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2021-07-14 12:09:23 +00:00
|
|
|
log_extra_metadata_on_done(:merge_request_id, merge_request.id)
|
|
|
|
|
|
|
|
result = MergeRequests::CleanupRefsService.new(merge_request).execute
|
|
|
|
|
|
|
|
if result[:status] == :success
|
|
|
|
merge_request_cleanup_schedule.complete!
|
|
|
|
else
|
|
|
|
if merge_request_cleanup_schedule.failed_count < FAILURE_THRESHOLD
|
|
|
|
merge_request_cleanup_schedule.retry!
|
|
|
|
else
|
|
|
|
merge_request_cleanup_schedule.mark_as_failed!
|
|
|
|
end
|
|
|
|
|
|
|
|
log_extra_metadata_on_done(:message, result[:message])
|
|
|
|
end
|
|
|
|
|
|
|
|
log_extra_metadata_on_done(:status, merge_request_cleanup_schedule.status)
|
|
|
|
end
|
|
|
|
|
|
|
|
def remaining_work_count
|
|
|
|
MergeRequest::CleanupSchedule
|
|
|
|
.scheduled_and_unstarted
|
|
|
|
.limit(max_running_jobs)
|
|
|
|
.count
|
|
|
|
end
|
|
|
|
|
|
|
|
def max_running_jobs
|
|
|
|
MAX_RUNNING_JOBS
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
2020-09-11 12:08:50 +00:00
|
|
|
|
2021-07-14 12:09:23 +00:00
|
|
|
def merge_request
|
|
|
|
strong_memoize(:merge_request) do
|
|
|
|
merge_request_cleanup_schedule&.merge_request
|
|
|
|
end
|
|
|
|
end
|
2020-09-11 12:08:50 +00:00
|
|
|
|
2021-07-14 12:09:23 +00:00
|
|
|
def merge_request_cleanup_schedule
|
|
|
|
strong_memoize(:merge_request_cleanup_schedule) do
|
|
|
|
MergeRequest::CleanupSchedule.start_next
|
|
|
|
end
|
2020-09-11 12:08:50 +00:00
|
|
|
end
|
|
|
|
end
|