Description:
fixed timing stat bug when used with single user mode
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r245:4658efe40e96 - - 2 files changed: 7 inserted, 1 deleted

@@ -1,40 +1,39
1 class LoginController < ApplicationController
1 class LoginController < ApplicationController
2
2
3 def index
3 def index
4 # show login screen
4 # show login screen
5 reset_session
5 reset_session
6 redirect_to :controller => 'main', :action => 'login'
6 redirect_to :controller => 'main', :action => 'login'
7 end
7 end
8
8
9 def login
9 def login
10 if user = User.authenticate(params[:login], params[:password])
10 if user = User.authenticate(params[:login], params[:password])
11 session[:user_id] = user.id
11 session[:user_id] = user.id
12 session[:admin] = user.admin?
12 session[:admin] = user.admin?
13 - UserContestStat.update_user_start_time(user)
14 redirect_to :controller => 'main', :action => 'list'
13 redirect_to :controller => 'main', :action => 'list'
15 else
14 else
16 flash[:notice] = 'Wrong password'
15 flash[:notice] = 'Wrong password'
17 redirect_to :controller => 'main', :action => 'login'
16 redirect_to :controller => 'main', :action => 'login'
18 end
17 end
19 end
18 end
20
19
21 def site_login
20 def site_login
22 begin
21 begin
23 site = Site.find(params[:login][:site_id])
22 site = Site.find(params[:login][:site_id])
24 rescue ActiveRecord::RecordNotFound
23 rescue ActiveRecord::RecordNotFound
25 site = nil
24 site = nil
26 end
25 end
27 if site==nil
26 if site==nil
28 flash[:notice] = 'Wrong site'
27 flash[:notice] = 'Wrong site'
29 redirect_to :controller => 'main', :action => 'login' and return
28 redirect_to :controller => 'main', :action => 'login' and return
30 end
29 end
31 if (site.password) and (site.password == params[:login][:password])
30 if (site.password) and (site.password == params[:login][:password])
32 session[:site_id] = site.id
31 session[:site_id] = site.id
33 redirect_to :controller => 'site', :action => 'index'
32 redirect_to :controller => 'site', :action => 'index'
34 else
33 else
35 flash[:notice] = 'Wrong site password'
34 flash[:notice] = 'Wrong site password'
36 redirect_to :controller => 'site', :action => 'login'
35 redirect_to :controller => 'site', :action => 'login'
37 end
36 end
38 end
37 end
39
38
40 end
39 end
@@ -1,101 +1,103
1 class MainController < ApplicationController
1 class MainController < ApplicationController
2
2
3 before_filter :authenticate, :except => [:index, :login]
3 before_filter :authenticate, :except => [:index, :login]
4 before_filter :check_viewability, :except => [:index, :login]
4 before_filter :check_viewability, :except => [:index, :login]
5
5
6 + append_before_filter :update_user_start_time, :except => [:index, :login]
7 +
6 # COMMENTED OUT: filter in each action instead
8 # COMMENTED OUT: filter in each action instead
7 # before_filter :verify_time_limit, :only => [:submit]
9 # before_filter :verify_time_limit, :only => [:submit]
8
10
9 verify :method => :post, :only => [:submit, :download_input, :submit_solution],
11 verify :method => :post, :only => [:submit, :download_input, :submit_solution],
10 :redirect_to => { :action => :index }
12 :redirect_to => { :action => :index }
11
13
12 # COMMENT OUT: only need when having high load
14 # COMMENT OUT: only need when having high load
13 # caches_action :index, :login
15 # caches_action :index, :login
14
16
15 # NOTE: This method is not actually needed, 'config/routes.rb' has
17 # NOTE: This method is not actually needed, 'config/routes.rb' has
16 # assigned action login as a default action.
18 # assigned action login as a default action.
17 def index
19 def index
18 redirect_to :action => 'login'
20 redirect_to :action => 'login'
19 end
21 end
20
22
21 def login
23 def login
22 saved_notice = flash[:notice]
24 saved_notice = flash[:notice]
23 reset_session
25 reset_session
24 flash.now[:notice] = saved_notice
26 flash.now[:notice] = saved_notice
25
27
26 # EXPERIMENT:
28 # EXPERIMENT:
27 # Hide login if in single user mode and the url does not
29 # Hide login if in single user mode and the url does not
28 # explicitly specify /login
30 # explicitly specify /login
29 #
31 #
30 # logger.info "PATH: #{request.path}"
32 # logger.info "PATH: #{request.path}"
31 # if Configuration['system.single_user_mode'] and
33 # if Configuration['system.single_user_mode'] and
32 # request.path!='/main/login'
34 # request.path!='/main/login'
33 # @hidelogin = true
35 # @hidelogin = true
34 # end
36 # end
35
37
36 @announcements = Announcement.find_for_frontpage
38 @announcements = Announcement.find_for_frontpage
37 render :action => 'login', :layout => 'empty'
39 render :action => 'login', :layout => 'empty'
38 end
40 end
39
41
40 def list
42 def list
41 prepare_list_information
43 prepare_list_information
42 end
44 end
43
45
44 def help
46 def help
45 @user = User.find(session[:user_id])
47 @user = User.find(session[:user_id])
46 end
48 end
47
49
48 def submit
50 def submit
49 user = User.find(session[:user_id])
51 user = User.find(session[:user_id])
50
52
51 @submission = Submission.new(params[:submission])
53 @submission = Submission.new(params[:submission])
52 @submission.user = user
54 @submission.user = user
53 @submission.language_id = 0
55 @submission.language_id = 0
54 if (params['file']) and (params['file']!='')
56 if (params['file']) and (params['file']!='')
55 @submission.source = params['file'].read
57 @submission.source = params['file'].read
56 @submission.source_filename = params['file'].original_filename
58 @submission.source_filename = params['file'].original_filename
57 end
59 end
58 @submission.submitted_at = Time.new.gmtime
60 @submission.submitted_at = Time.new.gmtime
59
61
60 if Configuration.time_limit_mode? and user.contest_finished?
62 if Configuration.time_limit_mode? and user.contest_finished?
61 @submission.errors.add_to_base "The contest is over."
63 @submission.errors.add_to_base "The contest is over."
62 prepare_list_information
64 prepare_list_information
63 render :action => 'list' and return
65 render :action => 'list' and return
64 end
66 end
65
67
66 if @submission.valid?
68 if @submission.valid?
67 if @submission.save == false
69 if @submission.save == false
68 flash[:notice] = 'Error saving your submission'
70 flash[:notice] = 'Error saving your submission'
69 elsif Task.create(:submission_id => @submission.id,
71 elsif Task.create(:submission_id => @submission.id,
70 :status => Task::STATUS_INQUEUE) == false
72 :status => Task::STATUS_INQUEUE) == false
71 flash[:notice] = 'Error adding your submission to task queue'
73 flash[:notice] = 'Error adding your submission to task queue'
72 end
74 end
73 else
75 else
74 prepare_list_information
76 prepare_list_information
75 render :action => 'list' and return
77 render :action => 'list' and return
76 end
78 end
77 redirect_to :action => 'list'
79 redirect_to :action => 'list'
78 end
80 end
79
81
80 def source
82 def source
81 submission = Submission.find(params[:id])
83 submission = Submission.find(params[:id])
82 if submission.user_id == session[:user_id]
84 if submission.user_id == session[:user_id]
83 send_data(submission.source,
85 send_data(submission.source,
84 {:filename => submission.download_filename,
86 {:filename => submission.download_filename,
85 :type => 'text/plain'})
87 :type => 'text/plain'})
86 else
88 else
87 flash[:notice] = 'Error viewing source'
89 flash[:notice] = 'Error viewing source'
88 redirect_to :action => 'list'
90 redirect_to :action => 'list'
89 end
91 end
90 end
92 end
91
93
92 def compiler_msg
94 def compiler_msg
93 @submission = Submission.find(params[:id])
95 @submission = Submission.find(params[:id])
94 if @submission.user_id == session[:user_id]
96 if @submission.user_id == session[:user_id]
95 render :action => 'compiler_msg', :layout => 'empty'
97 render :action => 'compiler_msg', :layout => 'empty'
96 else
98 else
97 flash[:notice] = 'Error viewing source'
99 flash[:notice] = 'Error viewing source'
98 redirect_to :action => 'list'
100 redirect_to :action => 'list'
99 end
101 end
100 end
102 end
101
103
@@ -362,98 +364,103
362 trun_count = grading_info['testruns']
364 trun_count = grading_info['testruns']
363 trun_count.times do |i|
365 trun_count.times do |i|
364 @test_runs << [ read_grading_result(@user.login,
366 @test_runs << [ read_grading_result(@user.login,
365 submission.problem.name,
367 submission.problem.name,
366 submission.id,
368 submission.id,
367 i+1) ]
369 i+1) ]
368 end
370 end
369 else
371 else
370 grading_info['testruns'].keys.sort.each do |num|
372 grading_info['testruns'].keys.sort.each do |num|
371 run = []
373 run = []
372 testrun = grading_info['testruns'][num]
374 testrun = grading_info['testruns'][num]
373 testrun.each do |c|
375 testrun.each do |c|
374 run << read_grading_result(@user.login,
376 run << read_grading_result(@user.login,
375 submission.problem.name,
377 submission.problem.name,
376 submission.id,
378 submission.id,
377 c)
379 c)
378 end
380 end
379 @test_runs << run
381 @test_runs << run
380 end
382 end
381 end
383 end
382 end
384 end
383
385
384 def grading_result_dir(user_name, problem_name, submission_id, case_num)
386 def grading_result_dir(user_name, problem_name, submission_id, case_num)
385 return "#{GRADING_RESULT_DIR}/#{user_name}/#{problem_name}/#{submission_id}/test-result/#{case_num}"
387 return "#{GRADING_RESULT_DIR}/#{user_name}/#{problem_name}/#{submission_id}/test-result/#{case_num}"
386 end
388 end
387
389
388 def output_filename(user_name, problem_name, submission_id, case_num)
390 def output_filename(user_name, problem_name, submission_id, case_num)
389 dir = grading_result_dir(user_name,problem_name, submission_id, case_num)
391 dir = grading_result_dir(user_name,problem_name, submission_id, case_num)
390 return "#{dir}/output.txt"
392 return "#{dir}/output.txt"
391 end
393 end
392
394
393 def read_grading_result(user_name, problem_name, submission_id, case_num)
395 def read_grading_result(user_name, problem_name, submission_id, case_num)
394 dir = grading_result_dir(user_name,problem_name, submission_id, case_num)
396 dir = grading_result_dir(user_name,problem_name, submission_id, case_num)
395 result_file_name = "#{dir}/result"
397 result_file_name = "#{dir}/result"
396 if !FileTest.exists?(result_file_name)
398 if !FileTest.exists?(result_file_name)
397 return {:num => case_num, :msg => 'program did not run'}
399 return {:num => case_num, :msg => 'program did not run'}
398 else
400 else
399 results = File.open(result_file_name).readlines
401 results = File.open(result_file_name).readlines
400 run_stat = extract_running_stat(results)
402 run_stat = extract_running_stat(results)
401 output_filename = "#{dir}/output.txt"
403 output_filename = "#{dir}/output.txt"
402 if FileTest.exists?(output_filename)
404 if FileTest.exists?(output_filename)
403 output_file = true
405 output_file = true
404 output_size = File.size(output_filename)
406 output_size = File.size(output_filename)
405 else
407 else
406 output_file = false
408 output_file = false
407 output_size = 0
409 output_size = 0
408 end
410 end
409
411
410 return {
412 return {
411 :num => case_num,
413 :num => case_num,
412 :msg => results[0],
414 :msg => results[0],
413 :run_stat => run_stat,
415 :run_stat => run_stat,
414 :output => output_file,
416 :output => output_file,
415 :output_size => output_size
417 :output_size => output_size
416 }
418 }
417 end
419 end
418 end
420 end
419
421
420 # copied from grader/script/lib/test_request_helper.rb
422 # copied from grader/script/lib/test_request_helper.rb
421 def extract_running_stat(results)
423 def extract_running_stat(results)
422 running_stat_line = results[-1]
424 running_stat_line = results[-1]
423
425
424 # extract exit status line
426 # extract exit status line
425 run_stat = ""
427 run_stat = ""
426 if !(/[Cc]orrect/.match(results[0]))
428 if !(/[Cc]orrect/.match(results[0]))
427 run_stat = results[0].chomp
429 run_stat = results[0].chomp
428 else
430 else
429 run_stat = 'Program exited normally'
431 run_stat = 'Program exited normally'
430 end
432 end
431
433
432 logger.info "Stat line: #{running_stat_line}"
434 logger.info "Stat line: #{running_stat_line}"
433
435
434 # extract running time
436 # extract running time
435 if res = /r(.*)u(.*)s/.match(running_stat_line)
437 if res = /r(.*)u(.*)s/.match(running_stat_line)
436 seconds = (res[1].to_f + res[2].to_f)
438 seconds = (res[1].to_f + res[2].to_f)
437 time_stat = "Time used: #{seconds} sec."
439 time_stat = "Time used: #{seconds} sec."
438 else
440 else
439 seconds = nil
441 seconds = nil
440 time_stat = "Time used: n/a sec."
442 time_stat = "Time used: n/a sec."
441 end
443 end
442
444
443 # extract memory usage
445 # extract memory usage
444 if res = /s(.*)m/.match(running_stat_line)
446 if res = /s(.*)m/.match(running_stat_line)
445 memory_used = res[1].to_i
447 memory_used = res[1].to_i
446 else
448 else
447 memory_used = -1
449 memory_used = -1
448 end
450 end
449
451
450 return {
452 return {
451 :msg => "#{run_stat}\n#{time_stat}",
453 :msg => "#{run_stat}\n#{time_stat}",
452 :running_time => seconds,
454 :running_time => seconds,
453 :exit_status => run_stat,
455 :exit_status => run_stat,
454 :memory_usage => memory_used
456 :memory_usage => memory_used
455 }
457 }
456 end
458 end
457
459
460 + def update_user_start_time
461 + user = User.find(session[:user_id])
462 + UserContestStat.update_user_start_time(user)
463 + end
464 +
458 end
465 end
459
466
You need to be logged in to leave comments. Login now