Sha256: 29d6737620c2244919ae872dfe27253f5bc2252e300f79d420ae79b6d5087f3c

Contents?: true

Size: 1.76 KB

Versions: 2

Compression:

Stored size: 1.76 KB

Contents

require 'pathname'
require 'digest/sha1'

module SidekiqUniqueJobs
  module ScriptMock
    module_function

    extend SingleForwardable
    def_delegator :SidekiqUniqueJobs, :connection

    def call(file_name, redis_pool, options = {})
      send(file_name, redis_pool, options)
    end

    def acquire_lock(redis_pool, options = {})
      connection(redis_pool) do |redis|
        unique_key = options[:keys][0]
        job_id     = options[:argv][0]
        expires    = options[:argv][1].to_i
        stored_jid = redis.get(unique_key)

        return stored_jid == job_id ? 1 : 0 if stored_jid

        return 0 unless redis.set(unique_key, job_id, nx: true, ex: expires)
        redis.hsetnx(SidekiqUniqueJobs::HASH_KEY, job_id, unique_key)
        return 1
      end
    end

    def release_lock(redis_pool, options = {})
      connection(redis_pool) do |redis|
        unique_key = options[:keys][0]
        job_id     = options[:argv][0]
        stored_jid = redis.get(unique_key)

        return -1 unless stored_jid
        return 0 unless stored_jid == job_id || stored_jid == '2'

        redis.del(unique_key)
        redis.hdel(SidekiqUniqueJobs::HASH_KEY, job_id)
        return 1
      end
    end

    def synchronize(redis_pool, options = {})
      connection(redis_pool) do |redis|
        unique_key = options[:keys][0]
        time       = options[:argv][0].to_i
        expires    = options[:argv][1].to_f

        return 1 if redis.set(unique_key, time + expires, nx: true, ex: expires)

        stored_time = redis.get(unique_key)
        if stored_time && stored_time < time
          if redis.set(unique_key, time + expires, xx: true, ex: expires)
            return 1
          end
        end

        return 0
      end
    end
  end
  # rubocop:enable MethodLength
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
sidekiq-unique-jobs-5.0.1 lib/sidekiq_unique_jobs/script_mock.rb
sidekiq-unique-jobs-5.0.0 lib/sidekiq_unique_jobs/script_mock.rb