Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-03-03 18:08:08 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-03-03 18:08:08 +0300
commit946771d0b016ae92b15a60bc3290a33b94191ffe (patch)
tree64862c2433989483f5fce45d5539242577a362eb /lib/gitlab/sidekiq_queue.rb
parentf1e2fca19a90a6992c2020cf8c2159cfb0b61bca (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/sidekiq_queue.rb')
-rw-r--r--lib/gitlab/sidekiq_queue.rb63
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