X-Git-Url: http://git.ieval.ro/?p=gruntmaster-daemon.git;a=blobdiff_plain;f=lib%2FGruntmaster%2FDaemon.pm;h=b7b6e0616a5192b7076412bed2c54f17da547d53;hp=a8b7b2097fb8ac9aa7946c3a32cfe3f19bd350dd;hb=6555bf80813ccd73357cbd9efa06cbef33230189;hpb=6bf57d234878a4d8ca4f1437ac65d5067087f73a diff --git a/lib/Gruntmaster/Daemon.pm b/lib/Gruntmaster/Daemon.pm index a8b7b20..b7b6e06 100644 --- a/lib/Gruntmaster/Daemon.pm +++ b/lib/Gruntmaster/Daemon.pm @@ -4,7 +4,7 @@ use 5.014000; use strict; use warnings; -our $VERSION = '5999.000_002'; +our $VERSION = '5999.000_003'; use Gruntmaster::Daemon::Constants qw/ERR/; use Gruntmaster::Daemon::Format qw/prepare_files/; @@ -32,7 +32,7 @@ use constant FORMAT_EXTENSION => { ################################################## -my $db = Gruntmaster::Data->connect('dbi:Pg:'); +my $db; my $ua = LWP::UserAgent->new; my @purge_hosts = exists $ENV{PURGE_HOSTS} ? split ' ', $ENV{PURGE_HOSTS} : (); @@ -68,24 +68,28 @@ sub process{ my $meta; our $errors = ''; try { - $meta = { - problem => $jobr->problem->id, - files => { - prog => { - name => 'prog.' . $jobr->extension, - format => $jobr->format, - content => $jobr->source, + if (ref $job) { + $meta = $job; + } else { + $meta = { + problem => $jobr->problem->id, + files => { + prog => { + name => 'prog.' . $jobr->extension, + format => $jobr->format, + content => $jobr->source, + }, }, - }, - map { $_ => $jobr->problem->get_column($_) } qw/generator runner judge testcnt timeout olimit/ - }; - $meta->{tests} = decode_json $jobr->problem->tests if $meta->{runner} eq 'File'; + map { $_ => $jobr->problem->get_column($_) } qw/generator runner judge testcnt timeout olimit/ + }; + $meta->{tests} = decode_json $jobr->problem->tests if $meta->{runner} eq 'File'; - $meta->{files}{ver} = { - name => 'ver.' . FORMAT_EXTENSION->{$jobr->problem->verformat}, - format => $jobr->problem->verformat, - content => $jobr->problem->versource, - } if $jobr->problem->verformat; + $meta->{files}{ver} = { + name => 'ver.' . FORMAT_EXTENSION->{$jobr->problem->verformat}, + format => $jobr->problem->verformat, + content => $jobr->problem->versource, + } if $jobr->problem->verformat; + } prepare_files $meta; chomp $errors; @@ -123,6 +127,7 @@ sub process{ my %results = $judge->(@results); $meta->{$_} = $results{$_} for keys %results; + $meta->{results} = \@full_results } catch { s,(.*) at .*,$1,; chomp; @@ -131,15 +136,16 @@ sub process{ }; get_logger->info("Job result: " . $meta->{result_text}); + return unless $jobr; $jobr->update({ result => $meta->{result}, result_text => $meta->{result_text}, - results => encode_json \@full_results, + ($meta->{results} ? (results => encode_json $meta->{results}) : ()), $errors ? (errors => $errors) : () }); my $log = $jobr->contest ? 'ct/' . $jobr->contest->id . '/log' : 'log'; - my $page = ($job + PAGE_SIZE - 1) / PAGE_SIZE; + my $page = int (($job + PAGE_SIZE - 1) / PAGE_SIZE); purge "/$log/$job"; purge "/$log/"; @@ -164,6 +170,7 @@ sub got_job{ } sub run{ + $db = Gruntmaster::Data->connect('dbi:Pg:'); Log::Log4perl->init('/etc/gruntmasterd/gruntmasterd-log.conf'); get_logger->info("gruntmasterd $VERSION started"); chdir tempdir 'gruntmasterd.XXXX', CLEANUP => 1, TMPDIR => 1;