Description:
added termination reporting to grader (using at_exit) git-svn-id: http://theory.cpe.ku.ac.th/grader/judge/trunk/scripts@377 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r70:347e4eeef742 - - 1 file changed: 8 inserted, 3 deleted

@@ -1,212 +1,217
1 1 #!/usr/bin/ruby
2 2
3 3 def stop_grader(id)
4 4 if id==:all
5 5 File.open(File.dirname(__FILE__) + "/stop.all",'w').close
6 6 else
7 7 File.open(File.dirname(__FILE__) + "/stop.#{id}",'w').close
8 8 end
9 9 end
10 10
11 11 def check_stopfile
12 12 FileTest.exist?(File.dirname(__FILE__) + "/stop.all") or
13 13 FileTest.exist?(File.dirname(__FILE__) + "/stop.#{Process.pid}")
14 14 end
15 15
16 16 def clear_stopfile
17 17 if FileTest.exist?(File.dirname(__FILE__) + "/stop.#{Process.pid}")
18 18 system("rm " + File.dirname(__FILE__) + "/stop.#{Process.pid}")
19 19 end
20 20 end
21 21
22 22 def config
23 23 Grader::Configuration.get_instance
24 24 end
25 25
26 26 def log_file_name
27 27 if !File.exists?(config.log_dir)
28 28 raise "Log directory does not exist: #{config.log_dir}"
29 29 end
30 30 config.log_dir +
31 31 "/#{GRADER_ENV}_#{config.grader_mode}.#{Process.pid}"
32 32 end
33 33
34 34 def log(str)
35 35 if config.talkative
36 36 puts str
37 37 end
38 38 if config.logging
39 39 fp = File.open(log_file_name,"a")
40 40 fp.puts("GRADER: #{Time.new.strftime("%H:%M")} #{str}")
41 41 fp.close
42 42 end
43 43 end
44 44
45 45 def display_manual
46 46 puts <<USAGE
47 47 Grader.
48 48 using: (1) grader
49 49 (2) grader environment [mode]
50 50 (3) grader stop [all|pids-list]
51 51 (4) grader --help
52 52 (1) call grader with environment = 'exam', mode = 'queue'
53 53 (2) possible modes are: 'queue', 'prob', 'test_request'
54 54 (3) create stop-file to stop running grader in queue mode
55 55 (4) You are here.
56 56 USAGE
57 57 end
58 58
59 59 #########################################
60 60 # main program
61 61 #########################################
62 62
63 63 # with --help
64 64 if (ARGV.length==1) and (/help/.match(ARGV[0]))
65 65 display_manual
66 66 exit(0)
67 67 end
68 68
69 69 # reading environment and options
70 70 if (ARGV.length >= 1) and (ARGV[0]=='stop')
71 71 if ARGV.length==1
72 72 puts "you should specify pid-list or 'all'"
73 73 display_manual
74 74 elsif (ARGV.length==2) and (ARGV[1]=='all')
75 75 stop_grader(:all)
76 76 puts "A global stop file ('stop.all') created."
77 77 puts "You should remove it manually later."
78 78 else
79 79 (1..ARGV.length-1).each do |i|
80 80 stop_grader(ARGV[i])
81 81 end
82 82 puts "stop file(s) created"
83 83 end
84 84 exit(0)
85 85 end
86 86
87 87 if check_stopfile
88 88 puts "Stop file exists. Terminated."
89 89 clear_stopfile
90 90 exit(0)
91 91 end
92 92
93 93 grader_mode = 'queue'
94 94 if ARGV.length >= 1
95 95 GRADER_ENV = ARGV[0]
96 96 if ARGV.length >=2
97 97 grader_mode = ARGV[1]
98 98 end
99 99 else
100 100 GRADER_ENV = 'exam'
101 101 end
102 102
103 103 puts "environment: #{GRADER_ENV}"
104 104 require File.join(File.dirname(__FILE__),'config/environment')
105 105
106 106 # add grader_mode to config
107 107 # this is needed because method log needs it. TODO: clean this up
108 108 class << config
109 109 attr_accessor :grader_mode
110 110 end
111 111 config.grader_mode = grader_mode
112 112
113 113 # reading rails environment
114 114 log 'Reading rails environment'
115 115
116 116 RAILS_ENV = config.rails_env
117 117 require RAILS_ROOT + '/config/environment'
118 118
119 119 # register grader process
120 120 if config.report_grader
121 121 grader_proc = GraderProcess.register(config.grader_hostname,
122 122 Process.pid,
123 123 grader_mode)
124 124 else
125 125 grader_proc = nil
126 126 end
127 127
128 128 #set loggin environment
129 129 ENV['GRADER_LOGGING'] = log_file_name
130 130
131 + # register exit handler to report inactive, and terminated
132 + at_exit do
133 + if grader_proc!=nil
134 + grader_proc.report_inactive
135 + grader_proc.terminate
136 + end
137 + end
138 +
131 139 #
132 140 # MAIN LOOP
133 141 #
134 142
135 143 case grader_mode
136 144 when "queue", "test_request"
137 145 log "Grader: #{grader_mode}"
138 146 if grader_mode=="queue"
139 147 engine = Grader::Engine.new
140 148 else
141 149 engine = Grader::Engine.new(Grader::TestRequestRoomMaker.new,
142 150 Grader::TestRequestReporter.new)
143 151 end
144 152
145 153 runner = Grader::Runner.new(engine, grader_proc)
146 154 while true
147 155
148 156 if check_stopfile # created by calling grader stop
149 157 clear_stopfile
150 158 log "stopped (with stop file)"
151 159 break
152 160 end
153 161
154 162 if grader_mode=="queue"
155 163 task = runner.grade_oldest_task
156 164 else
157 165 task = runner.grade_oldest_test_request
158 166 end
159 167 if task==nil
160 168 sleep(1)
161 169 end
162 170 end
163 171
164 172 when "prob"
165 173 engine = Grader::Engine.new
166 174 runner = Grader::Runner.new(engine, grader_proc)
167 175
168 176 grader_proc.report_active if grader_proc!=nil
169 177
170 178 ARGV.shift
171 179 ARGV.shift
172 180
173 181 ARGV.each do |prob_name|
174 182 prob = Problem.find_by_name(prob_name)
175 183 if prob==nil
176 184 puts "cannot find problem: #{prob_name}"
177 185 else
178 186 runner.grade_problem(prob)
179 187 end
180 188 end
181 189
182 190 when "sub"
183 191 engine = Grader::Engine.new
184 192 runner = Grader::Runner.new(engine, grader_proc)
185 193
186 194 grader_proc.report_active if grader_proc!=nil
187 195
188 196 ARGV.shift
189 197 ARGV.shift
190 198
191 199 ARGV.each do |sub_id|
192 200 puts "Grading #{sub_id}"
193 201 begin
194 202 submission = Submission.find(sub_id.to_i)
195 203 rescue ActiveRecord::RecordNotFound
196 204 puts "Record not found"
197 205 submission = nil
198 206 end
199 207
200 208 if submission!=nil
201 209 runner.grade_submission(submission)
202 210 end
203 211 end
204 212
205 213 else
206 214 display_manual
207 215 exit(0)
208 216 end
209 217
210 - # report inactive
211 - grader_proc.report_inactive if grader_proc!=nil
212 -
You need to be logged in to leave comments. Login now