diff options
| author | Mac Mollison <mollison@cs.unc.edu> | 2009-02-28 16:36:54 -0500 |
|---|---|---|
| committer | Mac Mollison <mollison@cs.unc.edu> | 2009-02-28 16:36:54 -0500 |
| commit | 2d8a5216ab1dda1742652c5de842af63b6706058 (patch) | |
| tree | 3b06ef05dff5c991be15f54b7697843f3d1821bc | |
| parent | 9d428150af67561ded5192995a7e9a6fb9b827ab (diff) | |
EDF tester runs to completion. Finds 1925 corrects in g6 and 594 errors.
Needs carefuly examination to root out problems and bugs.
| -rwxr-xr-x | run.py | 15 | ||||
| -rwxr-xr-x | sta.py | 152 |
2 files changed, 97 insertions, 70 deletions
| @@ -24,17 +24,10 @@ def myEDF(): | |||
| 24 | test.run_test() | 24 | test.run_test() |
| 25 | 25 | ||
| 26 | def myTrace(): | 26 | def myTrace(): |
| 27 | events_trace = sta.Trace(g6_list) | 27 | trace = sta.Trace(g6_list) |
| 28 | events_trace.filter('type!=1') | 28 | trace.sort('when',alt='release_time') |
| 29 | events_trace.filter('type!=2') | 29 | trace.print_count(True) |
| 30 | events_trace.filter('type!=3') | 30 | trace.print_records() |
| 31 | events_trace.filter('type!=4') | ||
| 32 | events_trace.filter('type!=8') | ||
| 33 | events_trace.filter('type!=9') | ||
| 34 | events_trace.filter('type!=10') | ||
| 35 | events_trace.sort('when') | ||
| 36 | events_trace.print_count(True) | ||
| 37 | events_trace.print_records() | ||
| 38 | 31 | ||
| 39 | def switchToTrace(): | 32 | def switchToTrace(): |
| 40 | events_trace = sta.Trace(g6_list) | 33 | events_trace = sta.Trace(g6_list) |
| @@ -7,6 +7,7 @@ | |||
| 7 | 7 | ||
| 8 | import sys | 8 | import sys |
| 9 | import struct | 9 | import struct |
| 10 | import copy | ||
| 10 | 11 | ||
| 11 | ################## | 12 | ################## |
| 12 | # Trace class # | 13 | # Trace class # |
| @@ -119,6 +120,9 @@ class Trace: | |||
| 119 | ': ' + str(counts[key])) | 120 | ': ' + str(counts[key])) |
| 120 | print("") | 121 | print("") |
| 121 | 122 | ||
| 123 | def getStr(record): | ||
| 124 | return "({0},{1})".format(record['pid'],record['job']) | ||
| 125 | |||
| 122 | 126 | ||
| 123 | ################## | 127 | ################## |
| 124 | # EDF class # | 128 | # EDF class # |
| @@ -131,71 +135,101 @@ class EDF: | |||
| 131 | """Create an EDF test""" | 135 | """Create an EDF test""" |
| 132 | self.trace_files = trace_files | 136 | self.trace_files = trace_files |
| 133 | self.errors = 0 | 137 | self.errors = 0 |
| 138 | self.corrects = 0 | ||
| 134 | 139 | ||
| 135 | def run_test(self): | 140 | def run_test(self): |
| 136 | 141 | ||
| 137 | #Build an in-order list of releases | 142 | #Make the trace, in order |
| 138 | releases = Trace(self.trace_files) | 143 | trace = Trace(self.trace_files) |
| 139 | releases.filter('type==3') | 144 | trace.sort('when',alt='release_time') |
| 140 | releases.sort('release_time') | 145 | |
| 141 | releases.slice(14,None) #get rid of double record of job 2 release | 146 | #Runnables list holds released jobs that are not executing |
| 142 | 147 | self.runnables = [] | |
| 143 | #Build an in-order list of switch_tos | 148 | |
| 144 | switch_tos = Trace(self.trace_files) | 149 | #Runnings list holds jobs that are executing |
| 145 | switch_tos.filter('type==5') | 150 | self.runnings = [] |
| 146 | switch_tos.sort('when') | 151 | |
| 147 | 152 | #Iterate over records | |
| 148 | #Iterate through releases, making sure the anticipated switch_to comes | 153 | for record in trace.iter: |
| 149 | # next. The equiv_window allows for simultaneous releases where the | 154 | |
| 150 | # switch_to does not match the order the releases come in. | 155 | #Releases |
| 151 | while len(releases.iter) > 0: | 156 | if record['type'] == 3: |
| 152 | next_release = releases.iter.pop(0) | 157 | if not self.check_duplicate_release(record): |
| 153 | switch_to_rank = self.find_switch_to_for_release(next_release, | 158 | self.runnables.append(record) |
| 154 | switch_tos.iter) | 159 | debug("Added {0} to runnables" |
| 155 | if switch_to_rank == 0: | 160 | .format(Trace.getStr(record))) |
| 156 | print("VALID : task " + str(next_release['pid']) + ", job " + | 161 | debug(record) |
| 157 | str(next_release['job'])) | 162 | |
| 158 | elif switch_to_rank > 0: | 163 | #Switch Tos |
| 159 | if (switch_to_rank < | 164 | elif record['type'] == 5: |
| 160 | self.equiv_window(next_release['release_time'], | 165 | release_record = EDF.pop_job(record, self.runnables) |
| 161 | releases.iter)): | 166 | self.runnings.append(release_record) |
| 162 | print("VALID : task " + str(next_release['pid']) + | 167 | debug("Added {0} to runnings" |
| 163 | ", job " + str(next_release['job'])) | 168 | .format(Trace.getStr(release_record))) |
| 169 | debug(release_record) | ||
| 170 | if self.check_deadline(release_record): | ||
| 171 | print("Valid") | ||
| 172 | self.corrects += 1 | ||
| 164 | else: | 173 | else: |
| 165 | print("ERROR: Swiched out of order, task " + | 174 | print("Invalid") |
| 166 | str(next_release['pid']) + ", job " + | ||
| 167 | str(next_release['job']) + " by " + | ||
| 168 | str(switch_to_rank)) | ||
| 169 | self.errors += 1 | 175 | self.errors += 1 |
| 170 | elif switch_to_rank < 0: | ||
| 171 | print("ERROR: Did not find switch_to for task " + | ||
| 172 | str(next_release['pid']) + ", job " + | ||
| 173 | str(next_release['job'])) | ||
| 174 | self.errors += 1 | ||
| 175 | continue | ||
| 176 | |||
| 177 | def find_switch_to_for_release(self, next_release, switch_tos_iter): | ||
| 178 | """Find the switch_to for that corresponds to the next release""" | ||
| 179 | i = 0 | ||
| 180 | while i < len(switch_tos_iter) - 1: | ||
| 181 | if self.job_match(next_release,switch_tos_iter[i]): | ||
| 182 | del switch_tos_iter[i] | ||
| 183 | return i | ||
| 184 | i += 1 | ||
| 185 | return -1 | ||
| 186 | 176 | ||
| 187 | def equiv_window(self, time,releases): | 177 | #Switch Aways |
| 188 | """Return the number of releases after this one in the release list | 178 | elif record['type'] == 6: |
| 189 | which have the same release time""" | 179 | release_record = EDF.pop_job(record, self.runnings) |
| 190 | i = 0 | 180 | if release_record: |
| 191 | while releases[i]['release_time'] == time: | 181 | debug("Removed {0} from runnings" |
| 192 | i += 1 | 182 | .format(Trace.getStr(release_record))) |
| 193 | return i | 183 | debug(release_record) |
| 184 | self.runnables.append(release_record) | ||
| 185 | debug("Added {0} to runnables" | ||
| 186 | .format(Trace.getStr(release_record))) | ||
| 187 | debug(release_record) | ||
| 188 | |||
| 189 | #Completions | ||
| 190 | elif record['type'] == 7: | ||
| 191 | release_record = EDF.pop_job(record,self.runnings) | ||
| 192 | if not release_record: | ||
| 193 | release_record = EDF.pop_job(record,self.runnables) | ||
| 194 | debug("Completed {0}, removed from runnings" | ||
| 195 | .format(Trace.getStr(release_record))) | ||
| 196 | debug(release_record) | ||
| 197 | |||
| 198 | print('Corrects: {0}'.format(self.corrects)) | ||
| 199 | print('Errors : {0}'.format(self.errors)) | ||
| 200 | |||
| 201 | def pop_job(record, record_list): | ||
| 202 | """Pop a job from a list of jobs""" | ||
| 203 | job = record['job'] | ||
| 204 | pid = record['pid'] | ||
| 205 | for record in record_list: | ||
| 206 | if record['job'] == job and record['pid'] == pid: | ||
| 207 | record_copy = copy.copy(record) | ||
| 208 | record_list.remove(record) | ||
| 209 | return record_copy | ||
| 210 | return None | ||
| 211 | |||
| 212 | def check_deadline(self, record): | ||
| 213 | """Check to see if a release record has an equal or earlier deadline | ||
| 214 | than all those that are runnable""" | ||
| 215 | minDeadline = None | ||
| 216 | for record in self.runnables: | ||
| 217 | if minDeadline == None or record['deadline'] < minDeadline: | ||
| 218 | minDeadline = record['deadline'] | ||
| 219 | if minDeadline == None or minDeadline >= record['deadline']: | ||
| 220 | return True | ||
| 221 | else: | ||
| 222 | return False | ||
| 223 | |||
| 224 | def check_duplicate_release(self, record): | ||
| 225 | """Make sure we don't get duplicate releases""" | ||
| 226 | job = record['job'] | ||
| 227 | pid = record['pid'] | ||
| 228 | for record in self.runnables: | ||
| 229 | if record['job'] == job and record['pid'] == pid: | ||
| 230 | return True | ||
| 231 | return False | ||
| 194 | 232 | ||
| 195 | def job_match(self, release, switch_to): | ||
| 196 | """Return True if a release matches a switch_to by job and pid""" | ||
| 197 | return (release['job'] == switch_to['job'] and | ||
| 198 | release['pid'] == switch_to['pid']) | ||
| 199 | 233 | ||
| 200 | #################################### | 234 | #################################### |
| 201 | # Debug # | 235 | # Debug # |
