experiment.py revision f84bd3b7b64deba46192ae6d15a712ab66e90a6e
1#!/usr/bin/python 2 3# Copyright 2011 Google Inc. All Rights Reserved. 4 5import os 6import time 7from autotest_runner import AutotestRunner 8from benchmark_run import BenchmarkRun 9from machine_manager import MachineManager 10from results_cache import ResultsCache 11from results_report import HTMLResultsReport 12from utils import logger 13from utils.file_utils import FileUtils 14 15 16class Experiment(object): 17 """Class representing an Experiment to be run.""" 18 19 def __init__(self, name, remote, rerun_if_failed, working_directory, 20 chromeos_root, cache_conditions, labels, benchmarks, 21 experiment_file): 22 self.name = name 23 self.rerun_if_failed = rerun_if_failed 24 self.working_directory = working_directory 25 self.remote = remote 26 self.chromeos_root = chromeos_root 27 self.cache_conditions = cache_conditions 28 self.experiment_file = experiment_file 29 self.results_directory = os.path.join(self.working_directory, 30 self.name + "_results") 31 32 self.labels = labels 33 self.benchmarks = benchmarks 34 self.num_complete = 0 35 36 # We need one chromeos_root to run the benchmarks in, but it doesn't 37 # matter where it is, unless the ABIs are different. 38 if not chromeos_root: 39 for label in self.labels: 40 if label.chromeos_root: 41 chromeos_root = label.chromeos_root 42 if not chromeos_root: 43 raise Exception("No chromeos_root given and could not determine one from " 44 "the image path.") 45 46 self.machine_manager = MachineManager(chromeos_root) 47 self.l = logger.GetLogger() 48 49 for machine in remote: 50 self.machine_manager.AddMachine(machine) 51 52 self.start_time = None 53 self.benchmark_runs = self._GenerateBenchmarkRuns() 54 55 def _GenerateBenchmarkRuns(self): 56 """Generate benchmark runs from labels and benchmark defintions.""" 57 benchmark_runs = [] 58 for label in self.labels: 59 for benchmark in self.benchmarks: 60 for iteration in range(1, benchmark.iterations + 1): 61 62 benchmark_run_name = "%s: %s (%s)" % (label.name, benchmark.name, 63 iteration) 64 full_name = "%s_%s_%s" % (label.name, benchmark.name, iteration) 65 logger_to_use = logger.Logger(os.path.dirname(__file__), 66 "run.%s" % (full_name), 67 True) 68 benchmark_run = BenchmarkRun(benchmark_run_name, 69 benchmark.name, 70 benchmark.autotest_name, 71 benchmark.autotest_args, 72 label.name, 73 label.chromeos_root, 74 label.chromeos_image, 75 label.board, 76 iteration, 77 self.cache_conditions, 78 benchmark.outlier_range, 79 benchmark.profile_counters, 80 benchmark.profile_type, 81 self.machine_manager, 82 logger_to_use) 83 84 benchmark_runs.append(benchmark_run) 85 return benchmark_runs 86 87 def Build(self): 88 pass 89 90 def Terminate(self): 91 for t in self.benchmark_runs: 92 if t.isAlive(): 93 self.l.LogError("Terminating run: '%s'." % t.name) 94 t.Terminate() 95 96 def IsComplete(self): 97 if self.active_threads: 98 for t in self.active_threads: 99 if t.isAlive(): 100 t.join(0) 101 if not t.isAlive(): 102 self.num_complete += 1 103 self.active_threads.remove(t) 104 return False 105 return True 106 107 def Run(self): 108 self.start_time = time.time() 109 self.active_threads = [] 110 for benchmark_run in self.benchmark_runs: 111 # Set threads to daemon so program exits when ctrl-c is pressed. 112 benchmark_run.daemon = True 113 benchmark_run.start() 114 self.active_threads.append(benchmark_run) 115 116 def SetCacheConditions(self, cache_conditions): 117 for benchmark_run in self.benchmark_runs: 118 benchmark_run.SetCacheConditions(cache_conditions) 119 120 def Cleanup(self): 121 self.machine_manager.Cleanup() 122