blob: aa56455933fe2f01ece0e5d49b170dfd8ededead [file] [log] [blame]
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08001#!/usr/bin/python
2
Yunlian Jiang00cc30e2013-03-28 13:23:57 -07003# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08006
Ahmad Sharif4467f002012-12-20 12:09:49 -08007"""The experiment setting module."""
8
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08009import os
10import time
Ahmad Sharif4467f002012-12-20 12:09:49 -080011
12from utils import logger
Yunlian Jiang00cc30e2013-03-28 13:23:57 -070013from utils import misc
Ahmad Sharif4467f002012-12-20 12:09:49 -080014
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080015from benchmark_run import BenchmarkRun
16from machine_manager import MachineManager
Ahmad Sharif4467f002012-12-20 12:09:49 -080017from machine_manager import MockMachineManager
Ahmad Sharif4467f002012-12-20 12:09:49 -080018import test_flag
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080019
20
21class Experiment(object):
22 """Class representing an Experiment to be run."""
23
Luis Lozanof81680c2013-03-15 14:44:13 -070024 def __init__(self, name, remote, working_directory,
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080025 chromeos_root, cache_conditions, labels, benchmarks,
Luis Lozanof81680c2013-03-15 14:44:13 -070026 experiment_file, email_to, acquire_timeout, log_dir,
cmtice13909242014-03-11 13:38:07 -070027 log_level, share_users, results_directory):
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080028 self.name = name
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080029 self.working_directory = working_directory
30 self.remote = remote
31 self.chromeos_root = chromeos_root
32 self.cache_conditions = cache_conditions
33 self.experiment_file = experiment_file
Ahmad Shariff395c262012-10-09 17:48:09 -070034 self.email_to = email_to
Yunlian Jiang00cc30e2013-03-28 13:23:57 -070035 if not results_directory:
36 self.results_directory = os.path.join(self.working_directory,
37 self.name + "_results")
38 else:
39 self.results_directory = misc.CanonicalizePath(results_directory)
Luis Lozanof81680c2013-03-15 14:44:13 -070040 self.log_dir = log_dir
cmtice13909242014-03-11 13:38:07 -070041 self.log_level = log_level
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080042 self.labels = labels
43 self.benchmarks = benchmarks
44 self.num_complete = 0
Ahmad Sharif4467f002012-12-20 12:09:49 -080045 self.num_run_complete = 0
Luis Lozanof81680c2013-03-15 14:44:13 -070046 self.share_users = share_users
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080047
48 # We need one chromeos_root to run the benchmarks in, but it doesn't
49 # matter where it is, unless the ABIs are different.
50 if not chromeos_root:
51 for label in self.labels:
52 if label.chromeos_root:
53 chromeos_root = label.chromeos_root
54 if not chromeos_root:
55 raise Exception("No chromeos_root given and could not determine one from "
56 "the image path.")
57
Ahmad Sharif4467f002012-12-20 12:09:49 -080058 if test_flag.GetTestMode():
cmtice13909242014-03-11 13:38:07 -070059 self.machine_manager = MockMachineManager(chromeos_root, acquire_timeout,
60 log_level)
Ahmad Sharif4467f002012-12-20 12:09:49 -080061 else:
cmtice13909242014-03-11 13:38:07 -070062 self.machine_manager = MachineManager(chromeos_root, acquire_timeout,
63 log_level)
Luis Lozanof81680c2013-03-15 14:44:13 -070064 self.l = logger.GetLogger(log_dir)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080065
66 for machine in remote:
67 self.machine_manager.AddMachine(machine)
Ahmad Sharif4467f002012-12-20 12:09:49 -080068 for label in labels:
69 self.machine_manager.ComputeCommonCheckSum(label)
70 self.machine_manager.ComputeCommonCheckSumString(label)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080071
72 self.start_time = None
73 self.benchmark_runs = self._GenerateBenchmarkRuns()
74
75 def _GenerateBenchmarkRuns(self):
76 """Generate benchmark runs from labels and benchmark defintions."""
77 benchmark_runs = []
78 for label in self.labels:
79 for benchmark in self.benchmarks:
80 for iteration in range(1, benchmark.iterations + 1):
81
82 benchmark_run_name = "%s: %s (%s)" % (label.name, benchmark.name,
83 iteration)
84 full_name = "%s_%s_%s" % (label.name, benchmark.name, iteration)
Luis Lozanof81680c2013-03-15 14:44:13 -070085 logger_to_use = logger.Logger(self.log_dir,
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080086 "run.%s" % (full_name),
cmtice13909242014-03-11 13:38:07 -070087 True,
88 self.log_level)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080089 benchmark_run = BenchmarkRun(benchmark_run_name,
Ahmad Sharif4467f002012-12-20 12:09:49 -080090 benchmark,
91 label,
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080092 iteration,
93 self.cache_conditions,
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080094 self.machine_manager,
Luis Lozanof81680c2013-03-15 14:44:13 -070095 logger_to_use,
cmtice13909242014-03-11 13:38:07 -070096 self.log_level,
Luis Lozanof81680c2013-03-15 14:44:13 -070097 self.share_users)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080098
99 benchmark_runs.append(benchmark_run)
100 return benchmark_runs
101
102 def Build(self):
103 pass
104
105 def Terminate(self):
106 for t in self.benchmark_runs:
107 if t.isAlive():
108 self.l.LogError("Terminating run: '%s'." % t.name)
109 t.Terminate()
110
111 def IsComplete(self):
112 if self.active_threads:
113 for t in self.active_threads:
114 if t.isAlive():
115 t.join(0)
116 if not t.isAlive():
117 self.num_complete += 1
Ahmad Sharif4467f002012-12-20 12:09:49 -0800118 if not t.cache_hit:
119 self.num_run_complete += 1
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -0800120 self.active_threads.remove(t)
121 return False
122 return True
123
124 def Run(self):
125 self.start_time = time.time()
126 self.active_threads = []
127 for benchmark_run in self.benchmark_runs:
128 # Set threads to daemon so program exits when ctrl-c is pressed.
129 benchmark_run.daemon = True
130 benchmark_run.start()
131 self.active_threads.append(benchmark_run)
132
133 def SetCacheConditions(self, cache_conditions):
134 for benchmark_run in self.benchmark_runs:
135 benchmark_run.SetCacheConditions(cache_conditions)
136
137 def Cleanup(self):
138 self.machine_manager.Cleanup()