Skip to content

Commit

Permalink
[backend] chunk binaryversion requests when querying a remote server
Browse files Browse the repository at this point in the history
Those requests can get very big for package builds, and many remote
servers cannot deal with overlong GET requests.
  • Loading branch information
mlschroe committed Jun 25, 2020
1 parent 6171eeb commit ae77dd4
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
35 changes: 35 additions & 0 deletions src/backend/BSSrcServer/Remote.pm
Original file line number Diff line number Diff line change
Expand Up @@ -684,6 +684,41 @@ sub getremotebinaryversions {
return $binaryversions;
}

sub getpackagebinaryversionlist {
my ($proj, $projid, $repoid, $arch, $packages, $view) = @_;
my $xmldtd = $view eq 'binarychecksums' ? $BSXML::packagebinarychecksums : $BSXML::packagebinaryversionlist;
my $elname = $view eq 'binarychecksums' ? 'binarychecksums' : 'binaryversionlist';
my $jev = $BSServerEvents::gev;
my $binaryversionlist;
$binaryversionlist = $jev->{'binaryversionlist'} if $BSStdServer::isajax;
$binaryversionlist ||= {};
$jev->{'binaryversionlist'} = $binaryversionlist if $BSStdServer::isajax;
my @missing = grep {!exists $binaryversionlist->{$_}} @$packages;
while (@missing) {
# chunk it
my $chunkl = 0;
for (splice @missing) {
$chunkl += 9 + length($_);
last if @missing && $chunkl > 1900;
push @missing, $_;
}
my $param = {
'uri' => "$proj->{'remoteurl'}/build/$proj->{'remoteproject'}/$repoid/$arch",
'proxy' => $proj->{'remoteproxy'},
};
my @args = ("view=$view");
push @args, map {"package=$_"} @missing;
my $pbvl = BSWatcher::rpc($param, $xmldtd, @args);
return undef if $BSStdServer::isajax && !$pbvl;
for (@{$pbvl->{$elname} || []}) {
$binaryversionlist->{$_->{'package'}} = $_;
}
$binaryversionlist->{$_} ||= undef for @missing;
@missing = grep {!exists $binaryversionlist->{$_}} @$packages;
}
return { $elname => [ map {$binaryversionlist->{$_}} grep {$binaryversionlist->{$_}} @$packages ] };
}

sub clean_random_cache_slot {
my $slot = sprintf("%02x", (int(rand(256))));
print "cleaning slot $slot\n";
Expand Down
8 changes: 8 additions & 0 deletions src/backend/bs_srcserver
Original file line number Diff line number Diff line change
Expand Up @@ -4098,6 +4098,14 @@ sub getpackagelist_build {
if (!$BSStdServer::isajax) {
BSHandoff::handoff("/build/$projid/$repoid/$arch", undef, @args);
}
if (@{$cgi->{'package'} || []} && ($view eq 'binaryversions' || $view eq 'binaryversionscode')) {
my $pbvl = BSSrcServer::Remote::getpackagebinaryversionlist($proj, $projid, $repoid, $arch, $cgi->{'package'}, $view);
return ($pbvl, $BSXML::packagebinaryversionlist);
}
if (@{$cgi->{'package'} || []} && $view eq 'binarychecksums') {
my $pbc = BSSrcServer::Remote::getpackagebinaryversionlist($proj, $projid, $repoid, $arch, $cgi->{'package'}, $view);
return ($pbc, $BSXML::packagebinarychecksums);
}
$param->{'uri'} = "$proj->{'remoteurl'}/build/$proj->{'remoteproject'}/$repoid/$arch";
$param->{'proxy'} = $proxy;
}
Expand Down

0 comments on commit ae77dd4

Please sign in to comment.