summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMac Mollison <mollison@cs.unc.edu>2009-02-28 16:36:54 -0500
committerMac Mollison <mollison@cs.unc.edu>2009-02-28 16:36:54 -0500
commit2d8a5216ab1dda1742652c5de842af63b6706058 (patch)
tree3b06ef05dff5c991be15f54b7697843f3d1821bc
parent9d428150af67561ded5192995a7e9a6fb9b827ab (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-xrun.py15
-rwxr-xr-xsta.py152
2 files changed, 97 insertions, 70 deletions
diff --git a/run.py b/run.py
index 5533c9f..624acdf 100755
--- a/run.py
+++ b/run.py
@@ -24,17 +24,10 @@ def myEDF():
24 test.run_test() 24 test.run_test()
25 25
26def myTrace(): 26def 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
39def switchToTrace(): 32def switchToTrace():
40 events_trace = sta.Trace(g6_list) 33 events_trace = sta.Trace(g6_list)
diff --git a/sta.py b/sta.py
index bcaadeb..8c457ae 100755
--- a/sta.py
+++ b/sta.py
@@ -7,6 +7,7 @@
7 7
8import sys 8import sys
9import struct 9import struct
10import 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 #