diff --git a/src/backend/bs_repserver b/src/backend/bs_repserver index a88c777d2f8..3e884d4aec5 100755 --- a/src/backend/bs_repserver +++ b/src/backend/bs_repserver @@ -368,6 +368,23 @@ sub getpackagebinaryversionlist { return ({ 'binaryversionlist' => \@res }, $BSXML::packagebinaryversionlist); } +# the worker thinks that out packagebinaryversionlist contains bogus entries +sub badpackagebinaryversionlist { + my ($cgi, $projid, $repoid, $arch, $packids) = @_; + my $dir = "$reporoot/$projid/$repoid/$arch"; + my $gbininfo = read_gbininfo($dir); + if ($gbininfo) { + $packids = [ sort keys %$gbininfo ] unless $packids; + for my $packid (@$packids) { + unlink("$dir/$packid/.bininfo"); + } + unlink("$dir/:bininfo"); + unlink("$dir/:bininfo.merge"); + forwardevent($cgi, 'scanprjbinaries', $projid, $packids->[0], $repoid, $arch); + } + return $BSStdServer::return_ok; +} + sub getbinaries { my ($cgi, $projid, $repoid, $arch) = @_; my $prp = "$projid/$repoid"; @@ -3440,6 +3457,7 @@ my $dispatches = [ '!worker /getbinaryversions $project $repository $arch binaries: nometa:bool?' => \&getbinaryversions, '!worker /getjobdata $arch $job $jobid:md5' => \&getjobdata, '!worker /getpackagebinaryversionlist $project $repository $arch $package* withcode:bool?' => \&getpackagebinaryversionlist, + '!worker /badpackagebinaryversionlist $project $repository $arch $package*' => \&badpackagebinaryversionlist, '!worker /getpreinstallimageinfos $prpa+ match:?' => \&getpreinstallimageinfos, # published files diff --git a/src/backend/bs_sched b/src/backend/bs_sched index 86c6a3cf301..111b5ea0f21 100755 --- a/src/backend/bs_sched +++ b/src/backend/bs_sched @@ -5391,6 +5391,32 @@ sub event_scanrepo { } } +sub event_scanprjbinaries { + my ($ectx, $ev) = @_; + my $changed_high = $ectx->{'changed_high'}; + my $projid = $ev->{'project'}; + my $repoid = $ev->{'repository'}; + my $packid = $ev->{'package'}; + if (defined($projid) && defined($repoid)) { + my $prp = "$projid/$repoid"; + delete $remotegbininfos{"$prp/$myarch"}; + return if $remoteprojs{$projid}; + if (defined($packid)) { + unlink("$prp/$myarch/$packid/.bininfo"); + } else { + for my $packid (grep {!/^[:\.]/} ls("$prp/$myarch")) { + next if $packid eq '_deltas'; + next unless -d "$prp/$myarch/$packid"; + unlink("$prp/$myarch/$packid/.bininfo"); + } + } + unlink("$reporoot/$prp/$myarch/:bininfo"); + unlink("$reporoot/$prp/$myarch/:bininfo.merge"); + print "reading project binary state of repository $projid/$repoid\n"; + read_gbininfo("$reporoot/$prp/$myarch"); + } +} + sub event_dumprepo { my ($ectx, $ev) = @_; @@ -5556,6 +5582,7 @@ my %event_handlers = ( 'unblocked' => \&event_check_med, 'relsync' => \&event_check_med, 'scanrepo' => \&event_scanrepo, + 'scanprjbinaries' => \&event_scanprjbinaries, 'dumprepo' => \&event_dumprepo, 'wipenotyet' => \&event_wipenotyet, 'wipe' => \&event_wipe, diff --git a/src/backend/bs_worker b/src/backend/bs_worker index 8ab4cc2bdbd..af006ed17c2 100755 --- a/src/backend/bs_worker +++ b/src/backend/bs_worker @@ -1345,6 +1345,16 @@ sub getbinaries_kiwiproduct { unlink("$ddir/$_.new.rpm"); delete $cachenew{"$ddir/$_"}; } + if ($bvl && $server ne $buildinfo->{'srcserver'}) { + # the bvl entry seems to be wrong. tell our server about that. + eval { + BSRPC::rpc({ + 'uri' => "$server/badpackagebinaryversionlist", + 'timeout' => $gettimeout, + }, undef, "project=$projid", "repository=$repoid", "arch=$arch", "package=$packid"); + }; + warn($@) if $@; + } $res = BSRPC::rpc({ 'uri' => "$server/build/$projid/$repoid/$arch/$packid", 'directory' => $ddir,