diff --git a/app/controllers/graders_controller.rb b/app/controllers/graders_controller.rb --- a/app/controllers/graders_controller.rb +++ b/app/controllers/graders_controller.rb @@ -2,7 +2,7 @@ before_filter :admin_authorization - verify :method => :post, :only => ['clear_all'], + verify :method => :post, :only => ['clear_all', 'clear_terminated'], :redirect_to => {:action => 'index'} def index @@ -10,9 +10,10 @@ end def list - @grader_processes = GraderProcess.find(:all, - :order => 'updated_at desc') + @grader_processes = GraderProcess.find_running_graders @stalled_processes = GraderProcess.find_stalled_process + + @terminated_processes = GraderProcess.find_terminated_graders @last_task = Task.find(:first, :order => 'created_at DESC') @@ -26,6 +27,13 @@ redirect_to :action => 'list' end + def clear_terminated + GraderProcess.find_terminated_graders.each do |p| + p.destroy + end + redirect_to :action => 'list' + end + def clear_all GraderProcess.find(:all).each do |p| p.destroy diff --git a/app/models/grader_process.rb b/app/models/grader_process.rb --- a/app/models/grader_process.rb +++ b/app/models/grader_process.rb @@ -15,18 +15,31 @@ grader.active = nil grader.task_id = nil grader.task_type = nil + grader.terminated = false grader.save else grader = GraderProcess.create(:host => host, :pid => pid, - :mode => mode) + :mode => mode, + :terminated => false) end grader end + + def self.find_running_graders + GraderProcess.find(:all, + :conditions => {:terminated => 0}) + end - def self.find_stalled_process() + def self.find_terminated_graders GraderProcess.find(:all, - :conditions => ["active AND updated_at < ?", + :conditions => "`terminated`") + end + + def self.find_stalled_process + GraderProcess.find(:all, + :conditions => ["(`terminated` = 0) AND active AND " + + "(updated_at < ?)", Time.now.gmtime - GraderProcess.stalled_time]) end @@ -54,6 +67,11 @@ self.save end + def terminate + self.terminated = true + self.save + end + protected def self.stalled_time() diff --git a/app/views/graders/_grader_list.html.haml b/app/views/graders/_grader_list.html.haml --- a/app/views/graders/_grader_list.html.haml +++ b/app/views/graders/_grader_list.html.haml @@ -1,18 +1,24 @@ +- if grader_list.length!=0 + %table.graders + %tr + %th host + %th pid + %th mode + %th last updated + %th type + %th task + - grader_list.each do |grader| + - if grader.active + - c = 'active' + - else + - c = 'inactive' + %tr{:class => c} + = render :partial => 'grader', :locals => {:grader => grader} + - if not grader.terminated + %td= link_to 'stop', {:action => 'stop', :id => grader} + - else + %td= link_to 'clear', {:action => 'clear', :id => grader} +- else + %ul + %li None -%table.graders - %tr - %th host - %th pid - %th mode - %th last updated - %th type - %th task - - grader_list.each do |grader| - - if grader.active - - c = 'active' - - else - - c = 'inactive' - %tr{:class => c} - = render :partial => 'grader', :locals => {:grader => grader} - %td= link_to 'clear', {:action => 'clear', :id => grader} - diff --git a/app/views/graders/list.html.haml b/app/views/graders/list.html.haml --- a/app/views/graders/list.html.haml +++ b/app/views/graders/list.html.haml @@ -18,10 +18,17 @@ = link_to "#{@last_test_request.id}", :action => 'view', :id => @last_test_request.id, :type => 'TestRequest' -%h3 Current graders +%h2 Current graders = render :partial => 'grader_list', :locals => {:grader_list => @grader_processes} -%h3 Stalled graders +%h2 Stalled graders = render :partial => 'grader_list', :locals => {:grader_list => @stalled_processes} + +%h2 Terminated graders + +- form_for :clear, nil, :url => {:action => 'clear_terminated'} do |f| + = submit_tag 'Clear data for terminated graders' + += render :partial => 'grader_list', :locals => {:grader_list => @terminated_processes} diff --git a/db/schema.rb b/db/schema.rb --- a/db/schema.rb +++ b/db/schema.rb @@ -9,7 +9,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20090416235658) do +ActiveRecord::Schema.define(:version => 20090426131044) do create_table "announcements", :force => true do |t| t.string "author" @@ -51,6 +51,7 @@ t.datetime "updated_at" t.integer "task_id" t.string "task_type" + t.boolean "terminated" end add_index "grader_processes", ["host", "pid"], :name => "index_grader_processes_on_ip_and_pid"