diff options
| author | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-09-30 18:25:38 -0400 |
|---|---|---|
| committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-09-30 18:25:38 -0400 |
| commit | c8cb14963511d5d1a3eb46624bcc0d2bcdf3b9bc (patch) | |
| tree | 4b44c2814c085b384563bc27b50fdbe8caebe590 /experiment | |
| parent | c6adbabd0bf897a1e750fe07bf068e285dd82108 (diff) | |
Added more robust error handling inspired by color tests.
Diffstat (limited to 'experiment')
| -rw-r--r-- | experiment/executable/executable.py | 2 | ||||
| -rw-r--r-- | experiment/experiment.py | 53 | ||||
| -rw-r--r-- | experiment/tracer.py | 3 |
3 files changed, 42 insertions, 16 deletions
diff --git a/experiment/executable/executable.py b/experiment/executable/executable.py index 897c2d9..09b7370 100644 --- a/experiment/executable/executable.py +++ b/experiment/executable/executable.py | |||
| @@ -71,4 +71,4 @@ class Executable(object): | |||
| 71 | 71 | ||
| 72 | self.sp.wait() | 72 | self.sp.wait() |
| 73 | if self.sp.returncode != 0: | 73 | if self.sp.returncode != 0: |
| 74 | print >>sys.stderr, "Non-zero return: %s %s" % (self.exec_file, self.extra_args) | 74 | print >>sys.stderr, "Non-zero return: %s %s" % (self.exec_file, " ".join(self.extra_args)) |
diff --git a/experiment/experiment.py b/experiment/experiment.py index a95ca42..a44f798 100644 --- a/experiment/experiment.py +++ b/experiment/experiment.py | |||
| @@ -91,16 +91,16 @@ class Experiment(object): | |||
| 91 | 91 | ||
| 92 | def __run_tasks(self): | 92 | def __run_tasks(self): |
| 93 | exec_pause = 0.3 | 93 | exec_pause = 0.3 |
| 94 | self.log("Starting the program in ({0} seconds)".format( | 94 | self.log("Starting the programs over ({0} seconds)".format( |
| 95 | len(self.executables) * exec_pause)) | 95 | len(self.executables) * exec_pause)) |
| 96 | for e in self.executables: | 96 | for e in self.executables: |
| 97 | try: | 97 | try: |
| 98 | e.execute() | 98 | e.execute() |
| 99 | except: | 99 | except: |
| 100 | raise Exception("Executable failed: %s" % e) | 100 | raise Exception("Executable failed: %s" % e) |
| 101 | time.sleep(exec_pause) | 101 | time.sleep(exec_pause) |
| 102 | 102 | ||
| 103 | sleep_time = 2 | 103 | sleep_time = len(self.executables) / litmus_util.num_cpus() |
| 104 | self.log("Sleeping for %d seconds before release" % sleep_time) | 104 | self.log("Sleeping for %d seconds before release" % sleep_time) |
| 105 | time.sleep(sleep_time) | 105 | time.sleep(sleep_time) |
| 106 | 106 | ||
| @@ -117,13 +117,18 @@ class Experiment(object): | |||
| 117 | if released != len(self.executables): | 117 | if released != len(self.executables): |
| 118 | # Some tasks failed to release, kill all tasks and fail | 118 | # Some tasks failed to release, kill all tasks and fail |
| 119 | # Need to re-release non-released tasks before we can kill them though | 119 | # Need to re-release non-released tasks before we can kill them though |
| 120 | self.log("Failed to release %d tasks! Re-releasing and killing".format( | 120 | self.log("Failed to release {} tasks! Re-releasing and killing".format( |
| 121 | len(self.experiments) - released)) | 121 | len(self.executables) - released, len(self.executables))) |
| 122 | 122 | ||
| 123 | time.sleep(10) | 123 | time.sleep(5) |
| 124 | litmus_util.release_tasks() | ||
| 125 | 124 | ||
| 126 | time.sleep(20) | 125 | released = litmus_util.release_tasks() |
| 126 | |||
| 127 | self.log("Re-released %d tasks" % released) | ||
| 128 | |||
| 129 | time.sleep(5) | ||
| 130 | |||
| 131 | self.log("Killing all tasks") | ||
| 127 | map(methodcaller('kill'), self.executables) | 132 | map(methodcaller('kill'), self.executables) |
| 128 | 133 | ||
| 129 | ret = False | 134 | ret = False |
| @@ -147,23 +152,46 @@ class Experiment(object): | |||
| 147 | 152 | ||
| 148 | def run_exp(self): | 153 | def run_exp(self): |
| 149 | self.setup() | 154 | self.setup() |
| 155 | |||
| 156 | succ = False | ||
| 157 | |||
| 150 | try: | 158 | try: |
| 151 | self.__run_tasks() | 159 | self.__run_tasks() |
| 160 | self.log("Saving results in %s" % self.finished_dir) | ||
| 161 | succ = True | ||
| 152 | finally: | 162 | finally: |
| 153 | self.teardown() | 163 | self.teardown() |
| 154 | 164 | ||
| 155 | def setup(self): | 165 | if succ: |
| 156 | self.log("Switching to %s" % self.scheduler) | 166 | self.__save_results() |
| 157 | litmus_util.switch_scheduler(self.scheduler) | 167 | self.log("Experiment done!") |
| 158 | 168 | ||
| 169 | |||
| 170 | def setup(self): | ||
| 159 | self.log("Writing %d proc entries" % len(self.proc_entries)) | 171 | self.log("Writing %d proc entries" % len(self.proc_entries)) |
| 160 | map(methodcaller('write_proc'), self.proc_entries) | 172 | map(methodcaller('write_proc'), self.proc_entries) |
| 161 | 173 | ||
| 174 | time.sleep(5) | ||
| 175 | |||
| 176 | self.log("Switching to %s" % self.scheduler) | ||
| 177 | litmus_util.switch_scheduler(self.scheduler) | ||
| 178 | |||
| 162 | self.log("Starting %d tracers" % len(self.tracers)) | 179 | self.log("Starting %d tracers" % len(self.tracers)) |
| 163 | map(methodcaller('start_tracing'), self.tracers) | 180 | map(methodcaller('start_tracing'), self.tracers) |
| 181 | |||
| 182 | self.exec_out = open('%s/exec-out.txt' % self.working_dir, 'w') | ||
| 183 | self.exec_err = open('%s/exec-err.txt' % self.working_dir, 'w') | ||
| 184 | def set_out(executable): | ||
| 185 | executable.stdout_file = self.exec_out | ||
| 186 | executable.stderr_file = self.exec_err | ||
| 187 | map(set_out, self.executables) | ||
| 188 | |||
| 164 | time.sleep(4) | 189 | time.sleep(4) |
| 165 | 190 | ||
| 166 | def teardown(self): | 191 | def teardown(self): |
| 192 | self.exec_out.close() | ||
| 193 | self.exec_err.close() | ||
| 194 | |||
| 167 | sleep_time = 5 | 195 | sleep_time = 5 |
| 168 | self.log("Sleeping %d seconds to allow buffer flushing" % sleep_time) | 196 | self.log("Sleeping %d seconds to allow buffer flushing" % sleep_time) |
| 169 | time.sleep(sleep_time) | 197 | time.sleep(sleep_time) |
| @@ -174,6 +202,3 @@ class Experiment(object): | |||
| 174 | self.log("Switching to Linux scheduler") | 202 | self.log("Switching to Linux scheduler") |
| 175 | litmus_util.switch_scheduler("Linux") | 203 | litmus_util.switch_scheduler("Linux") |
| 176 | 204 | ||
| 177 | self.log("Saving results in %s" % self.finished_dir) | ||
| 178 | self.__save_results() | ||
| 179 | self.log("Experiment done!") | ||
diff --git a/experiment/tracer.py b/experiment/tracer.py index ad4ebfe..4949927 100644 --- a/experiment/tracer.py +++ b/experiment/tracer.py | |||
| @@ -27,13 +27,14 @@ class LinuxTracer(Tracer): | |||
| 27 | def __init__(self, output_dir): | 27 | def __init__(self, output_dir): |
| 28 | super(LinuxTracer, self).__init__("trace-cmd", output_dir) | 28 | super(LinuxTracer, self).__init__("trace-cmd", output_dir) |
| 29 | 29 | ||
| 30 | extra_args = ["record", "-e", "sched:sched_switch", | 30 | extra_args = ["record", # "-e", "sched:sched_switch", |
| 31 | "-e", "litmus:*", | 31 | "-e", "litmus:*", |
| 32 | "-o", "%s/%s" % (output_dir, conf.FILES['linux_data'])] | 32 | "-o", "%s/%s" % (output_dir, conf.FILES['linux_data'])] |
| 33 | stdout = open('%s/trace-cmd-stdout.txt' % self.output_dir, 'w') | 33 | stdout = open('%s/trace-cmd-stdout.txt' % self.output_dir, 'w') |
| 34 | stderr = open('%s/trace-cmd-stderr.txt' % self.output_dir, 'w') | 34 | stderr = open('%s/trace-cmd-stderr.txt' % self.output_dir, 'w') |
| 35 | 35 | ||
| 36 | execute = Executable(conf.BINS['trace-cmd'], extra_args, stdout, stderr) | 36 | execute = Executable(conf.BINS['trace-cmd'], extra_args, stdout, stderr) |
| 37 | execute.cwd = output_dir | ||
| 37 | self.bins.append(execute) | 38 | self.bins.append(execute) |
| 38 | 39 | ||
| 39 | @staticmethod | 40 | @staticmethod |
