class RRRSpec::Server::Dispatcher

Public Class Methods

work() click to toggle source
# File lib/rrrspec/server/dispatcher.rb, line 4
def self.work
  assigned = Hash.new { |hash,key| hash[key] = [] }
  unemployed = Hash.new { |hash,key| hash[key] = [] }
  Worker.list.each do |worker|
    unless worker.exist?
      worker.evict
    else
      taskset = worker.current_taskset
      if taskset
        assigned[taskset.key] << worker
      else
        unemployed[worker.worker_type] << worker
      end
    end
  end

  ActiveTaskset.list.each do |taskset|
    should_mark_running = false
    case taskset.status
    when 'succeeded', 'cancelled', 'failed'
      next
    when nil
      should_mark_running = true
    end

    # Cache the values
    max_workers = taskset.max_workers
    worker_type = taskset.worker_type
    while max_workers > assigned[taskset.key].size
      break if unemployed[worker_type].empty?
      worker = unemployed[worker_type].pop
      if should_mark_running
        taskset.update_status('running')
        should_mark_running = false
      end
      worker.enqueue_taskset(taskset)
      assigned[taskset.key] << worker
    end
  end
end
work_loop() click to toggle source
# File lib/rrrspec/server/dispatcher.rb, line 45
def self.work_loop
  loop do
    DispatcherQueue.wait
    work
  end
end