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