class Scheduler::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/scheduler/schedule_info.rb, line 9
def initialize(klass, manager)
  @klass = klass
  @manager = manager

  data = nil

  if data = $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/scheduler/schedule_info.rb, line 102
def del!
  clear!
  @next_run = @prev_run = @prev_result = @prev_duration = @current_owner = nil
end
key() click to toggle source
# File lib/scheduler/schedule_info.rb, line 107
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/scheduler/schedule_info.rb, line 115
def queue_key
  if @klass.is_per_host
    Manager.queue_key(@manager.hostname)
  else
    Manager.queue_key
  end
end
redis() click to toggle source
# File lib/scheduler/schedule_info.rb, line 123
def redis
  @manager.redis
end
schedule!() click to toggle source
# File lib/scheduler/schedule_info.rb, line 78
def schedule!
  if @klass.every
    schedule_every!
  elsif @klass.daily
    schedule_daily!
  end

  write!
end
schedule_daily!() click to toggle source
# File lib/scheduler/schedule_info.rb, line 62
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/scheduler/schedule_info.rb, line 50
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

  if !valid?
    @next_run = Time.now.to_i + 5.minutes * Random.rand
  end
end
valid?() click to toggle source
# File lib/scheduler/schedule_info.rb, line 31
def valid?
  return false unless @next_run
  (!@prev_run && @next_run < Time.now.to_i + 5.minutes) || valid_every? || valid_daily?
end
valid_daily?() click to toggle source
# File lib/scheduler/schedule_info.rb, line 43
def valid_daily?
  return false unless @klass.daily
  !!@prev_run &&
    @prev_run <= Time.now.to_i &&
    @next_run < @prev_run + 1.day
end
valid_every?() click to toggle source
# File lib/scheduler/schedule_info.rb, line 36
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/scheduler/schedule_info.rb, line 88
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
end

Private Instance Methods

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