aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Sommerseth <davids@redhat.com>2013-01-15 21:12:55 +0100
committerDavid Sommerseth <davids@redhat.com>2013-01-15 21:12:55 +0100
commit6c0f7ab28d73fa7703b8374355a1563b5c97eba2 (patch)
treed7d18cbe5e5e55e520455f038b07fc894485f537
parentbe08f7cb83dce2256e2e62fe54e25a32794052a0 (diff)
downloadrteval-6c0f7ab28d73fa7703b8374355a1563b5c97eba2.tar.gz
Reworked the run logic for modules - allow them to flag they won't run
If a module sets the self._donotrun flag to True, the module logic will take care of not running this module at all. This also sorts out some issues when hackbench is not run, where some of the log file descriptors are not found when cleaning up in the end. Signed-off-by: David Sommerseth <davids@redhat.com>
-rw-r--r--rteval/modules/__init__.py71
-rw-r--r--rteval/modules/loads/__init__.py2
-rw-r--r--rteval/modules/loads/hackbench.py10
3 files changed, 50 insertions, 33 deletions
diff --git a/rteval/modules/__init__.py b/rteval/modules/__init__.py
index 0191767..ff35421 100644
--- a/rteval/modules/__init__.py
+++ b/rteval/modules/__init__.py
@@ -53,6 +53,7 @@ class rtevalModulePrototype(threading.Thread):
self.__events = {"start": threading.Event(),
"stop": threading.Event(),
"finished": threading.Event()}
+ self._donotrun = False
def _log(self, logtype, msg):
@@ -63,6 +64,8 @@ class rtevalModulePrototype(threading.Thread):
def isReady(self):
"Returns a boolean if the module is ready to run"
+ if self._donotrun:
+ return True
return self.__ready
@@ -118,6 +121,7 @@ class rtevalModulePrototype(threading.Thread):
"Required module method, which purpose is to do the initial workload setup, preparing for _WorkloadBuild()"
raise NotImplementedError("_WorkloadSetup() method must be implemented in the %s module" % self._name)
+
def _WorkloadBuild(self):
"Required module method, which purpose is to compile additional code needed for the worklaod"
raise NotImplementedError("_WorkloadBuild() method must be implemented in the %s module" % self._name)
@@ -143,6 +147,11 @@ class rtevalModulePrototype(threading.Thread):
raise NotImplementedError("_WorkloadCleanup() method must be implemented in the %s module" % self._name)
+ def WorkloadWillRun(self):
+ "Returns True if this workload will be run"
+ return self._donotrun is False
+
+
def run(self):
"Workload thread runner - takes care of keeping the workload running as long as needed"
if self.shouldStop():
@@ -151,32 +160,36 @@ class rtevalModulePrototype(threading.Thread):
# Initial workload setups
self._WorkloadSetup()
- # Compile the workload
- self._WorkloadBuild()
-
- # Do final preparations of workload before we're ready to start running
- self._WorkloadPrepare()
-
- # Wait until we're released
- while True:
- if self.shouldStop():
- return
- self.__events["start"].wait(1.0)
- if self.shouldStart():
- break
-
- self._log(Log.DEBUG, "Starting %s workload" % self._module_type)
- while not self.shouldStop():
- # Run the workload
- self._WorkloadTask()
-
- if self.shouldStop():
- break
- if not self.WorkloadAlive():
- self._log(Log.DEBUG, "%s workload stopped running." % self._module_type)
- break
- time.sleep(1.0)
- self._log(Log.DEBUG, "stopping %s workload" % self._module_type)
+ if not self._donotrun:
+ # Compile the workload
+ self._WorkloadBuild()
+
+ # Do final preparations of workload before we're ready to start running
+ self._WorkloadPrepare()
+
+ # Wait until we're released
+ while True:
+ if self.shouldStop():
+ return
+ self.__events["start"].wait(1.0)
+ if self.shouldStart():
+ break
+
+ self._log(Log.DEBUG, "Starting %s workload" % self._module_type)
+ while not self.shouldStop():
+ # Run the workload
+ self._WorkloadTask()
+
+ if self.shouldStop():
+ break
+ if not self.WorkloadAlive():
+ self._log(Log.DEBUG, "%s workload stopped running." % self._module_type)
+ break
+ time.sleep(1.0)
+ self._log(Log.DEBUG, "stopping %s workload" % self._module_type)
+ else:
+ self._log(Log.DEBUG, "Workload was not started")
+
self._WorkloadCleanup()
@@ -404,7 +417,8 @@ start their workloads yet"""
self._logger.log(Log.INFO, "Starting %s modules" % self._module_type)
for (modname, mod) in self.__modules:
mod.start()
- self._logger.log(Log.DEBUG, "\t - %s started" % modname)
+ if mod.WorkloadWillRun():
+ self._logger.log(Log.DEBUG, "\t - %s started" % modname)
self._logger.log(Log.DEBUG, "Waiting for all %s modules to get ready" % self._module_type)
busy = True
@@ -460,6 +474,9 @@ start their workloads yet"""
self._logger.log(Log.INFO, "Stopping %s modules" % self._module_type)
for (modname, mod) in self.__modules:
+ if not mod.WorkloadWillRun():
+ continue
+
mod.setStop()
try:
self._logger.log(Log.DEBUG, "\t - Stopping %s" % modname)
diff --git a/rteval/modules/loads/__init__.py b/rteval/modules/loads/__init__.py
index ca84f47..69de0a8 100644
--- a/rteval/modules/loads/__init__.py
+++ b/rteval/modules/loads/__init__.py
@@ -70,7 +70,7 @@ class CommandLineLoad(LoadThread):
def MakeReport(self):
- if not (self.jobs and self.args):
+ if not (self.jobs and self.args) or self._donotrun:
return None
rep_n = libxml2.newNode("command_line")
diff --git a/rteval/modules/loads/hackbench.py b/rteval/modules/loads/hackbench.py
index 6cb0524..53c4739 100644
--- a/rteval/modules/loads/hackbench.py
+++ b/rteval/modules/loads/hackbench.py
@@ -51,6 +51,8 @@ class Hackbench(CommandLineLoad):
else:
self._log(Log.INFO, "hackbench: low memory system (%f GB/core)! Not running\n" % ratio)
mult = 0
+ self._donotrun = True
+
self.jobs = self.num_cpus * mult
self.args = ['hackbench', '-P',
@@ -67,11 +69,6 @@ class Hackbench(CommandLineLoad):
def _WorkloadPrepare(self):
- # if we don't have any jobs just wait for the stop event and return
- if self.jobs == 0:
- self.WaitForCompletion()
- return
-
self.__nullfp = os.open("/dev/null", os.O_RDWR)
if self._logging:
self.__out = self.open_logfile("hackbench.stdout")
@@ -111,6 +108,9 @@ class Hackbench(CommandLineLoad):
def _WorkloadCleanup(self):
+ if self._donotrun:
+ return
+
if self.__hbproc.poll() == None:
os.kill(self.__hbproc.pid, SIGKILL)
self.__hbproc.wait()