class Rjob::Scripts::CheckLeadership

Public Instance Methods

arg_params() click to toggle source
# File lib/rjob/scripts/check_leadership.rb, line 4
def arg_params
  %i(worker_name time_now prefix heartbeat_timeout)
end
lua_script() click to toggle source
# File lib/rjob/scripts/check_leadership.rb, line 8
  def lua_script
    <<~LUA
      local worker_name = ARGV[1]
      local time_now = ARGV[2]
      local prefix = ARGV[3]
      local heartbeat_timeout = tonumber(ARGV[4])
      local r = redis
      if r.call('setnx', prefix .. ':leaderworker', worker_name) == 1 then
        return worker_name
      else
        local leader = r.call('get', prefix .. ':leaderworker')
        local last_hb = tonumber(r.call('hget', prefix .. ':worker:' .. leader, 'heartbeat'))
        if last_hb == nil or time_now - last_hb > heartbeat_timeout then
          r.call('set', prefix .. ':leaderworker', worker_name)
          return worker_name
        end
        return leader
      end
    LUA
  end