class DRbQS::Node::State

Constants

ALL_STATES
DEFAULT_SLEEP_TIME
LOADAVG_PATH

Attributes

calculating_task[R]

Value of state is :sleep, :wait, or :calculate.

Public Class Methods

new(state_init, process_number, opts = {}) click to toggle source
# File lib/drbqs/node/state.rb, line 11
def initialize(state_init, process_number, opts = {})
  @process_number = process_number
  @process_state = {}
  @process_number.times do |i|
    @process_state[i] = state_init
  end
  @calculating_task = {}
  @state_after_task = nil


  @load_average_threshold = opts[:max_loadavg]
  @sleep_time = opts[:sleep_time] || DEFAULT_SLEEP_TIME
  @auto_wakeup = nil
end

Public Instance Methods

all_workers_waiting?() click to toggle source
# File lib/drbqs/node/state.rb, line 61
def all_workers_waiting?
  each_worker_id.all? do |wid|
    st = get_state(wid)
    st == :wait || st == :exit
  end
end
change(proc_id, state) click to toggle source
# File lib/drbqs/node/state.rb, line 98
def change(proc_id, state)
  unless ALL_STATES.include?(state)
    raise ArgumentError, "Invalid state of node '#{state}'."
  end
  @process_state[proc_id] = state
end
change_to_sleep() click to toggle source
# File lib/drbqs/node/state.rb, line 114
def change_to_sleep
  each_worker_id do |wid|
    st = get_state(wid)
    if st == :calculate
      @state_after_task = :sleep
    elsif st != :exit
      change(wid, :sleep)
    end
  end
end
change_to_sleep_for_busy_system() click to toggle source
# File lib/drbqs/node/state.rb, line 165
def change_to_sleep_for_busy_system
  if system_busy?
    sleep_with_auto_wakeup
    return true
  end
  nil
end
each_worker_id() { |key| ... } click to toggle source
# File lib/drbqs/node/state.rb, line 30
def each_worker_id(&block)
  if block_given?
    @process_state.each do |key, val|
      yield(key)
    end
  else
    to_enum(:each_worker_id)
  end
end
get_state(wid) click to toggle source
# File lib/drbqs/node/state.rb, line 26
def get_state(wid)
  @process_state[wid]
end
ready_to_exit_after_task?() click to toggle source
# File lib/drbqs/node/state.rb, line 173
def ready_to_exit_after_task?
  @state_after_task == :exit && all_workers_waiting?
end
request?() click to toggle source
# File lib/drbqs/node/state.rb, line 57
def request?
  @state_after_task != :exit && request_task_number > 0
end
request_task_number() click to toggle source
# File lib/drbqs/node/state.rb, line 50
def request_task_number
  waiting = @process_state.select do |wid, state|
    state == :wait
  end
  waiting.size
end
set_calculating_task(wid, task_id) click to toggle source
# File lib/drbqs/node/state.rb, line 68
def set_calculating_task(wid, task_id)
  @calculating_task[task_id] = wid
  change(wid, :calculate)
end
set_exit_after_task() click to toggle source
# File lib/drbqs/node/state.rb, line 73
def set_exit_after_task
  @state_after_task = :exit
  each_worker_id do |wid|
    st = get_state(wid)
    if (st == :wait) && (st == :sleep)
      change(wid, :exit)
    end
  end
end
set_finish_of_task(sent_task_id) click to toggle source
# File lib/drbqs/node/state.rb, line 83
def set_finish_of_task(sent_task_id)
  sent_task_id.each do |task_id|
    if wid = @calculating_task.delete(task_id)
      case @state_after_task
      when :exit
        @process_state[wid] = :exit
      when :sleep
        @process_state[wid] = :sleep
      else
        @process_state[wid] = :wait
      end
    end
  end
end
sleep_with_auto_wakeup() click to toggle source
# File lib/drbqs/node/state.rb, line 125
def sleep_with_auto_wakeup
  each_worker_id do |wid|
    if get_state(wid) == :wait
      change(wid, :sleep)
    end
  end
  @auto_wakeup = Time.now + @sleep_time
end
waiting_worker_id() click to toggle source
# File lib/drbqs/node/state.rb, line 40
def waiting_worker_id
  ary = []
  @process_state.each do |wid, state|
    if state == :wait
      ary << wid
    end
  end
  ary
end
wakeup_automatically_for_unbusy_system() click to toggle source
# File lib/drbqs/node/state.rb, line 134
def wakeup_automatically_for_unbusy_system
  if @auto_wakeup && Time.now > @auto_wakeup && !system_busy?
    each_worker_id do |wid|
      if get_state(wid) == :sleep
        change(wid, :wait)
      end
    end
    @auto_wakeup = nil
    return true
  end
  nil
end
wakeup_sleeping_worker() click to toggle source
# File lib/drbqs/node/state.rb, line 105
def wakeup_sleeping_worker
  each_worker_id do |wid|
    if get_state(wid) == :sleep
      change(wid, :wait)
    end
  end
  @state_after_task = nil
end

Private Instance Methods

get_load_average() click to toggle source
# File lib/drbqs/node/state.rb, line 147
def get_load_average
  File.read(LOADAVG_PATH).split[0..2].map do |s|
    s.to_f
  end
end
system_busy?() click to toggle source
# File lib/drbqs/node/state.rb, line 154
def system_busy?
  if @load_average_threshold && File.exist?(LOADAVG_PATH)
    avg = get_load_average
    if (avg[0] + avg[1]) / 2 >= @load_average_threshold
      return true
    end
  end
  nil
end