our $VERSION = '5999.000_005';
use Gruntmaster::Daemon::Constants qw/ERR/;
-use Gruntmaster::Daemon::Format qw/prepare_files stopvms/;
+use Gruntmaster::Daemon::Format qw/prepare_files copy_from_vm stopvms/;
use File::Slurp qw/read_file/;
use File::Temp qw/tempdir/;
use JSON qw/decode_json encode_json/;
use Sys::Hostname qw/hostname/;
- use Time::HiRes qw/time/;
use Try::Tiny;
use Log::Log4perl qw/get_logger/;
$judge = safe_can Judge => judge => $judge;
for my $test (1 .. $testcnt) {
- my $start_time = time;
my $result;
unlink 'result';
try {
}
};
+ my $time = '?';
+ $time = (read_file 'time-stop-prog') - (read_file 'time-start-prog') if -f 'time-stop-prog' && -f 'time-start-prog';
+ unlink 'time-start-prog', 'time-stop-prog';
if (ref $result) {
my $result_text = $result->[1];
+ copy_from_vm 'result';
$result_text .= ': ' . read_file 'result' if -s 'result';
get_logger->trace("Test $test result is " . $result_text);
- push @full_results, {id => $test, result => $result->[0], result_text => $result_text, time => time - $start_time}
+ push @full_results, {id => $test, result => $result->[0], result_text => $result_text, time => $time}
} else {
get_logger->trace("Test $test result is $result");
- push @full_results, {id => $test, result => 0, result_text => $result, time => time - $start_time}
+ push @full_results, {id => $test, result => 0, result_text => $result, time => $time}
}
push @results, $result;
last if $meta->{judge} eq 'Absolute' && ref $result
use List::MoreUtils qw/natatime/;
use Log::Log4perl qw/get_logger/;
use String::ShellQuote qw/shell_quote/;
+ use Time::HiRes qw/time/;
use Try::Tiny;
our $VERSION = '5999.000_005';
-our @EXPORT_OK = qw/prepare_files stopvms/;
+our @EXPORT_OK = qw/copy_from_vm copy_to_vm prepare_files stopvms/;
##################################################
our (%vm, %pid);
+sub copy_from_vm {
+ my ($file) = @_;
+ return unless $ENV{GRUNTMASTER_COPY_FROM_VM};
+ get_logger->trace("Copying $file from VM");
+ system $ENV{GRUNTMASTER_COPY_FROM_VM}, $file
+}
+
+sub copy_to_vm {
+ my ($file) = @_;
+ return unless $ENV{GRUNTMASTER_COPY_TO_VM};
+ get_logger->trace("Copying $file to VM");
+ system $ENV{GRUNTMASTER_COPY_TO_VM}, $file
+}
+
sub runvm {
my ($name, $arg) = @_;
return unless $ENV{GRUNTMASTER_VM};
- my $cmd = $ENV{GRUNTMASTER_VM};
+ my $cmd = $ENV{GRUNTMASTER_VM} . ' ' . $name;
$cmd .= ' ' . $arg if $arg;
get_logger->trace("Starting VM $name ($cmd)");
$vm{$name} = Expect->new;
$vm{$name}->raw_pty(1);
$vm{$name}->log_stdout(0);
$vm{$name}->spawn($cmd);
- $vm{$name}->expect(5, '# ') or get_logger->logdie("Error while starting VM $name: ". $vm{$name}->error);
+ $vm{$name}->expect(50, '# ') or get_logger->logdie("Error while starting VM $name: ". $vm{$name}->error);
+ $vm{$name}->send("rm -rf ~/work/*\n");
+ $vm{$name}->expect(50, '# ')
}
sub stopvms {
- kill KILL => $_->pid for values %vm;
+ $_->hard_close for values %vm;
%vm = %pid = ();
}
if ($vm{$vm}) {
warn "Cannot kill VM\n" if $kill;
- $vm{$vm}->expect(5, '# ');
+ $vm{$vm}->expect(50, '# ');
} else {
kill KILL => $pid{$vm} if $kill;
waitpid $pid{$vm}, 0;
}
+ write_file "time-stop-$vm", time;
return if $kill;
my $er = "exec-result-$vm";
+ copy_from_vm $er;
die "gruntmaster-exec died\n" if -z $er;
my ($excode, $exmsg) = read_file $er;
unlink $er;
sub execlist {
my ($vm, @args) = @_;
+ write_file "time-start-$vm", time;
my $er = "exec-result-$vm";
if ($vm{$vm}) {
my $cmd = ">$er " . shell_quote 'gruntmaster-exec', @args;
my $exmsg = $_->[1];
die "Compile error ($exmsg)\n"
} finally {
+ copy_from_vm 'errors';
$Gruntmaster::Daemon::errors .= read_file 'errors';
$Gruntmaster::Daemon::errors .= "\n" if -s 'errors';
unlink 'errors';
$file->{run} = mkrun($format);
write_file $name, $content;
+ copy_to_vm $name;
if ($ENV{GRUNTMASTER_CCACHE}) {
my $key = lc sha256_hex($content) . '-' . $format;
my $cachefn = "$ENV{GRUNTMASTER_CCACHE}/$key";