hydra-update-gc-roots: Keep derivations of failed builds

By keeping the derivations of failed builds in the most recent
evaluations, we ensure that failed builds can be restarted.
This commit is contained in:
Eelco Dolstra 2014-04-08 17:54:11 +02:00
parent 4aa01e021e
commit 4cf0d7c4b3

View file

@ -21,22 +21,24 @@ sub addRoot {
} }
my @columns = ( "id", "project", "jobset", "job", "system", "finished", "drvpath", "timestamp" ); my @columns = ( "id", "project", "jobset", "job", "system", "finished", "drvpath", "timestamp", "buildstatus" );
sub keepBuild { sub keepBuild {
my ($build) = @_; my ($build, $keepFailedDrvs) = @_;
print STDERR " keeping ", ($build->finished ? "" : "scheduled "), "build ", $build->id, " (", print STDERR " keeping ", ($build->finished ? "" : "scheduled "), "build ", $build->id, " (",
$build->get_column('project'), ":", $build->get_column('jobset'), ":", $build->get_column('job'), "; ", $build->get_column('project'), ":", $build->get_column('jobset'), ":", $build->get_column('job'), "; ",
$build->system, "; ", $build->system, "; ",
strftime("%Y-%m-%d %H:%M:%S", localtime($build->timestamp)), ")\n"; strftime("%Y-%m-%d %H:%M:%S", localtime($build->timestamp)), ")\n";
foreach my $out ($build->buildoutputs->all) { if ($build->finished && ($build->buildstatus == 0 || $build->buildstatus == 6)) {
if (isValidPath($out->path)) { foreach my $out ($build->buildoutputs->all) {
addRoot $out->path; if (isValidPath($out->path)) {
} else { addRoot $out->path;
print STDERR " warning: output ", $out->path, " has disappeared\n" if $build->finished; } else {
print STDERR " warning: output ", $out->path, " has disappeared\n" if $build->finished;
}
} }
} }
if (!$build->finished) { if (!$build->finished || ($keepFailedDrvs && $build->buildstatus != 0)) {
if (isValidPath($build->drvpath)) { if (isValidPath($build->drvpath)) {
addRoot $build->drvpath; addRoot $build->drvpath;
} else { } else {
@ -58,12 +60,12 @@ closedir DIR;
# For scheduled builds, we register the derivation as a GC root. # For scheduled builds, we register the derivation as a GC root.
print STDERR "*** looking for scheduled builds\n"; print STDERR "*** looking for scheduled builds\n";
keepBuild $_ foreach $db->resultset('Builds')->search({ finished => 0 }, { columns => [ @columns ] }); keepBuild($_, 0) foreach $db->resultset('Builds')->search({ finished => 0 }, { columns => [ @columns ] });
# Keep every build in every release of every project. # Keep every build in every release of every project.
print STDERR "*** looking for release members\n"; print STDERR "*** looking for release members\n";
keepBuild $_ foreach $db->resultset('Builds')->search_literal( keepBuild($_, 0) foreach $db->resultset('Builds')->search_literal(
"exists (select 1 from releasemembers where build = me.id)", "exists (select 1 from releasemembers where build = me.id)",
{ order_by => ["project", "jobset", "job", "id"], columns => [ @columns ] }); { order_by => ["project", "jobset", "job", "id"], columns => [ @columns ] });
@ -72,7 +74,7 @@ keepBuild $_ foreach $db->resultset('Builds')->search_literal(
print STDERR "*** looking for kept builds\n"; print STDERR "*** looking for kept builds\n";
my @buildsToKeep = $db->resultset('Builds')->search( my @buildsToKeep = $db->resultset('Builds')->search(
{ finished => 1, keep => 1 }, { order_by => ["project", "jobset", "job", "id"], columns => [ @columns ] }); { finished => 1, keep => 1 }, { order_by => ["project", "jobset", "job", "id"], columns => [ @columns ] });
keepBuild $_ foreach @buildsToKeep; keepBuild($_, 0) foreach @buildsToKeep;
# Go over all projects. # Go over all projects.
@ -107,9 +109,8 @@ foreach my $project ($db->resultset('Projects')->search({}, { order_by => ["name
, order_by => "id desc", rows => $keepnr }); , order_by => "id desc", rows => $keepnr });
} }
keepBuild $_ foreach $jobset->builds->search( keepBuild($_, 1) foreach $jobset->builds->search(
{ finished => 1, buildStatus => { -in => [0, 6] } { id => { -in => $db->resultset('JobsetEvalMembers')->search({ eval => { -in => [@evals] } }, { select => "build" })->as_query }
, id => { -in => $db->resultset('JobsetEvalMembers')->search({ eval => { -in => [@evals] } }, { select => "build" })->as_query }
}, },
{ order_by => ["job", "id"], columns => [ @columns ] }); { order_by => ["job", "id"], columns => [ @columns ] });
} }