Sha256: d2dcfd21f0a01c538e9f92e5086821a127a78585d2b6a90722f03e3e111cdf50

Contents?: true

Size: 1.92 KB

Versions: 1

Compression:

Stored size: 1.92 KB

Contents

module DeepTest
  class ProcessOrchestrator
    def self.run(options, runner)
      new(options, runner).run
    end
    
    def initialize(options, runner)
      @options = options
      @runner = runner
    end
    
    def run
      stop_zombie_warlocks
      start_warlock_server
      start_all_workers
      start_loader
      wait_for_loader_to_be_done
      exit_process        
    ensure
      stop_all_warlocks
    end
    
  private

    def exit_process
      Kernel.exit($?.success? ? 0 : 1)
    end

    def start_all_workers
      each_worker do |worker_num|
        start_worker(worker_num) do
          reseed_random_numbers
          reconnect_to_database
          worker = DeepTest::Worker.new(worker_num,
                                        RindaBlackboard.new(@options), 
                                        @options.new_worker_listener)
          worker.run
        end
      end        
    end

    def reconnect_to_database
      ActiveRecord::Base.connection.reconnect! if defined?(ActiveRecord::Base)
    end

    def start_worker(worker_num, &blk)
      @warlock.start("worker #{worker_num}", &blk)
    end

    def reseed_random_numbers
      srand
    end

    def wait_for_loader_to_be_done
      Process.wait(@loader_pid)
    end

    def start_warlock_server
      @warlock.start("server") { DeepTest::Server.start }
      sleep 0.5 # TODO: change from sleep to something better... Process.wait?
    end

    def stop_all_warlocks
      @warlock.stop_all if @warlock
    end

    def each_worker
      @options.number_of_workers.to_i.times { |worker_num| yield worker_num }
    end

    def stop_zombie_warlocks
      @warlock = DeepTest::Warlock.new
      Signal.trap("HUP") { warlock.stop_all; exit 0 }
    end

    def start_loader
      @loader_pid = fork do
        DeepTest.logger.debug "Loader Starting (#{$$})"
        passed = @runner.process_work_units
        exit(passed ? 0 : 1)
      end
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
deep_test-1.1.3 lib/deep_test/process_orchestrator.rb