blob: 2a4590c4254b4c4164145228b95f1861e469c8f2 [file] [log] [blame]
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08001#!/usr/bin/python
2
3# Copyright 2011 Google Inc. All Rights Reserved.
4
Ahmad Sharif4467f002012-12-20 12:09:49 -08005"""The experiment setting module."""
6
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08007import os
8import time
Ahmad Sharif4467f002012-12-20 12:09:49 -08009
10from utils import logger
11
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080012from benchmark_run import BenchmarkRun
13from machine_manager import MachineManager
Ahmad Sharif4467f002012-12-20 12:09:49 -080014from machine_manager import MockMachineManager
Ahmad Sharif4467f002012-12-20 12:09:49 -080015import test_flag
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080016
17
18class Experiment(object):
19 """Class representing an Experiment to be run."""
20
Luis Lozanof81680c2013-03-15 14:44:13 -070021 def __init__(self, name, remote, working_directory,
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080022 chromeos_root, cache_conditions, labels, benchmarks,
Luis Lozanof81680c2013-03-15 14:44:13 -070023 experiment_file, email_to, acquire_timeout, log_dir,
24 share_users):
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080025 self.name = name
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080026 self.working_directory = working_directory
27 self.remote = remote
28 self.chromeos_root = chromeos_root
29 self.cache_conditions = cache_conditions
30 self.experiment_file = experiment_file
Ahmad Shariff395c262012-10-09 17:48:09 -070031 self.email_to = email_to
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080032 self.results_directory = os.path.join(self.working_directory,
33 self.name + "_results")
Luis Lozanof81680c2013-03-15 14:44:13 -070034 self.log_dir = log_dir
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080035 self.labels = labels
36 self.benchmarks = benchmarks
37 self.num_complete = 0
Ahmad Sharif4467f002012-12-20 12:09:49 -080038 self.num_run_complete = 0
Luis Lozanof81680c2013-03-15 14:44:13 -070039 self.share_users = share_users
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080040
41 # We need one chromeos_root to run the benchmarks in, but it doesn't
42 # matter where it is, unless the ABIs are different.
43 if not chromeos_root:
44 for label in self.labels:
45 if label.chromeos_root:
46 chromeos_root = label.chromeos_root
47 if not chromeos_root:
48 raise Exception("No chromeos_root given and could not determine one from "
49 "the image path.")
50
Ahmad Sharif4467f002012-12-20 12:09:49 -080051 if test_flag.GetTestMode():
Luis Lozanof81680c2013-03-15 14:44:13 -070052 self.machine_manager = MockMachineManager(chromeos_root, acquire_timeout)
Ahmad Sharif4467f002012-12-20 12:09:49 -080053 else:
Luis Lozanof81680c2013-03-15 14:44:13 -070054 self.machine_manager = MachineManager(chromeos_root, acquire_timeout)
55 self.l = logger.GetLogger(log_dir)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080056
57 for machine in remote:
58 self.machine_manager.AddMachine(machine)
Ahmad Sharif4467f002012-12-20 12:09:49 -080059 for label in labels:
60 self.machine_manager.ComputeCommonCheckSum(label)
61 self.machine_manager.ComputeCommonCheckSumString(label)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080062
63 self.start_time = None
64 self.benchmark_runs = self._GenerateBenchmarkRuns()
65
66 def _GenerateBenchmarkRuns(self):
67 """Generate benchmark runs from labels and benchmark defintions."""
68 benchmark_runs = []
69 for label in self.labels:
70 for benchmark in self.benchmarks:
71 for iteration in range(1, benchmark.iterations + 1):
72
73 benchmark_run_name = "%s: %s (%s)" % (label.name, benchmark.name,
74 iteration)
75 full_name = "%s_%s_%s" % (label.name, benchmark.name, iteration)
Luis Lozanof81680c2013-03-15 14:44:13 -070076 logger_to_use = logger.Logger(self.log_dir,
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080077 "run.%s" % (full_name),
78 True)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080079 benchmark_run = BenchmarkRun(benchmark_run_name,
Ahmad Sharif4467f002012-12-20 12:09:49 -080080 benchmark,
81 label,
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080082 iteration,
83 self.cache_conditions,
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080084 self.machine_manager,
Luis Lozanof81680c2013-03-15 14:44:13 -070085 logger_to_use,
86 self.share_users)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080087
88 benchmark_runs.append(benchmark_run)
89 return benchmark_runs
90
91 def Build(self):
92 pass
93
94 def Terminate(self):
95 for t in self.benchmark_runs:
96 if t.isAlive():
97 self.l.LogError("Terminating run: '%s'." % t.name)
98 t.Terminate()
99
100 def IsComplete(self):
101 if self.active_threads:
102 for t in self.active_threads:
103 if t.isAlive():
104 t.join(0)
105 if not t.isAlive():
106 self.num_complete += 1
Ahmad Sharif4467f002012-12-20 12:09:49 -0800107 if not t.cache_hit:
108 self.num_run_complete += 1
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -0800109 self.active_threads.remove(t)
110 return False
111 return True
112
113 def Run(self):
114 self.start_time = time.time()
115 self.active_threads = []
116 for benchmark_run in self.benchmark_runs:
117 # Set threads to daemon so program exits when ctrl-c is pressed.
118 benchmark_run.daemon = True
119 benchmark_run.start()
120 self.active_threads.append(benchmark_run)
121
122 def SetCacheConditions(self, cache_conditions):
123 for benchmark_run in self.benchmark_runs:
124 benchmark_run.SetCacheConditions(cache_conditions)
125
126 def Cleanup(self):
127 self.machine_manager.Cleanup()