diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-03 18:08:08 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-03 18:08:08 +0300 |
commit | 946771d0b016ae92b15a60bc3290a33b94191ffe (patch) | |
tree | 64862c2433989483f5fce45d5539242577a362eb /lib/gitlab/sidekiq_queue.rb | |
parent | f1e2fca19a90a6992c2020cf8c2159cfb0b61bca (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/sidekiq_queue.rb')
-rw-r--r-- | lib/gitlab/sidekiq_queue.rb | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/gitlab/sidekiq_queue.rb b/lib/gitlab/sidekiq_queue.rb new file mode 100644 index 00000000000..9e9ad3107f3 --- /dev/null +++ b/lib/gitlab/sidekiq_queue.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +module Gitlab + class SidekiqQueue + include Gitlab::Utils::StrongMemoize + + NoMetadataError = Class.new(StandardError) + InvalidQueueError = Class.new(StandardError) + + attr_reader :queue_name + + def initialize(queue_name) + @queue_name = queue_name + end + + def drop_jobs!(search_metadata, timeout:) + completed = false + deleted_jobs = 0 + + job_search_metadata = + search_metadata + .stringify_keys + .slice(*Labkit::Context::KNOWN_KEYS) + .transform_keys { |key| "meta.#{key}" } + .compact + + raise NoMetadataError if job_search_metadata.empty? + raise InvalidQueueError unless queue + + begin + Timeout.timeout(timeout) do + queue.each do |job| + next unless job_matches?(job, job_search_metadata) + + job.delete + deleted_jobs += 1 + end + + completed = true + end + rescue Timeout::Error + end + + { + completed: completed, + deleted_jobs: deleted_jobs, + queue_size: queue.size + } + end + + 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 + end +end |