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:
Diffstat (limited to 'app/workers/pause_control/resume_worker.rb')
-rw-r--r--app/workers/pause_control/resume_worker.rb50
1 files changed, 50 insertions, 0 deletions
diff --git a/app/workers/pause_control/resume_worker.rb b/app/workers/pause_control/resume_worker.rb
new file mode 100644
index 00000000000..98725c0b6f2
--- /dev/null
+++ b/app/workers/pause_control/resume_worker.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+module PauseControl
+ class ResumeWorker
+ include ApplicationWorker
+ # There is no onward scheduling and this cron handles work from across the
+ # application, so there's no useful context to add.
+ include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
+
+ RESCHEDULE_DELAY = 1.second
+
+ feature_category :global_search
+ data_consistency :sticky
+ idempotent!
+ urgency :low
+
+ def perform
+ reschedule_job = false
+
+ pause_strategies_workers.each do |strategy, workers|
+ strategy_klass = Gitlab::SidekiqMiddleware::PauseControl.for(strategy)
+
+ next if strategy_klass.should_pause?
+
+ workers.each do |worker|
+ next unless jobs_in_the_queue?(worker)
+
+ queue_size = resume_processing!(worker)
+ reschedule_job = true if queue_size.to_i > 0
+ end
+ end
+
+ self.class.perform_in(RESCHEDULE_DELAY) if reschedule_job
+ end
+
+ private
+
+ def jobs_in_the_queue?(worker)
+ Gitlab::SidekiqMiddleware::PauseControl::PauseControlService.has_jobs_in_waiting_queue?(worker.to_s)
+ end
+
+ def resume_processing!(worker)
+ Gitlab::SidekiqMiddleware::PauseControl::PauseControlService.resume_processing!(worker.to_s)
+ end
+
+ def pause_strategies_workers
+ Gitlab::SidekiqMiddleware::PauseControl::WorkersMap.workers || []
+ end
+ end
+end