From 18e3fd016d46b5b200f81a012b7829d101e85bc6 Mon Sep 17 00:00:00 2001 From: Florent Villard Date: Thu, 20 Apr 2006 07:17:30 +0000 Subject: add a global status file to log; dump the temporary cache even if the main lock fails --- iurt2 | 94 +++++++++++++++++++++++++++++++++++++++++++++---------------------- 1 file 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; -- cgit v1.2.1