module SidekiqScheduler::RedisManager

def self.add_schedule_change(name)

Parameters:
  • name (String) -- The name of the job
def self.add_schedule_change(name)
  Sidekiq.redis { |r| r.zadd(:schedules_changed, Time.now.to_f, name) }
end

def self.clean_schedules_changed

Remove all the schedule changes records
def self.clean_schedules_changed
  Sidekiq.redis { |r| r.del(:schedules_changed) unless r.type(:schedules_changed) == 'zset' }
end

def self.get_all_schedules

Returns:
  • (Hash) - hash with all the job schedules
def self.get_all_schedules
  Sidekiq.redis { |r| r.hgetall(:schedules) }
end

def self.get_job_last_time(name)

Returns:
  • (String) - last time the job was executed

Parameters:
  • name (String) -- The name of the job
def self.get_job_last_time(name)
  hget(last_times_key, name)
end

def self.get_job_next_time(name)

Returns:
  • (String) - next time the job has to be executed

Parameters:
  • name (String) -- The name of the job
def self.get_job_next_time(name)
  hget(next_times_key, name)
end

def self.get_job_schedule(name)

Returns:
  • (String) - schedule in JSON format

Parameters:
  • name (String) -- The name of the job
def self.get_job_schedule(name)
  hget(:schedules, name)
end

def self.get_job_state(name)

Returns:
  • (String) - state in JSON format

Parameters:
  • name (String) -- The name of the job
def self.get_job_state(name)
  hget(schedules_state_key, name)
end

def self.get_schedule_changes(from, to)

Returns:
  • (Array) - array with all the changed job names

Parameters:
  • to (Float) -- The maximum value in the range
  • from (Float) -- The minimum value in the range
def self.get_schedule_changes(from, to)
  Sidekiq.redis { |r| r.zrangebyscore(:schedules_changed, from, "(#{to}") }
end

def self.hdel(hash_key, field_key)

Parameters:
  • field_key (String) -- The key name of the field
  • hash_key (String) -- The key name of the hash
def self.hdel(hash_key, field_key)
  Sidekiq.redis { |r| r.hdel(hash_key, field_key) }
end

def self.hget(hash_key, field_key)

Returns:
  • (String) -

Parameters:
  • field_key (String) -- The key name of the field
  • hash_key (String) -- The key name of the hash
def self.hget(hash_key, field_key)
  Sidekiq.redis { |r| r.hget(hash_key, field_key) }
end

def self.hset(hash_key, field_key, value)

Parameters:
  • value (String) -- The new value name for the field
  • field_key (String) -- The key name of the field
  • hash_key (String) -- The key name of the hash
def self.hset(hash_key, field_key, value)
  Sidekiq.redis { |r| r.hset(hash_key, field_key, value) }
end

def self.last_times_key

Returns:
  • (String) - with the key
def self.last_times_key
  'sidekiq-scheduler:last_times'
end

def self.next_times_key

Returns:
  • (String) - with the key
def self.next_times_key
  'sidekiq-scheduler:next_times'
end

def self.pushed_job_key(job_name)

Returns:
  • (String) - the pushed job key

Parameters:
  • job_name (String) -- The name of the job
def self.pushed_job_key(job_name)
  "sidekiq-scheduler:pushed:#{job_name}"
end

def self.register_job_instance(job_name, time)

Returns:
  • (Boolean) - true if the job was registered, false otherwise

Parameters:
  • time (Time) -- The time at which the job was cleared by the scheduler
  • job_name (String) -- The name of the job
def self.register_job_instance(job_name, time)
  job_key = pushed_job_key(job_name)
  registered, _ = Sidekiq.redis do |r|
    r.pipelined do
      r.zadd(job_key, time.to_i, time.to_i)
      r.expire(job_key, REGISTERED_JOBS_THRESHOLD_IN_SECONDS)
    end
  end
  registered
end

def self.remove_elder_job_instances(job_name)

Parameters:
  • job_name (String) -- The name of the job
def self.remove_elder_job_instances(job_name)
  seconds_ago = Time.now.to_i - REGISTERED_JOBS_THRESHOLD_IN_SECONDS
  Sidekiq.redis do |r|
    r.zremrangebyscore(pushed_job_key(job_name), 0, seconds_ago)
  end
end

def self.remove_job_next_time(name)

Parameters:
  • name (String) -- The name of the job
def self.remove_job_next_time(name)
  hdel(next_times_key, name)
end

def self.remove_job_schedule(name)

Parameters:
  • name (String) -- The name of the job
def self.remove_job_schedule(name)
  hdel(:schedules, name)
end

def self.schedule_exist?

Returns:
  • (Boolean) - true if the schedules key is set, false otherwise
def self.schedule_exist?
  Sidekiq.redis do |r|
    case r.exists(:schedules)
    when true, 1
      true
    else
      false
    end
  end
end

def self.schedules_state_key

Returns:
  • (String) - with the key
def self.schedules_state_key
  'sidekiq-scheduler:states'
end

def self.set_job_last_time(name, last_time)

Parameters:
  • last_time (String) -- The last time the job was executed
  • name (String) -- The name of the job
def self.set_job_last_time(name, last_time)
  hset(last_times_key, name, last_time)
end

def self.set_job_next_time(name, next_time)

Parameters:
  • next_time (String) -- The next time the job has to be executed
  • name (String) -- The name of the job
def self.set_job_next_time(name, next_time)
  hset(next_times_key, name, next_time)
end

def self.set_job_schedule(name, config)

Parameters:
  • config (Hash) -- The new schedule for the job
  • name (String) -- The name of the job
def self.set_job_schedule(name, config)
  hset(:schedules, name, JSON.generate(config))
end

def self.set_job_state(name, state)

Parameters:
  • state (Hash) -- The new state for the job
  • name (String) -- The name of the job
def self.set_job_state(name, state)
  hset(schedules_state_key, name, JSON.generate(state))
end