module FoundersToolkit::Jobs::LockedJob

Public Instance Methods

extend_lock(ttl) click to toggle source
# File lib/founders_toolkit/jobs/locked_job.rb, line 45
def extend_lock(ttl)
  self.current_lock = locker.lock(lock_key,
                                  ttl,
                                  extend: current_lock,
                                  extend_only_if_locked: true) || current_lock
end
lock(ttl:, enqueue_ttl: 3_600_000) click to toggle source
# File lib/founders_toolkit/jobs/locked_job.rb, line 13
def lock(ttl:, enqueue_ttl: 3_600_000)
  before_enqueue do |_job|
    enqueue_lock = locker.lock(enqueue_lock_key, enqueue_ttl)
    throw :abort unless enqueue_lock

    persist_lock_info(enqueue_lock)
  end

  before_perform do |_job|
    enqueue_lock = get_lock_info
    if enqueue_lock
      locker.unlock(enqueue_lock)
      delete_lock_info
    end
  end

  around_perform do |job, block|
    self.current_lock = locker.lock(lock_key, ttl)

    if current_lock
      begin
        block.call
      ensure
        locker.unlock(current_lock)
      end
    else
      self.class.set(wait: ttl / 1000 / 2).perform_later(*job.arguments)
    end
  end
end

Private Instance Methods

delete_lock_info() click to toggle source
# File lib/founders_toolkit/jobs/locked_job.rb, line 65
def delete_lock_info
  Resque.redis.del(lock_info_key)
end
enqueue_lock_key() click to toggle source
# File lib/founders_toolkit/jobs/locked_job.rb, line 73
def enqueue_lock_key
  [self.class.name, 'enqueue'].concat(serialize['arguments']).join('-')
end
get_lock_info() click to toggle source
# File lib/founders_toolkit/jobs/locked_job.rb, line 58
def get_lock_info
  info = Resque.redis.get(lock_info_key)
  return unless info

  JSON.parse(info).symbolize_keys
end
lock_info_key() click to toggle source
# File lib/founders_toolkit/jobs/locked_job.rb, line 69
def lock_info_key
  "locked_job:#{job_id}"
end
lock_key() click to toggle source
# File lib/founders_toolkit/jobs/locked_job.rb, line 77
def lock_key
  [self.class.name].concat(serialize['arguments']).join('-')
end
persist_lock_info(lock_info) click to toggle source
# File lib/founders_toolkit/jobs/locked_job.rb, line 54
def persist_lock_info(lock_info)
  Resque.redis.set(lock_info_key, lock_info.to_json)
end