Description:
[grader] process-wise stop file git-svn-id: http://theory.cpe.ku.ac.th/grader/judge/trunk/scripts@107 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

r24:e6a6003ee7ff - - 1 file changed: 26 inserted, 8 deleted

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