diff --git a/app/models/grader_message.rb b/app/models/grader_message.rb deleted file mode 100644 --- a/app/models/grader_message.rb +++ /dev/null @@ -1,90 +0,0 @@ -class GraderMessage < ActiveRecord::Base - - belongs_to :taken_grader_process, :class_name => :grader_process - - GRADE_SUBMISSION = 1 - GRADE_TEST_REQUEST = 2 - STOP = 3 - - RECIPIENT_ANY = -1 - - def self.create_message(recipient, command, options=nil, target_id=nil) - recipient_id = recipient - if recipient == :any - recipient_id = GraderMessage::RECIPIENT_ANY - end - - GraderMessage.create(:grader_process_id => recipient_id, - :command => command, - :options => options, - :target_id => target_id, - :taken => false) - end - - def self.create_grade_submission(submission, - grading_environment="grading") - GraderMessage.create_message(:any, - GraderMessage::GRADE_SUBMISSION, - grading_environment, - submission.id) - end - - def self.create_grade_test_request(test_request, - grading_environment="grading") - GraderMessage.create_message(:any, - GraderMessage::GRADE_TEST_REQUEST, - grading_environment, - test_request.id) - end - - def self.create_stop(grader_process_id) - GraderMessage.create_message(grader_process_id, - GraderMessage::STOP) - end - - def self.get_message_for(recipient_id, accepting_commands=:all) - command_conditions = - GraderMessage.build_command_conditions(accepting_commands) - recp_conditions= "((`grader_process_id` = #{recipient_id.to_i})" + - " OR (`grader_process_id` = #{GraderMessage::RECIPIENT_ANY}))" - - message = nil # need this to bind message in do-block for transaction - begin - GraderMessage.transaction do - message = GraderMessage.find(:first, - :order => "created_at", - :conditions => - "(`taken` = 0)" + - " AND (#{recp_conditions})" + - " AND (#{command_conditions})", - :lock => true) - if message!=nil - message.taken = true - message.taken_grader_process_id = recipient_id - message.save! - end - end - - rescue - message = nil - - end - - message - end - - protected - - def self.build_command_conditions(accepting_commands) - if accepting_commands==:all - return '(1=1)' - else - conds = [] - accepting_commands.each do |command| - conds << "(`command` = #{command.to_i})" - end - return "(" + conds.join(" OR ") + ")" - end - end - -end diff --git a/db/migrate/20090429014554_create_grader_messages.rb b/db/migrate/20090429014554_create_grader_messages.rb deleted file mode 100644 --- a/db/migrate/20090429014554_create_grader_messages.rb +++ /dev/null @@ -1,17 +0,0 @@ -class CreateGraderMessages < ActiveRecord::Migration - def self.up - create_table :grader_messages do |t| - t.integer :grader_process_id - t.integer :command - t.string :options - t.integer :target_id - t.boolean :taken - t.integer :taken_grader_process_id - t.timestamps - end - end - - def self.down - drop_table :grader_messages - end -end 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 => 20090429014554) do +ActiveRecord::Schema.define(:version => 20090426131044) do create_table "announcements", :force => true do |t| t.string "author" @@ -42,17 +42,6 @@ t.datetime "updated_at" end - create_table "grader_messages", :force => true do |t| - t.integer "grader_process_id" - t.integer "command" - t.string "options" - t.integer "target_id" - t.boolean "taken" - t.integer "taken_grader_process_id" - t.datetime "created_at" - t.datetime "updated_at" - end - create_table "grader_processes", :force => true do |t| t.string "host", :limit => 20 t.integer "pid" diff --git a/judge/scripts/config/.gitignore b/judge/scripts/config/.gitignore --- a/judge/scripts/config/.gitignore +++ b/judge/scripts/config/.gitignore @@ -1,2 +1,2 @@ -env_*.rb +env*.rb diff --git a/judge/scripts/config/environment.rb b/judge/scripts/config/environment.rb deleted file mode 100644 --- a/judge/scripts/config/environment.rb +++ /dev/null @@ -1,9 +0,0 @@ -# Rails app directory -RAILS_ROOT = File.expand_path(File.join(File.dirname(__FILE__),"../../..")) -GRADER_ROOT = File.expand_path(File.join(File.dirname(__FILE__),"..")) - -# This load all required codes -require File.join(File.dirname(__FILE__),'../lib/boot') - -# load the required environment file -require File.dirname(__FILE__) + "/env_#{GRADER_ENV}.rb" diff --git a/judge/scripts/config/environment.rb.SAMPLE b/judge/scripts/config/environment.rb.SAMPLE new file mode 100644 --- /dev/null +++ b/judge/scripts/config/environment.rb.SAMPLE @@ -0,0 +1,10 @@ +# Rails app directory +RAILS_ROOT = "/home/jittat/web_grader" + +GRADER_ROOT = "/home/jittat/grader/scripts" + +# This load all required codes +require File.join(File.dirname(__FILE__),'../lib/boot') + +# load the required environment file +require File.dirname(__FILE__) + "/env_#{GRADER_ENV}.rb" diff --git a/judge/scripts/grader b/judge/scripts/grader --- a/judge/scripts/grader +++ b/judge/scripts/grader @@ -28,7 +28,7 @@ raise "Log directory does not exist: #{config.log_dir}" end config.log_dir + - "/#{GRADER_ENV}.#{Process.pid}" + "/#{GRADER_ENV}_#{config.grader_mode}.#{Process.pid}" end def log(str) diff --git a/judge/scripts/grader-batch b/judge/scripts/grader-batch deleted file mode 100755 --- a/judge/scripts/grader-batch +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/ruby - -require 'optparse' - -def config - Grader::Configuration.get_instance -end - -def log_file_name - if !File.exists?(config.log_dir) - raise "Log directory does not exist: #{config.log_dir}" - end - config.log_dir + - "/#{GRADER_ENV}.#{Process.pid}" -end - -def log(str) - if config.talkative - puts str - end - if config.logging - fp = File.open(log_file_name,"a") - fp.puts("GRADER: #{Time.new.strftime("%H:%M")} #{str}") - fp.close - end -end - -def parse_arguments(args) - options = { - :environment => 'grading', - :problems => [], - :submissions => [] - } - opts = OptionParser.new do |opts| - opts.banner = < id) - GraderMessage.create_grade_submission("exam",submission) - end - - before(:each) do - GraderMessage.destroy_all - end - - it "should return nil when there is no messages to me" do - GraderMessage.create_message(1,0) - GraderMessage.get_message_for(2).should == nil - end - - it "should return a messages directed to me" do - GraderMessage.create_message(1,0) - GraderMessage.get_message_for(2).should == nil - end - - it "should return a messages directed to me, in order of creation" do - msg1 = GraderMessage.create_message(1,0) - msg2 = GraderMessage.create_message(2,2) - msg3 = GraderMessage.create_message(1,2) - GraderMessage.get_message_for(1).id.should == msg1.id - GraderMessage.get_message_for(1).id.should == msg3.id - end - - it "should not return a messages directed to me if the command is not on my list of accepting commands" do - msg1 = GraderMessage.create_message(1,GraderMessage::GRADE_SUBMISSION) - msg2 = GraderMessage.create_message(1,GraderMessage::STOP) - GraderMessage.get_message_for(1,[GraderMessage::GRADE_TEST_REQUEST]).should == nil - end - - it "should return a messages directed to me if the command is on my list of accepting commands" do - msg1 = GraderMessage.create_message(1,0) - msg2 = GraderMessage.create_message(1,2) - msg3 = GraderMessage.create_message(2,2) - GraderMessage.get_message_for(1,[2]).id.should == msg2.id - GraderMessage.get_message_for(1,[2]).should == nil - end - - it "should return a message directed to anyone when I'm requesting" do - msg1 = GraderMessage.create_message(:any,0) - GraderMessage.get_message_for(1).id.should == msg1.id - end - - it "should return a messages directed to anyone only if the command is on my list of accepting commands" do - msg1 = GraderMessage.create_message(:any,0) - GraderMessage.get_message_for(1,[1]).should == nil - msg2 = GraderMessage.create_message(:any,1) - GraderMessage.get_message_for(1,[1]).id.should == msg2.id - end - - it "should return messages directed to anyone to many graders in order of requests" do - msg1 = GraderMessage.create_message(:any,0) - msg2 = GraderMessage.create_message(:any,2) - msg3 = GraderMessage.create_message(:any,2) - GraderMessage.get_message_for(1).id.should == msg1.id - GraderMessage.get_message_for(2).id.should == msg2.id - GraderMessage.get_message_for(1).id.should == msg3.id - end - - it "should return messages directed to anyone to graders accepting those commands in order of requests" do - msg1 = GraderMessage.create_message(:any,0) - msg2 = GraderMessage.create_message(:any,1) - msg3 = GraderMessage.create_message(:any,2) - msg4 = GraderMessage.create_message(:any,2) - msg5 = GraderMessage.create_message(:any,3) - GraderMessage.get_message_for(1).id.should == msg1.id - GraderMessage.get_message_for(2,[2]).id.should == msg3.id - GraderMessage.get_message_for(1,[3]).id.should == msg5.id - GraderMessage.get_message_for(2).id.should == msg2.id - GraderMessage.get_message_for(1).id.should == msg4.id - end - - it "should get all messages dispatched when there are many concurrent processes" do - n = 100 - msg = [] - n.times do |i| - msg << GraderMessage.create_message(:any,i) - end - - #puts "#{n} messages created" - - t = 10 # use 10 threads - ths = [] - t.times do |i| - fork do - #puts "I'm the #{i+1}-th process." - begin - m = GraderMessage.get_message_for(i) - #puts "#{i+1} got #{m.id}" if m - sleep 0.1 - end while m!=nil - #puts "The #{i+1}-th process terminated." - exit 0 - end - end - - t.times do - Process.wait - end - - # for some reason the connection is lost at this point. - GraderMessage.connection.reconnect! - - # check that all messages have been processed - GraderMessage.find(:all) do |msg| - msg.taken_grader_process.should != nil - end - - end - -end diff --git a/test/fixtures/grader_messages.yml b/test/fixtures/grader_messages.yml deleted file mode 100644 --- a/test/fixtures/grader_messages.yml +++ /dev/null @@ -1,7 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html - -# one: -# column: value -# -# two: -# column: value diff --git a/test/unit/grader_message_test.rb b/test/unit/grader_message_test.rb deleted file mode 100644 --- a/test/unit/grader_message_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class GraderMessageTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end