class MiniScheduler::ScheduleInfo

Attributes

current_owner[RW]
next_run[RW]
prev_duration[RW]
prev_result[RW]
prev_run[RW]

Public Class Methods

new(klass, manager) click to toggle source
# File lib/mini_scheduler/schedule_info.rb, line 11
def initialize(klass, manager)
  @klass = klass
  @manager = manager

  data = nil

  if data = @manager.redis.get(key)
    data = JSON.parse(data)
  end

  if data
    @next_run = data["next_run"]
    @prev_run = data["prev_run"]
    @prev_result = data["prev_result"]
    @prev_duration = data["prev_duration"]
    @current_owner = data["current_owner"]
  end
rescue
  # corrupt redis
  @next_run = @prev_run = @prev_result = @prev_duration = @current_owner = nil
end

Public Instance Methods

del!() click to toggle source
# File lib/mini_scheduler/schedule_info.rb, line 110
def del!
  clear!
  @next_run = @prev_run = @prev_result = @prev_duration = @current_owner = nil
end
key() click to toggle source
# File lib/mini_scheduler/schedule_info.rb, line 115
def key
  if @klass.is_per_host
    Manager.schedule_key(@klass, @manager.hostname)
  else
    Manager.schedule_key(@klass)
  end
end
queue_key() click to toggle source
# File lib/mini_scheduler/schedule_info.rb, line 123
def queue_key
  if @klass.is_per_host
    Manager.queue_key(@manager.queue, @manager.hostname)
  else
    Manager.queue_key(@manager.queue)
  end
end
redis() click to toggle source
# File lib/mini_scheduler/schedule_info.rb, line 131
def redis
  @manager.redis
end
schedule!() click to toggle source
# File lib/mini_scheduler/schedule_info.rb, line 87
def schedule!
  if @klass.every
    schedule_every!
  elsif @klass.daily
    schedule_daily!
  end

  write!
end
schedule_daily!() click to toggle source
# File lib/mini_scheduler/schedule_info.rb, line 71
def schedule_daily!
  return if valid?

  at = @klass.daily[:at] || 0
  today_begin = Time.now.midnight.to_i
  today_offset = DateTime.now.seconds_since_midnight

  # If it's later today
  if at > today_offset
    @next_run = today_begin + at
  else
    # Otherwise do it tomorrow
    @next_run = today_begin + 1.day + at
  end
end
schedule_every!() click to toggle source
# File lib/mini_scheduler/schedule_info.rb, line 56
def schedule_every!
  if !valid? && @prev_run
    mixup = @klass.every * @manager.random_ratio
    mixup = (mixup * Random.rand - mixup / 2).to_i
    @next_run = @prev_run + mixup + @klass.every
  end

  # this can look a bit confusing, but @next_run above could be off
  # if prev_run is off, so this ensures it ends up correct and in the
  # future
  if !valid?
    @next_run = Time.now.to_i + 300 * Random.rand
  end
end
valid?() click to toggle source

this means the schedule is going to fire, it is setup correctly. invalid schedules are fixed by running “schedule!” this happens automatically after if fire by the manager.

# File lib/mini_scheduler/schedule_info.rb, line 36
def valid?
  return false unless @next_run
  (!@prev_run && @next_run < Time.now.to_i + 300) || valid_every? || valid_daily?
end
valid_daily?() click to toggle source
# File lib/mini_scheduler/schedule_info.rb, line 48
def valid_daily?
  return false unless @klass.daily
  return true if !@prev_run && @next_run && @next_run <= (Time.now + 1.day).to_i
  !!@prev_run &&
    @prev_run <= Time.now.to_i &&
    @next_run < @prev_run + 1.day
end
valid_every?() click to toggle source
# File lib/mini_scheduler/schedule_info.rb, line 41
def valid_every?
  return false unless @klass.every
  !!@prev_run &&
    @prev_run <= Time.now.to_i &&
    @next_run < @prev_run + @klass.every * (1 + @manager.random_ratio)
end
write!() click to toggle source
# File lib/mini_scheduler/schedule_info.rb, line 97
def write!
  clear!
  redis.set key, {
    next_run: @next_run,
    prev_run: @prev_run,
    prev_duration: @prev_duration,
    prev_result: @prev_result,
    current_owner: @current_owner
  }.to_json

  redis.zadd queue_key, @next_run, @klass if @next_run
end

Private Instance Methods

clear!() click to toggle source
# File lib/mini_scheduler/schedule_info.rb, line 136
def clear!
  redis.del key
  redis.zrem queue_key, @klass
end