Description:
added more grader control git-svn-id: http://theory.cpe.ku.ac.th/grader/web/trunk@434 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

r203:e7056be0091a - - 6 files changed: 81 inserted, 21 deleted

@@ -0,0 +1,35
1 + module GraderScript
2 +
3 + def self.grader_control_enabled?
4 + if defined? GRADER_SCRIPT_DIR
5 + GRADER_SCRIPT_DIR != ''
6 + else
7 + false
8 + end
9 + end
10 +
11 + def self.stop_grader(pid)
12 + if GraderScript.grader_control_enabled?
13 + cmd = "#{GRADER_SCRIPT_DIR}/grader stop #{pid}"
14 + system(cmd)
15 + end
16 + end
17 +
18 + def self.stop_graders(pids)
19 + if GraderScript.grader_control_enabled?
20 + pid_str = (pids.map { |process| process.pid.to_a }).join ' '
21 + cmd = "#{GRADER_SCRIPT_DIR}/grader stop " + pid_str
22 + system(cmd)
23 + end
24 + end
25 +
26 + def self.start_grader(env)
27 + if GraderScript.grader_control_enabled?
28 + cmd = "#{GRADER_SCRIPT_DIR}/grader #{env} queue &"
29 + system(cmd)
30 + cmd = "#{GRADER_SCRIPT_DIR}/grader #{env} test_request &"
31 + system(cmd)
32 + end
33 + end
34 +
35 + end
@@ -1,29 +1,33
1 1 class GradersController < ApplicationController
2 2
3 3 before_filter :admin_authorization
4 4
5 - verify :method => :post, :only => ['clear_all', 'clear_terminated'],
5 + verify :method => :post, :only => ['clear_all',
6 + 'start_exam',
7 + 'start_grading',
8 + 'stop_all',
9 + 'clear_terminated'],
6 10 :redirect_to => {:action => 'index'}
7 11
8 12 def index
9 13 redirect_to :action => 'list'
10 14 end
11 15
12 16 def list
13 17 @grader_processes = GraderProcess.find_running_graders
14 18 @stalled_processes = GraderProcess.find_stalled_process
15 19
16 20 @terminated_processes = GraderProcess.find_terminated_graders
17 21
18 22 @last_task = Task.find(:first,
19 23 :order => 'created_at DESC')
20 24 @last_test_request = TestRequest.find(:first,
21 25 :order => 'created_at DESC')
22 26 end
23 27
24 28 def clear
25 29 grader_proc = GraderProcess.find(params[:id])
26 30 grader_proc.destroy if grader_proc!=nil
27 31 redirect_to :action => 'list'
28 32 end
29 33
@@ -44,39 +48,49
44 48 def view
45 49 if params[:type]=='Task'
46 50 redirect_to :action => 'task', :id => params[:id]
47 51 else
48 52 redirect_to :action => 'test_request', :id => params[:id]
49 53 end
50 54 end
51 55
52 56 def test_request
53 57 @test_request = TestRequest.find(params[:id])
54 58 end
55 59
56 60 def task
57 61 @task = Task.find(params[:id])
58 62 end
59 63
60 64 def submission
61 65 @submission = Submission.find(params[:id])
62 66 end
63 67
64 68 # various grader controls
65 69
66 70 def stop
67 71 grader_proc = GraderProcess.find(params[:id])
68 - stop_grader(grader_proc.pid)
72 + GraderScript.stop_grader(grader_proc.pid)
73 + flash[:notice] = 'Grader stopped. It may not disappear now, but it should disappear shortly.'
74 + redirect_to :action => 'list'
75 + end
76 +
77 + def stop_all
78 + GraderScript.stop_graders(GraderProcess.find_running_graders +
79 + GraderProcess.find_stalled_process)
80 + flash[:notice] = 'Graders stopped. They may not disappear now, but they should disappear shortly.'
69 81 redirect_to :action => 'list'
70 82 end
71 83
72 -
73 - protected
84 + def start_grading
85 + GraderScript.start_grader('grading')
86 + flash[:notice] = '2 graders in grading env started, one for grading queue tasks, another for grading test request'
87 + redirect_to :action => 'list'
88 + end
74 89
75 - def stop_grader(pid)
76 - if GraderProcess.grader_control_enabled?
77 - cmd = "#{GRADER_SCRIPT_DIR}/grader stop #{pid}"
78 - system(cmd)
79 - end
90 + def start_exam
91 + GraderScript.start_grader('exam')
92 + flash[:notice] = '2 graders in grading env started, one for grading queue tasks, another for grading test request'
93 + redirect_to :action => 'list'
80 94 end
81 95
82 96 end
@@ -22,56 +22,48
22 22 :pid => pid,
23 23 :mode => mode,
24 24 :terminated => false)
25 25 end
26 26 grader
27 27 end
28 28
29 29 def self.find_running_graders
30 30 GraderProcess.find(:all,
31 31 :conditions => {:terminated => 0})
32 32 end
33 33
34 34 def self.find_terminated_graders
35 35 GraderProcess.find(:all,
36 36 :conditions => "`terminated`")
37 37 end
38 38
39 39 def self.find_stalled_process
40 40 GraderProcess.find(:all,
41 41 :conditions => ["(`terminated` = 0) AND active AND " +
42 42 "(updated_at < ?)",
43 43 Time.now.gmtime - GraderProcess.stalled_time])
44 44 end
45 45
46 - def self.grader_control_enabled?
47 - if defined? GRADER_SCRIPT_DIR
48 - GRADER_SCRIPT_DIR != ''
49 - else
50 - false
51 - end
52 - end
53 -
54 46 def report_active(task=nil)
55 47 self.active = true
56 48 if task!=nil
57 49 self.task_id = task.id
58 50 self.task_type = task.class.to_s
59 51 else
60 52 self.task_id = nil
61 53 self.task_type = nil
62 54 end
63 55 self.save
64 56 end
65 57
66 58 def report_inactive(task=nil)
67 59 self.active = false
68 60 if task!=nil
69 61 self.task_id = task.id
70 62 self.task_type = task.class.to_s
71 63 else
72 64 self.task_id = nil
73 65 self.task_type = nil
74 66 end
75 67 self.save
76 68 end
77 69
@@ -1,25 +1,25
1 1 - if grader_list.length!=0
2 2 %table.graders
3 3 %tr
4 4 %th host
5 5 %th pid
6 6 %th mode
7 7 %th last updated
8 8 %th type
9 9 %th task
10 10 - grader_list.each do |grader|
11 11 - if grader.active
12 12 - c = 'active'
13 13 - else
14 14 - c = 'inactive'
15 15 %tr{:class => c}
16 16 = render :partial => 'grader', :locals => {:grader => grader}
17 17 - if not grader.terminated
18 - - if GraderProcess.grader_control_enabled?
18 + - if GraderScript.grader_control_enabled?
19 19 %td= link_to 'stop', {:action => 'stop', :id => grader}
20 20 - else
21 21 %td= link_to 'clear', {:action => 'clear', :id => grader}
22 22 - else
23 23 %ul
24 24 %li None
25 25
@@ -1,32 +1,46
1 1 - content_for :head do
2 2 = stylesheet_link_tag 'graders'
3 3 <meta http-equiv ="refresh" content="60"/>
4 4
5 5 %h1 Grader information
6 6
7 - - form_for :clear, nil, :url => {:action => 'clear_all'} do |f|
8 - = submit_tag 'Clear all data'
7 + .submitbox
8 + .item
9 + Grader control:
10 + .item
11 + - form_for :clear, nil, :url => {:action => 'start_grading'} do |f|
12 + = submit_tag 'Start graders in grading env'
13 + .item
14 + - form_for :clear, nil, :url => {:action => 'start_exam'} do |f|
15 + = submit_tag 'Start graders in exam env'
16 + .item
17 + - form_for :clear, nil, :url => {:action => 'stop_all'} do |f|
18 + = submit_tag 'Stop all running graders'
19 + .item
20 + - form_for :clear, nil, :url => {:action => 'clear_all'} do |f|
21 + = submit_tag 'Clear all data'
22 + %br{:style => 'clear:both'}/
9 23
10 24 - if @last_task
11 25 Last task:
12 26 = link_to "#{@last_task.id}", :action => 'view', :id => @last_task.id, :type => 'Task'
13 27
14 28 %br/
15 29
16 30 - if @last_test_request
17 31 Last test_request:
18 32 = link_to "#{@last_test_request.id}", :action => 'view', :id => @last_test_request.id, :type => 'TestRequest'
19 33
20 34
21 35 %h2 Current graders
22 36
23 37 = render :partial => 'grader_list', :locals => {:grader_list => @grader_processes}
24 38
25 39 %h2 Stalled graders
26 40
27 41 = render :partial => 'grader_list', :locals => {:grader_list => @stalled_processes}
28 42
29 43 %h2 Terminated graders
30 44
31 45 - form_for :clear, nil, :url => {:action => 'clear_terminated'} do |f|
32 46 = submit_tag 'Clear data for terminated graders'
@@ -1,12 +1,17
1 1
2 2 table.graders tr.active {
3 3 border: 1px solid black;
4 4 background: lightgreen;
5 5 text-align: center;
6 6 }
7 7
8 8 table.graders tr.inactive {
9 9 border: 1px solid black;
10 10 background: #ffcccc;
11 11 text-align: center;
12 - } No newline at end of file
12 + }
13 +
14 + .submitbox .item {
15 + padding-right: 5px;
16 + float: left;
17 + }
You need to be logged in to leave comments. Login now