aboutsummaryrefslogtreecommitdiff
path: root/crosperf
diff options
context:
space:
mode:
Diffstat (limited to 'crosperf')
-rw-r--r--crosperf/experiment.py9
-rw-r--r--crosperf/experiment_runner.py32
-rw-r--r--crosperf/machine_manager.py9
3 files changed, 45 insertions, 5 deletions
diff --git a/crosperf/experiment.py b/crosperf/experiment.py
index 33b3f878..9f88ed01 100644
--- a/crosperf/experiment.py
+++ b/crosperf/experiment.py
@@ -50,6 +50,7 @@ class Experiment(object):
# locking mechanism; if it is blank then we will use the AFE server
# locking mechanism.
self.locks_dir = locks_directory
+ self.locked_machines = []
# We need one chromeos_root to run the benchmarks in, but it doesn't
# matter where it is, unless the ABIs are different.
@@ -146,9 +147,11 @@ class Experiment(object):
# to unlock everything.
self.machine_manager.Cleanup()
else:
- all_machines = self.remote
- for l in self.labels:
- all_machines += l.remote
+ all_machines = self.locked_machines
+ if not all_machines:
+ return
+
+ # If we locked any machines earlier, make sure we unlock them now.
lock_mgr = afe_lock_machine.AFELockManager(all_machines, "",
self.labels[0].chromeos_root,
None)
diff --git a/crosperf/experiment_runner.py b/crosperf/experiment_runner.py
index dae3c2e3..541bebe0 100644
--- a/crosperf/experiment_runner.py
+++ b/crosperf/experiment_runner.py
@@ -31,6 +31,7 @@ class ExperimentRunner(object):
self.l = log or logger.GetLogger(experiment.log_dir)
self._ce = cmd_exec or command_executer.GetCommandExecuter(self.l)
self._terminated = False
+ self.locked_machines = []
if experiment.log_level != "verbose":
self.STATUS_TIME_DELAY = 10
@@ -46,6 +47,25 @@ class ExperimentRunner(object):
machines += l.remote
return machines
+ def _UpdateMachineList(self, locked_machines):
+ """Update machines lists to contain only locked machines.
+
+ Go through all the lists of requested machines, both global and
+ label-specific requests, and remove any machine that we were not
+ able to lock.
+
+ Args:
+ locked_machines: A list of the machines we successfully locked.
+ """
+ for m in self._experiment.remote:
+ if m not in locked_machines:
+ self._experiment.remote.remove(m)
+
+ for l in self._experiment.labels:
+ for m in l.remote:
+ if m not in locked_machines:
+ l.remote.remove(m)
+
def _LockAllMachines(self, experiment):
"""Attempt to globally lock all of the machines requested for run.
@@ -65,7 +85,12 @@ class ExperimentRunner(object):
lock_mgr.AddLocalMachine(m)
machine_states = lock_mgr.GetMachineStates("lock")
lock_mgr.CheckMachineLocks(machine_states, "lock")
- lock_mgr.UpdateMachines(True)
+ self.locked_machines = lock_mgr.UpdateMachines(True)
+ self._experiment.locked_machines = self.locked_machines
+ self._UpdateMachineList(self.locked_machines)
+ self._experiment.machine_manager.RemoveNonLockedMachines(self.locked_machines)
+ if len(self.locked_machines) == 0:
+ raise RuntimeError("Unable to lock any machines.")
def _UnlockAllMachines(self, experiment):
"""Attempt to globally unlock all of the machines requested for run.
@@ -73,8 +98,11 @@ class ExperimentRunner(object):
The method will use the AFE server to globally unlock all of the machines
requested for this crosperf run.
"""
+ if not self.locked_machines:
+ return
+
lock_mgr = afe_lock_machine.AFELockManager(
- self._GetMachineList(),
+ self.locked_machines,
"",
experiment.labels[0].chromeos_root,
None,
diff --git a/crosperf/machine_manager.py b/crosperf/machine_manager.py
index e36ae7d5..79423481 100644
--- a/crosperf/machine_manager.py
+++ b/crosperf/machine_manager.py
@@ -206,6 +206,15 @@ class MachineManager(object):
self._initialized_machines = []
self.chromeos_root = chromeos_root
+ def RemoveNonLockedMachines(self, locked_machines):
+ for m in self._all_machines:
+ if m.name not in locked_machines:
+ self._all_machines.remove(m)
+
+ for m in self._machines:
+ if m.name not in locked_machines:
+ self._machines.remove(m)
+
def ImageMachine(self, machine, label):
if label.image_type == "local":
checksum = ImageChecksummer().Checksum(label, self.log_level)