experiment.py revision f395c26437cbdabc2960447fba89b226f4409e82
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, email_to): 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.email_to = email_to 30 self.results_directory = os.path.join(self.working_directory, 31 self.name + "_results") 32 33 self.labels = labels 34 self.benchmarks = benchmarks 35 self.num_complete = 0 36 37 # We need one chromeos_root to run the benchmarks in, but it doesn't 38 # matter where it is, unless the ABIs are different. 39 if not chromeos_root: 40 for label in self.labels: 41 if label.chromeos_root: 42 chromeos_root = label.chromeos_root 43 if not chromeos_root: 44 raise Exception("No chromeos_root given and could not determine one from " 45 "the image path.") 46 47 self.machine_manager = MachineManager(chromeos_root) 48 self.l = logger.GetLogger() 49 50 for machine in remote: 51 self.machine_manager.AddMachine(machine) 52 self.machine_manager.ComputeCommonCheckSum() 53 self.machine_manager.ComputeCommonCheckSumString() 54 55 self.start_time = None 56 self.benchmark_runs = self._GenerateBenchmarkRuns() 57 58 def _GenerateBenchmarkRuns(self): 59 """Generate benchmark runs from labels and benchmark defintions.""" 60 benchmark_runs = [] 61 for label in self.labels: 62 for benchmark in self.benchmarks: 63 for iteration in range(1, benchmark.iterations + 1): 64 65 benchmark_run_name = "%s: %s (%s)" % (label.name, benchmark.name, 66 iteration) 67 full_name = "%s_%s_%s" % (label.name, benchmark.name, iteration) 68 logger_to_use = logger.Logger(os.path.dirname(__file__), 69 "run.%s" % (full_name), 70 True) 71 benchmark_run = BenchmarkRun(benchmark_run_name, 72 benchmark.name, 73 benchmark.autotest_name, 74 benchmark.autotest_args, 75 label.name, 76 label.chromeos_root, 77 label.chromeos_image, 78 label.board, 79 iteration, 80 self.cache_conditions, 81 benchmark.outlier_range, 82 benchmark.perf_args, 83 self.machine_manager, 84 logger_to_use) 85 86 benchmark_runs.append(benchmark_run) 87 return benchmark_runs 88 89 def Build(self): 90 pass 91 92 def Terminate(self): 93 for t in self.benchmark_runs: 94 if t.isAlive(): 95 self.l.LogError("Terminating run: '%s'." % t.name) 96 t.Terminate() 97 98 def IsComplete(self): 99 if self.active_threads: 100 for t in self.active_threads: 101 if t.isAlive(): 102 t.join(0) 103 if not t.isAlive(): 104 self.num_complete += 1 105 self.active_threads.remove(t) 106 return False 107 return True 108 109 def Run(self): 110 self.start_time = time.time() 111 self.active_threads = [] 112 for benchmark_run in self.benchmark_runs: 113 # Set threads to daemon so program exits when ctrl-c is pressed. 114 benchmark_run.daemon = True 115 benchmark_run.start() 116 self.active_threads.append(benchmark_run) 117 118 def SetCacheConditions(self, cache_conditions): 119 for benchmark_run in self.benchmark_runs: 120 benchmark_run.SetCacheConditions(cache_conditions) 121 122 def Cleanup(self): 123 self.machine_manager.Cleanup() 124