debian-mirror-gitlab/lib/gitlab/sidekiq_queue.rb

84 lines
1.9 KiB
Ruby
Raw Normal View History

2020-04-08 14:13:33 +05:30
# frozen_string_literal: true
module Gitlab
class SidekiqQueue
include Gitlab::Utils::StrongMemoize
NoMetadataError = Class.new(StandardError)
InvalidQueueError = Class.new(StandardError)
2021-11-11 11:23:49 +05:30
WORKER_KEY = 'worker_class'
2022-04-04 11:22:00 +05:30
ALLOWED_KEYS = Gitlab::ApplicationContext.known_keys.map(&:to_s) + [WORKER_KEY]
2021-11-11 11:23:49 +05:30
2020-04-08 14:13:33 +05:30
attr_reader :queue_name
def initialize(queue_name)
@queue_name = queue_name
end
def drop_jobs!(search_metadata, timeout:)
2021-09-30 23:02:18 +05:30
start_time = monotonic_time
2020-04-08 14:13:33 +05:30
completed = true
deleted_jobs = 0
job_search_metadata =
search_metadata
.stringify_keys
2021-11-11 11:23:49 +05:30
.slice(*ALLOWED_KEYS)
.transform_keys(&method(:transform_key))
2020-04-08 14:13:33 +05:30
.compact
raise NoMetadataError if job_search_metadata.empty?
raise InvalidQueueError unless queue
queue.each do |job|
if timeout_exceeded?(start_time, timeout)
completed = false
break
end
next unless job_matches?(job, job_search_metadata)
job.delete
deleted_jobs += 1
end
{
completed: completed,
deleted_jobs: deleted_jobs,
queue_size: queue.size
}
end
private
2021-11-11 11:23:49 +05:30
def transform_key(key)
2022-04-04 11:22:00 +05:30
if Gitlab::ApplicationContext.known_keys.include?(key.to_sym)
2021-11-11 11:23:49 +05:30
"meta.#{key}"
elsif key == WORKER_KEY
'class'
end
end
2020-04-08 14:13:33 +05:30
def queue
strong_memoize(:queue) do
# Sidekiq::Queue.new always returns a queue, even if it doesn't
# exist.
Sidekiq::Queue.all.find { |queue| queue.name == queue_name }
end
end
def job_matches?(job, job_search_metadata)
job_search_metadata.all? { |key, value| job[key] == value }
end
def timeout_exceeded?(start_time, timeout)
2021-09-30 23:02:18 +05:30
(monotonic_time - start_time) > timeout
end
def monotonic_time
Gitlab::Metrics::System.monotonic_time
2020-04-08 14:13:33 +05:30
end
end
end