aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorent Villard <warly@mandriva.com>2006-04-20 07:17:30 +0000
committerFlorent Villard <warly@mandriva.com>2006-04-20 07:17:30 +0000
commit18e3fd016d46b5b200f81a012b7829d101e85bc6 (patch)
tree42e1b7dc4fda2e595fbc0ecd488c6ddf517791bb
parent4619e85ad896c287e12c3873d355ab28169977c8 (diff)
downloadiurt-18e3fd016d46b5b200f81a012b7829d101e85bc6.tar
iurt-18e3fd016d46b5b200f81a012b7829d101e85bc6.tar.gz
iurt-18e3fd016d46b5b200f81a012b7829d101e85bc6.tar.bz2
iurt-18e3fd016d46b5b200f81a012b7829d101e85bc6.tar.xz
iurt-18e3fd016d46b5b200f81a012b7829d101e85bc6.zip
add a global status file to log; dump the temporary cache even if the main lock fails
-rwxr-xr-xiurt294
1 files changed, 63 insertions, 31 deletions
diff --git a/iurt2 b/iurt2
index 6be6b67..d058595 100755
--- a/iurt2
+++ b/iurt2
@@ -372,6 +372,7 @@ my $done;
my $home = $config->{local_home};
my $union_id = 1;
my $unionfs_tmp = $run{unionfs};
+my $chroot_tmp = "$chroot.$run{run}";
foreach (my $i ; $i < @{$run{todo}}; $i++) {
my ($dir, $srpm) = @{$run{todo}[$i]};
$done{$srpm} and next;
@@ -383,7 +384,7 @@ foreach (my $i ; $i < @{$run{todo}}; $i++) {
print {$run{LOG}} "iurt: packages $srpm [$done/$to_compile]\n";
# FIXME unfortunately urpmi stalls quite often
retry:
- my $match = "urpmi $urpmi_options --root $chroot";
+ my $match = "urpmi $urpmi_options --root $chroot_tmp";
if (!clean_process($match, $run{verbose})) {
dump_cache(\%run);
die "FATAL iurt: Could not have urpmi working !"
@@ -400,23 +401,23 @@ retry:
# we cannont just rm -rf $tmpfs, this create defunct processes afterwards (and lock particularly hard the urpmi database)
$union_id = clean_unionfs($unionfs_dir, $run{run}, $union_id);
$tmpfs = "$unionfs_dir/tmpfs.$run{run}.$union_id";
- $chroot = "$unionfs_dir/unionfs.$run{run}.$union_id";
+ $chroot_tmp = "$unionfs_dir/unionfs.$run{run}.$union_id";
mkdir $tmpfs or die "Could not create $tmpfs ($!)";
- mkdir $chroot or die "Could not create $chroot ($!)";
+ mkdir $chroot_tmp or die "Could not create $chroot_tmp ($!)";
if ($cache->{no_unionfs}{$srpm}) {
$unionfs_tmp = 0;
- clean_chroot($chroot, \%run)
+ clean_chroot($chroot_tmp, \%run)
} else {
# if the previous package has been built without unionfs, chroot need to be cleaned
- clean_chroot($chroot, \%run) if !$unionfs_tmp;
+ clean_chroot($chroot_tmp, \%run) if !$unionfs_tmp;
$unionfs_tmp = 1;
system(qq{sudo mount -t tmpfs none $tmpfs &>/dev/null}) and die "FATAL iurt: could not mount $tmpfs ($!)";
- system(qq|sudo mount -o dirs=$tmpfs=rw:$home/chroot_$run{distro_tag}$debug_tag=ro -t unionfs none $chroot &>/dev/null|) and die "FATAL iurt: could not mount $tmpfs and $home/chroot_$run{distro_tag}$debug_tag with unionfs ($!)";
- system("sudo mount -t proc none $chroot/proc &>/dev/null") and die "FATAL iurt: could not mount /proc in the chroot $chroot.";
+ system(qq|sudo mount -o dirs=$tmpfs=rw:$home/chroot_$run{distro_tag}$debug_tag=ro -t unionfs none $chroot_tmp &>/dev/null|) and die "FATAL iurt: could not mount $tmpfs and $home/chroot_$run{distro_tag}$debug_tag with unionfs ($!)";
+ system("sudo mount -t proc none $chroot_tmp/proc &>/dev/null") and die "FATAL iurt: could not mount /proc in the chroot $chroot_tmp.";
}
} else {
- print {$run{LOG}} "iurt: installing a new chroot for $srpm in $chroot\n" if $run{verbose} > 1;
- clean_chroot($chroot, \%run)
+ print {$run{LOG}} "iurt: installing a new chroot for $srpm in $chroot_tmp\n" if $run{verbose} > 1;
+ clean_chroot($chroot_tmp, \%run)
}
my ($srpm_name) = $srpm =~ /(.*)-[^-]+-[^-]+\.src\.rpm$/ or next;
my ($maintainer, $cc);
@@ -432,28 +433,28 @@ retry:
#($maintainer, $cc) = ($config->{admin},'');
# recreate a new srpm for buildarch condition in the spec file
- print {$run{LOG}} "Copying $srpm to $chroot\n" if $run{verbose} > 1;
- perform_command("sudo cp $dir/$srpm $chroot/home/builder/rpm/SRPMS/",
+ print {$run{LOG}} "Copying $srpm to $chroot_tmp\n" if $run{verbose} > 1;
+ perform_command("sudo cp $dir/$srpm $chroot_tmp/home/builder/rpm/SRPMS/",
\%run, $config,
mail => $config->{admin},
- error => "[REBUILD] cannot copy $srpm to $chroot",
+ error => "[REBUILD] cannot copy $srpm to $chroot_tmp",
debug_mail => $run{debug},
hash => "copy_$srpm") or next;
- perform_command(qq{sudo chroot $chroot su builder -c "rpm -i /home/builder/rpm/SRPMS/$srpm"},
+ perform_command(qq{sudo chroot $chroot_tmp su builder -c "rpm -i /home/builder/rpm/SRPMS/$srpm"},
\%run, $config,
mail => $config->{admin},
- error => "[REBUILD] cannot install $srpm in $chroot",
+ error => "[REBUILD] cannot install $srpm in $chroot_tmp",
debug_mail => $run{debug},
hash => "install_$srpm") or next;
- perform_command(qq{sudo chroot $chroot su builder -c "rpm --nodeps -bs /home/builder/rpm/SPECS/*.spec"},
+ perform_command(qq{sudo chroot $chroot_tmp su builder -c "rpm --nodeps -bs /home/builder/rpm/SPECS/*.spec"},
\%run, $config,
mail => $config->{admin},
- error => "[REBUILD] cannot create $srpm in $chroot",
+ error => "[REBUILD] cannot create $srpm in $chroot_tmp",
debug_mail => $run{debug},
hash => "create_$srpm") or next;
print {$run{LOG}} "Installing build dependencies of $srpm...\n" if $run{verbose} > 1;
- perform_command("sudo urpmi $urpmi_options --root $chroot $chroot/home/builder/rpm/SRPMS/$srpm",
+ if (!perform_command("sudo urpmi $urpmi_options --root $chroot_tmp $chroot_tmp/home/builder/rpm/SRPMS/$srpm",
\%run, $config,
mail => $config->{admin},
error => "[REBUILD] install of build dependencies of $srpm failed on $run{my_arch}",
@@ -488,13 +489,16 @@ retry:
push @{$cache->{needed}{$srpm}}, [ $missing_deps, $version, $other_maint || $maintainer ];
}
},
- ) or next;
+ )) {
+ $run{status}{$srpm} = 'install_deps_failure';
+ next
+ }
# try to workarround the rpm -qa db4 error(2) from dbcursor->c_get: No such file or directory
# running rpm -qa several time seems to fix the problem
foreach (1 .. 3) {
- system("sudo chroot $chroot rpm -qa &> /dev/null")
+ system("sudo chroot $chroot_tmp rpm -qa &> /dev/null")
}
- perform_command("sudo chroot $chroot rpm -qa",
+ perform_command("sudo chroot $chroot_tmp rpm -qa",
\%run, $config,
hash => "rpm_qa_$srpm",
timeout => 60,
@@ -505,7 +509,7 @@ retry:
if ($run{stop}) {
$command = "rpm -b$run{stop} /home/builder/rpm/SPECS/*.spec"
}
- if (!perform_command(qq{TMP=/home/builder/tmp/ sudo chroot $chroot /bin/su builder -c "$command"},
+ if (!perform_command(qq{TMP=/home/builder/tmp/ sudo chroot $chroot_tmp /bin/su builder -c "$command"},
\%run, $config,
mail => $maintainer,
error => "[REBUILD] $srpm from $run{distro_tag} does not build correctly on $run{my_arch}",
@@ -519,7 +523,7 @@ retry:
callback => sub {
my ($opt, $output) = @_;
if ($run{stop}) {
- exec "sudo chroot $chroot /bin/su builder -c bash"
+ exec "sudo chroot $chroot_tmp /bin/su builder -c bash"
}
print {$run{LOG}} "iurt: calling callback for $opt->{hash}\n" if $run{debug};
if ($unionfs_tmp && $output =~ /no space left on device/i) {
@@ -532,7 +536,7 @@ retry:
return 1
}
},
- freq => 1) && !glob "$chroot/home/builder/rpm/RPMS/*/*.rpm") {
+ freq => 1) && !glob "$chroot_tmp/home/builder/rpm/RPMS/*/*.rpm") {
# FIXME
# The simple algo used here is :
# try to compile it with unionfs, if it runs out of space, compile it without the next time
@@ -546,8 +550,10 @@ retry:
# plus). Or to keep the faulty package a unionfs exception for some time, to save some more extra builds.
#
if (!$unionfs_tmp) {
+ $run{status}{$srpm} = 'build_failure';
$cache->{failure}{$srpm} = 1
} elsif (!$cache->{no_unionfs}{$srpm}) {
+ $run{status}{$srpm} = 'build_failure';
$cache->{failure}{$srpm} = 1
} else {
goto retry
@@ -556,7 +562,7 @@ retry:
}
# do some cleaning if the compilation is successful
delete $cache->{needed}{$srpm} if defined $cache->{needed}{$srpm};
- if (!perform_command("sudo urpmi $urpmi_options --root $chroot $chroot/home/builder/rpm/RPMS/*/*.rpm",
+ if (!perform_command("sudo urpmi $urpmi_options --root $chroot_tmp $chroot_tmp/home/builder/rpm/RPMS/*/*.rpm",
\%run, $config,
mail => $maintainer,
error => "[REBUILD] binaries packages generated from $srpm do not install correctly",
@@ -568,6 +574,7 @@ retry:
error_regexp => 'unable to access',
log => "$local_spool/log/$srpm/")) {
$cache->{failure}{$srpm} = 1;
+ $run{status}{$srpm} = 'binary_test_failure';
next
}
if ($run{debug}) {
@@ -575,9 +582,10 @@ retry:
exit
} else {
print {$run{LOG}} "iurt: build successful, copying packages to $local_spool.\n";
- system("cp $chroot/home/builder/rpm/RPMS/*/*.rpm $local_spool &>/dev/null") and print {$run{LOG}} "ERROR: could not copy rpm files from $chroot/home/builder/rpm/RPMS/ to $local_spool ($!)\n";
+ $run{status}{$srpm} = 'ok';
+ system("cp $chroot_tmp/home/builder/rpm/RPMS/*/*.rpm $local_spool &>/dev/null") and print {$run{LOG}} "ERROR: could not copy rpm files from $chroot_tmp/home/builder/rpm/RPMS/ to $local_spool ($!)\n";
if ($run{copy_srpm}) {
- system("cp $chroot/home/builder/rpm/SRPMS/$srpm $local_spool &>/dev/null") and print {$run{LOG}} "ERROR: could not copy $srpm from $chroot/home/builder/rpm/SRPMS/ to $local_spool ($!)\n";
+ system("cp $chroot_tmp/home/builder/rpm/SRPMS/$srpm $local_spool &>/dev/null") and print {$run{LOG}} "ERROR: could not copy $srpm from $chroot_tmp/home/builder/rpm/SRPMS/ to $local_spool ($!)\n";
}
process_queue($config, \%run, \@wrong_rpm, 1)
}
@@ -595,6 +603,20 @@ if (open my $file, ">$local_spool/log/wrong_srpm_names.log") {
foreach (@wrong_rpm) {
print $file "$_->[1] -> $_->[0] (", $cache->{rpm_srpm}{$_->[1]},")\n";
}
+ close $file
+}
+
+if (open my $file, ">$local_spool/log/status.$run{media}.log") {
+ foreach my $srpm (keys %{$run{status}}) {
+ print $file "$srpm: ";
+ if ($run{status}{$srpm}) {
+ print $file $run{status}{$srpm}
+ } else {
+ print $file "unknown"
+ }
+ print $file "\n"
+ }
+ close $file
}
if ($config->{rsync_to} && !$run{no_rsync}) {
@@ -806,7 +828,6 @@ sub dump_cache {
# but the idea is more to have a global parrallel build than several local ones.
return if $run->{debug} || !$run->{use_cache};
open my $file, ">$filename.tmp.$daydate" or die "FATAL iurt dump_cache: cannot open $filename.tmp";
- if (flock($file,LOCK_EX)) {
#seek($file, 0, 2);
if ($run{concurrent_run}) {
print {$run{log}} "iurt: merging cache";
@@ -825,11 +846,12 @@ sub dump_cache {
$Data::Dumper::Indent = 1;
$Data::Dumper::Terse = 1;
print $file Data::Dumper->Dump([ $cache ], [ "cache" ]);
+ if (flock($file,LOCK_EX)) {
unlink $filename;
link "$filename.tmp.$daydate", $filename;
flock($file,LOCK_UN)
} else {
- print {$run{LOG}} "iurt: dumping_cache failed (could not lock cache file $cachefile $!)";
+ print {$run{LOG}} "iurt: dumping_cache failed (could not lock cache file $cachefile $!)";
}
}
@@ -1114,6 +1136,7 @@ sub check_media {
my ($rarch, $srpm) = update_srpm($rpms_dir, $rpm, $wrong_rpm);
$rarch or next;
$cache->{queue}{$srpm} = 1;
+ $run{status}{$srpm} = 'ok';
check_version($srpm)
}
closedir $rpmdir;
@@ -1164,13 +1187,22 @@ sub search_packages {
$srpm = $1
}
$srpm =~ /(.*)-[^-]+-[^-]+\.src\.rpm$/ or next;
+ $run->{status}{$srpm} ||= 0;
if ($config->{unwanted_packages} && $srpm =~ /$config->{unwanted_packages}/) { next }
my $ok = 1;
if (check_version($srpm)) {
- defined $cache->{failure}{$srpm} and next;
- if (!$cache->{queue}{$srpm} && check_needed($srpm)) {
+ if (defined $cache->{failure}{$srpm}) {
+ $run->{status}{$srpm} = 'build_failure';
+ next
+ }
+ my $check_needed = check_needed($srpm);
+ $run->{status}{$srpm} = 'missing_buildrequires' if !$check_needed;
+ if (!$cache->{queue}{$srpm} && $check_needed) {
my $hdr = rpm2header("$dir/$srpm");
- check_arch($hdr) or next;
+ if (!check_arch($hdr)) {
+ $run->{status}{$srpm} = 'not_on_this_arch';
+ next
+ }
my $changelog = $hdr->queryformat("%{CHANGELOGNAME}");
my ($mail) = $changelog =~ /<(.*@.*)>/;
$maint{$srpm} = $mail;