Skip to content

Commit

Permalink
[backend] speed up changed2lookat by using a new reverse-dependency hash
Browse files Browse the repository at this point in the history
Otherwise having lots of prps slows down the function too much. Creating
the reverse-dependency hash will also take some time, but we do this
only when updating the project data and not when we check a prp.
Found by profiling.
  • Loading branch information
mlschroe committed Mar 11, 2016
1 parent d545a88 commit 45d5c97
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 11 deletions.
35 changes: 25 additions & 10 deletions src/backend/BSSched/Lookat.pm
Expand Up @@ -102,23 +102,38 @@ sub changed2lookat {
my $changed_med = $gctx->{'changed_med'};
my $changed_high = $gctx->{'changed_high'};

# add all changed_high entries to changed_med to make things simpler
for (keys %$changed_high) {
$changed_med->{$_} = $changed_high->{$_} unless ($changed_med->{$_} || 0) == 2;
if (%$changed_high) {
# add all changed_high entries to changed_med to make things simpler
for (keys %$changed_high) {
$changed_med->{$_} = $changed_high->{$_} unless ($changed_med->{$_} || 0) == 2;
}
push @$lookat_high, grep {$changed_high->{$_}} sort keys %$changed_med;
push @$lookat_med, grep {!$changed_high->{$_}} sort keys %$changed_med;
} else {
push @$lookat_med, sort keys %$changed_med;
}
push @$lookat_high, grep {$changed_high->{$_}} sort keys %$changed_med;
push @$lookat_med, grep {!$changed_high->{$_}} sort keys %$changed_med;
@$lookat_high = BSUtil::unify(@$lookat_high);
@$lookat_med = BSUtil::unify(@$lookat_med);
my %lookat_high = map {$_ => 1} @$lookat_high;
@$lookat_med = grep {!$lookat_high{$_}} @$lookat_med;
my $prpdeps = $gctx->{'prpdeps'};
for my $prp (@{$gctx->{'prps'}}) {
if (!$changed_low->{$prp} && !$changed_med->{$prp}) {
next unless grep {$changed_med->{$_}} @{$prpdeps->{$prp}};
}

for my $prp (keys %$changed_low) {
$lookat_next->{$prp} = 1;
}
my $rprpdeps = $gctx->{'rprpdeps'};
for my $prp (keys %$changed_med) {
$lookat_next->{$prp} = 1;
$lookat_next->{$_} = 1 for @{$rprpdeps->{$prp} || []};
}

#my $prpdeps = $gctx->{'prpdeps'};
#for my $prp (@{$gctx->{'prps'}}) {
# if (!$changed_low->{$prp} && !$changed_med->{$prp}) {
# next unless grep {$changed_med->{$_}} @{$prpdeps->{$prp}};
# }
# $lookat_next->{$prp} = 1;
#}

%$changed_low = ();
%$changed_med = ();
%$changed_high = ();
Expand Down
14 changes: 13 additions & 1 deletion src/backend/BSSched/ProjPacks.pm
Expand Up @@ -807,7 +807,7 @@ sub calc_prps {
# map searchpath to internal prp representation
my @sp = map {"$_->{'project'}/$_->{'repository'}"} @searchpath;
$prpsearchpath{$prp} = \@sp;
$prpdeps{"$projid/$repo->{'name'}"} = \@sp;
$prpdeps{$prp} = \@sp;

# Find extra dependencies due to aggregate/kiwi description files
my @xsp;
Expand Down Expand Up @@ -852,12 +852,17 @@ sub calc_prps {
for (@{$prpdeps{$prp}}) {
$prpnoleaf{$_} = 1 if $_ ne $prp;
}
}
# check for inter-repository project dependencies
for my $prp (keys %myprps) {
$haveinterrepodep{$projid} = 1 if grep {$myprps{$_} && $_ ne $prp} @{$prpdeps{$prp}};
}
}
# good bye no longer used entries!
delete $newchanneldata{''};
%{$gctx->{'channeldata'}} = %newchanneldata;

# print statistics
print "have ".scalar(keys %newchanneldata)." unique channel configs\n" if %newchanneldata;
print "have ".scalar(keys %haveinterrepodep)." inter-repo dependencies\n" if %haveinterrepodep;

Expand All @@ -869,9 +874,16 @@ sub calc_prps {
print "cycle: ".join(' -> ', @$_)."\n" for @cycs;
}

# create reverse deps to speed up changed2lookat
my %rprpdeps;
for my $prp (keys %prpdeps) {
push @{$rprpdeps{$_}}, $prp for @{$prpdeps{$prp}};
}

$gctx->{'prps'} = \@prps;
$gctx->{'prpsearchpath'} = \%prpsearchpath;
$gctx->{'prpdeps'} = \%prpdeps;
$gctx->{'rprpdeps'} = \%rprpdeps;
$gctx->{'prpnoleaf'} = \%prpnoleaf;
$gctx->{'haveinterrepodep'} = \%haveinterrepodep;
}
Expand Down
1 change: 1 addition & 0 deletions src/backend/bs_sched
Expand Up @@ -422,6 +422,7 @@ my $gctx = {
'projpacks_linked' => {}, # data of all linked sources
'prps' => [], # sorted list of all local prps (project repos)
'prpdeps' => {}, # searchpath plus aggregate deps plus kiwi deps
'rprpdeps' => {}, # reverse prpdeps
# maps prp => [ prp, prp ... ], used for sorting
'prpnoleaf' => {}, # is this prp referenced by another prp?
'prpsearchpath' => {}, # which prps to use for building
Expand Down

0 comments on commit 45d5c97

Please sign in to comment.