Distinguish between permanent evaluation errors and transient input errors

Fixes #112.
This commit is contained in:
Eelco Dolstra 2013-09-25 16:21:16 +02:00
parent e1c9e28589
commit d46ebeea99
6 changed files with 31 additions and 15 deletions

View file

@ -88,10 +88,7 @@ sub fetchInputBuild {
{ order_by => "me.id DESC", rows => 1
, where => \ attrsToSQL($attrs, "me.id") });
if (!defined $prevBuild || !isValidPath(getMainOutput($prevBuild)->path)) {
print STDERR "input `", $name, "': no previous build available\n";
return ();
}
return () if !defined $prevBuild || !isValidPath(getMainOutput($prevBuild)->path);
#print STDERR "input `", $name, "': using build ", $prevBuild->id, "\n";

View file

@ -124,6 +124,11 @@ __PACKAGE__->table("Jobsets");
default_value: 100
is_nullable: 0
=head2 fetcherrormsg
data_type: 'text'
is_nullable: 1
=cut
__PACKAGE__->add_columns(
@ -159,6 +164,8 @@ __PACKAGE__->add_columns(
{ data_type => "integer", default_value => 300, is_nullable => 0 },
"schedulingshares",
{ data_type => "integer", default_value => 100, is_nullable => 0 },
"fetcherrormsg",
{ data_type => "text", is_nullable => 1 },
);
=head1 PRIMARY KEY
@ -280,7 +287,7 @@ __PACKAGE__->belongs_to(
);
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-09-20 12:15:23
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:pD6tGW0Ob3fuA1p0uQnBWw
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-09-25 14:10:28
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:cAZ4+c7OhqGW8ATru8Foiw
1;

View file

@ -43,7 +43,7 @@
<ul class="nav nav-tabs">
<li class="active"><a href="#tabs-evaluations" data-toggle="tab">Evaluations</a></li>
[% IF jobset.errormsg %]
[% IF jobset.errormsg || jobset.fetcherrormsg %]
<li><a href="#tabs-errors" data-toggle="tab"><span class="text-warning">Evaluation errors</span></a></li>
[% END %]
<li><a href="#tabs-jobs" data-toggle="tab">Jobs</a></li>
@ -59,7 +59,7 @@
<th>Last checked:</th>
<td>
[% IF jobset.lastcheckedtime %]
[% INCLUDE renderDateTime timestamp = jobset.lastcheckedtime %], [% IF jobset.errormsg %]<em class="text-warning">with errors!</em>[% ELSE %]<em>no errors</em>[% END %]
[% INCLUDE renderDateTime timestamp = jobset.lastcheckedtime %], [% IF jobset.errormsg || jobset.fetcherrormsg %]<em class="text-warning">with errors!</em>[% ELSE %]<em>no errors</em>[% END %]
[% ELSE %]
<em>never</em>
[% END %]
@ -91,10 +91,10 @@
</div>
[% IF jobset.errormsg %]
[% IF jobset.errormsg || jobset.fetcherrormsg %]
<div id="tabs-errors" class="tab-pane">
<p>Errors occurred at [% INCLUDE renderDateTime timestamp=jobset.errortime %].</p>
<pre class="alert alert-error">[% HTML.escape(jobset.errormsg) %]</pre>
<pre class="alert alert-error">[% HTML.escape(jobset.fetcherrormsg || jobset.errormsg) %]</pre>
</div>
[% END %]

View file

@ -46,7 +46,7 @@ sub setJobsetError {
eval {
txn_do($db, sub {
$jobset->update({errormsg => $errorMsg, errortime => time});
$jobset->update({ errormsg => $errorMsg, errortime => time, fetcherrormsg => undef });
});
};
if ($errorMsg ne $prevError) {
@ -115,7 +115,17 @@ sub checkJobsetWrapped {
# Fetch all values for all inputs.
my $checkoutStart = time;
eval {
fetchInputs($project, $jobset, $inputInfo);
};
if ($@) {
my $msg = $@;
print STDERR $msg;
txn_do($db, sub {
$jobset->update({ lastcheckedtime => time, fetcherrormsg => $msg });
});
return;
}
my $checkoutStop = time;
# Hash the arguments to hydra-eval-jobs and check the
@ -127,7 +137,7 @@ sub checkJobsetWrapped {
if (defined $prevEval && $prevEval->hash eq $argsHash) {
print STDERR " jobset is unchanged, skipping\n";
txn_do($db, sub {
$jobset->update({lastcheckedtime => time});
$jobset->update({ lastcheckedtime => time, fetcherrormsg => undef });
});
return;
}
@ -253,7 +263,7 @@ sub checkJobsetWrapped {
}
$msg .=
($error->{location} ne "" ? "in job $error->{location}" : "at top-level") .
" [$bindings]:\n" . $error->{msg} . "\n\n";
":\n" . $error->{msg} . "\n\n";
}
setJobsetError($jobset, $msg);
}
@ -275,7 +285,7 @@ sub checkJobset {
if ($@) {
my $msg = $@;
print STDERR "error evaluating jobset ", $jobset->name, ": $msg";
print STDERR $msg;
txn_do($db, sub {
$jobset->update({lastcheckedtime => time});
setJobsetError($jobset, $msg);

View file

@ -62,6 +62,7 @@ create table Jobsets (
keepnr integer not null default 3,
checkInterval integer not null default 300, -- minimum time in seconds between polls (0 = disable polling)
schedulingShares integer not null default 100,
fetchErrorMsg text,
primary key (project, name),
foreign key (project) references Projects(name) on delete cascade on update cascade
#ifdef SQLITE

1
src/sql/upgrade-22.sql Normal file
View file

@ -0,0 +1 @@
alter table Jobsets add column fetchErrorMsg text;