Sha256: 4641b1cee7fdf1d881f8e9ad2ba25d8d11147322eea675dc60738efaa11d6441

Contents?: true

Size: 1.51 KB

Versions: 4

Compression:

Stored size: 1.51 KB

Contents

module Sidekiq::LimitFetch::Global
  module Monitor
    extend self

    HEARTBEAT_PREFIX = 'limit:heartbeat:'
    PROCESS_SET = 'limit:processes'
    HEARTBEAT_TTL = 20
    REFRESH_TIMEOUT = 5

    def start!(ttl=HEARTBEAT_TTL, timeout=REFRESH_TIMEOUT)
      Thread.new do
        loop do
          add_dynamic_queues
          update_heartbeat ttl
          invalidate_old_processes
          sleep timeout
        end
      end
    end

    def all_processes
      Sidekiq.redis {|it| it.smembers PROCESS_SET }
    end

    def old_processes
      all_processes.reject do |process|
        Sidekiq.redis {|it| it.get heartbeat_key process }
      end
    end

    def remove_old_processes!
      Sidekiq.redis do |it|
        old_processes.each {|process| it.srem PROCESS_SET, process }
      end
    end

    def add_dynamic_queues
      queues = Sidekiq::LimitFetch::Queues
      queues.add Sidekiq::Queue.all.map(&:name) if queues.dynamic?
    end

    private

    def update_heartbeat(ttl)
      Sidekiq.redis do |it|
        it.multi do
          it.set heartbeat_key, true
          it.sadd PROCESS_SET, Selector.uuid
          it.expire heartbeat_key, ttl
        end
      end
    end

    def invalidate_old_processes
      Sidekiq.redis do |it|
        remove_old_processes!
        processes = all_processes

        Sidekiq::Queue.instances.each do |queue|
          queue.remove_locks_except! processes
        end
      end
    end

    def heartbeat_key(process=Selector.uuid)
      HEARTBEAT_PREFIX + process
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
sidekiq-limit_fetch-3.2.1 lib/sidekiq/limit_fetch/global/monitor.rb
sidekiq-limit_fetch-3.1.0 lib/sidekiq/limit_fetch/global/monitor.rb
sidekiq-limit_fetch-3.0.1 lib/sidekiq/limit_fetch/global/monitor.rb
sidekiq-limit_fetch-3.0.0 lib/sidekiq/limit_fetch/global/monitor.rb