class RRRSpec::Client::SlaveRunner

Constants

TASKQUEUE_ARBITER_TIMEOUT
TASKQUEUE_TASK_TIMEOUT
TIMEOUT_EXITCODE

Attributes

key[R]

Public Class Methods

new(slave, working_dir, taskset_key) click to toggle source
# File lib/rrrspec/client/slave_runner.rb, line 16
def initialize(slave, working_dir, taskset_key)
  @slave = slave
  @taskset = Taskset.new(taskset_key)
  @timeout = TASKQUEUE_TASK_TIMEOUT
  @rspec_runner = RSpecRunner.new
  @working_path = File.join(working_dir, @taskset.rsync_name)
  @unknown_spec_timeout_sec = @taskset.unknown_spec_timeout_sec
  @least_timeout_sec = @taskset.least_timeout_sec
  @worked_task_keys = Set.new
end

Public Instance Methods

spec_timeout_sec(task) click to toggle source
# File lib/rrrspec/client/slave_runner.rb, line 31
def spec_timeout_sec(task)
  if task.estimate_sec == nil
    soft_timeout_sec = @unknown_spec_timeout_sec
    hard_timeout_sec = @unknown_spec_timeout_sec + 30
  else
    estimate_sec = task.estimate_sec
    soft_timeout_sec = estimate_sec * 2
    hard_timeout_sec = estimate_sec * 3
  end
  return [soft_timeout_sec, @least_timeout_sec].max, [hard_timeout_sec, @least_timeout_sec].max
end
work() click to toggle source
# File lib/rrrspec/client/slave_runner.rb, line 43
def work
  task = @taskset.dequeue_task(@timeout)
  unless task
    @timeout = TASKQUEUE_ARBITER_TIMEOUT
    ArbiterQueue.check(@taskset)
  else
    if @worked_task_keys.include?(task.key)
      @taskset.reversed_enqueue_task(task)
      return
    else
      @worked_task_keys << task.key
    end
    return if task.status.present?

    @timeout = TASKQUEUE_TASK_TIMEOUT
    trial = Trial.create(task, @slave)

    @rspec_runner.reset
    $0 = "rrrspec slave[#{ENV['SLAVE_NUMBER']}]: setting up #{task.spec_file}"
    status, outbuf, errbuf = @rspec_runner.setup(File.join(@working_path, task.spec_file))
    unless status
      trial.finish('error', outbuf, errbuf, nil, nil, nil)
      ArbiterQueue.trial(trial)
      return
    end

    soft_timeout_sec, hard_timeout_sec = spec_timeout_sec(task)

    formatter = RedisReportingFormatter
    trial.start
    $0 = "rrrspec slave[#{ENV['SLAVE_NUMBER']}]: running #{task.spec_file}"
    status, outbuf, errbuf = ExtremeTimeout::timeout(
      hard_timeout_sec, TIMEOUT_EXITCODE
    ) do
      Timeout::timeout(soft_timeout_sec, SoftTimeoutException) do
        @rspec_runner.run(formatter)
      end
    end
    if status
      trial.finish(formatter.status, outbuf, errbuf,
                   formatter.passed, formatter.pending, formatter.failed)
    else
      trial.finish('error', outbuf, errbuf, nil, nil, nil)
    end

    ArbiterQueue.trial(trial)
  end
ensure
  $0 = "rrrspec slave[#{ENV['SLAVE_NUMBER']}]"
end
work_loop() click to toggle source
# File lib/rrrspec/client/slave_runner.rb, line 27
def work_loop
  loop { work }
end