From 7c1465944fb0c895ee0fcfeed6d0b67f5e94f2b3 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 6 Feb 2009 14:17:25 +0000 Subject: [PATCH] * Keep the most recent builds for each job. --- src/Hydra/script/hydra_update_gc_roots.pl | 62 ++++++++++++++++------- src/Hydra/sql/hydra.sql | 1 + 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/Hydra/script/hydra_update_gc_roots.pl b/src/Hydra/script/hydra_update_gc_roots.pl index b6c9cd83..0fd020b3 100755 --- a/src/Hydra/script/hydra_update_gc_roots.pl +++ b/src/Hydra/script/hydra_update_gc_roots.pl @@ -5,6 +5,7 @@ use File::Path; use File::Basename; use Hydra::Schema; use Hydra::Helper::Nix; +use POSIX qw(strftime); my $db = openHydraDB; @@ -16,40 +17,67 @@ my %roots; sub registerRoot { my ($path) = @_; - print "$path\n"; + #print "$path\n"; mkpath($gcRootsDir) if !-e $gcRootsDir; my $link = "$gcRootsDir/" . basename $path; - if (!-e $link) { + if (!-l $link) { symlink($path, $link) - or die "cannot creating symlink in $gcRootsDir to $path"; + or die "cannot create symlink in $gcRootsDir to $path"; } $roots{$path} = 1; } -# Determine which builds to keep automatically. -my %pathsToKeep; - -# TODO - - -# For finished builds, we only keep the output path, not the derivation. -foreach my $build ($db->resultset('Builds')->search({finished => 1, buildStatus => 0}, {join => 'resultInfo'})) { - if ($build->resultInfo->keep || defined $pathsToKeep{$build->outpath}) { - if (isValidPath($build->outpath)) { - registerRoot $build->outpath; - } else { - print STDERR "warning: output ", $build->outpath, " has disappeared\n"; - } +sub keepBuild { + my ($build) = @_; + print "keeping build ", $build->id, " (", + strftime("%Y-%m-%d %H:%M:%S", localtime($build->timestamp)), ")\n"; + if (isValidPath($build->outpath)) { + registerRoot $build->outpath; + } else { + print STDERR "warning: output ", $build->outpath, " has disappeared\n"; } } +# Go over all jobs in all projects. + +foreach my $project ($db->resultset('Projects')->all) { + + foreach my $job ($project->builds->search({}, + {select => [{distinct => 'attrname'}], as => ['attrname']})) + { + print "*** looking for builds to keep in ", $project->name, ":", $job->attrname, "\n"; + + # Keep the N most recent successful builds for each job and + # platform. + my @recentBuilds = $project->builds->search( + { attrname => $job->attrname + , finished => 1 + , buildStatus => 0 # == success + }, + { join => 'resultInfo' + , order_by => 'timestamp DESC' + , rows => 3 # !!! should make this configurable + }); + + keepBuild $_ foreach @recentBuilds; + } +} + + +# Keep all builds that have been marked as "keep". +print "*** looking for kept builds\n"; +my @buildsToKeep = $db->resultset('Builds')->search({finished => 1, keep => 1}, {join => 'resultInfo'}); +keepBuild $_ foreach @buildsToKeep; + + # For scheduled builds, we register the derivation as a GC root. +print "*** looking for scheduled builds\n"; foreach my $build ($db->resultset('Builds')->search({finished => 0}, {join => 'schedulingInfo'})) { if (isValidPath($build->drvpath)) { registerRoot $build->drvpath; diff --git a/src/Hydra/sql/hydra.sql b/src/Hydra/sql/hydra.sql index 8164fc57..441fc86c 100644 --- a/src/Hydra/sql/hydra.sql +++ b/src/Hydra/sql/hydra.sql @@ -340,6 +340,7 @@ create trigger cascadeReleaseSetUpdate create table ReleaseSetJobs ( project text not null, + -- !!! urgh: "release" is a reserved keyword in sqlite >= 3.6.8! release text not null, job text not null,