class GraderProcess < ActiveRecord::Base def self.find_by_host_and_pid(host,pid) return GraderProcess.find(:first, :conditions => { :host => host, :pid => pid }) end def self.register(host,pid,mode) grader = GraderProcess.find_by_host_and_pid(host,pid) if grader grader.mode = mode 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, :terminated => false) end grader end def self.find_running_graders GraderProcess.find(:all, :conditions => {:terminated => 0}) end def self.find_terminated_graders GraderProcess.find(:all, :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 def report_active(task=nil) self.active = true if task!=nil self.task_id = task.id self.task_type = task.class.to_s else self.task_id = nil self.task_type = nil end self.save end def report_inactive(task=nil) self.active = false if task!=nil self.task_id = task.id self.task_type = task.class.to_s else self.task_id = nil self.task_type = nil end self.save end def terminate self.terminated = true self.save end protected def self.stalled_time() return 1.minute end end