diff options
Diffstat (limited to 'lib/gitlab/sidekiq_middleware/concurrency_limit/workers_concurrency.rb')
-rw-r--r-- | lib/gitlab/sidekiq_middleware/concurrency_limit/workers_concurrency.rb | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/gitlab/sidekiq_middleware/concurrency_limit/workers_concurrency.rb b/lib/gitlab/sidekiq_middleware/concurrency_limit/workers_concurrency.rb new file mode 100644 index 00000000000..fe2deb867ca --- /dev/null +++ b/lib/gitlab/sidekiq_middleware/concurrency_limit/workers_concurrency.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module Gitlab + module SidekiqMiddleware + module ConcurrencyLimit + class WorkersConcurrency + class << self + CACHE_EXPIRES_IN = 5.seconds + + def current_for(worker:, skip_cache: false) + worker_class = worker.is_a?(Class) ? worker : worker.class + worker_name = worker_class.name + + workers(skip_cache: skip_cache)[worker_name].to_i + end + + def workers(skip_cache: false) + return workers_uncached if skip_cache + + Rails.cache.fetch(self.class.name, expires_in: CACHE_EXPIRES_IN) do + workers_uncached + end + end + + private + + def workers_uncached + sidekiq_workers.map { |_process_id, _thread_id, work| ::Gitlab::Json.parse(work['payload'])['class'] }.tally + end + + def sidekiq_workers + Sidekiq::Workers.new.each + end + end + end + end + end +end |