Fix extreme slowness in hydra-queue-runner

[?]
Oct 11, 2013, 8:46 AM
ZZYTUBG2HVWNYS5P3FHKK5L5CYN4ZVXPSUE36A27KPHOL6UPJHEAC

Dependencies

  • [2] X3YLTWJA hydra-queue-runner: Cache the lookup of time spent per jobset
  • [3] TPSCSZKX Speed up findBuildDependencyInQueue
  • [4] OV7F5M3E Merge branch 'queue-17'
  • [5] YEXD7CBK Fix findBuildDependencyInQueue
  • [6] GEADFVZ5 hydra-queue-runner: Improved scheduling
  • [*] 7YBYT2LQ
  • [*] 7DWCXNC7 Use the new Nix Perl bindings
  • [*] DTXTS7LN * Speed up findBuildDependencyInQueue by doing only one SQL query for
  • [*] DQD7JMSU * Fix the terminology.

Change contents

  • edit in src/script/hydra-queue-runner at line 12
    [9.420]
    [8.7878]
    use Set::Scalar;
  • replacement in src/script/hydra-queue-runner at line 56
    [3.65][3.65:184]()
    my $b = $buildsByDrv->{$d};
    next unless defined $b;
    return $db->resultset('Builds')->find($b);
    [3.65]
    [3.184]
    my $bs = $buildsByDrv->{$d};
    next unless defined $bs;
    return $db->resultset('Builds')->find((@$bs)[0]);
  • edit in src/script/hydra-queue-runner at line 64
    [10.369]
    [11.451]
    sub blockBuilds {
    my ($buildsByDrv, $blockedBuilds, $build) = @_;
    my @rdeps = grep { /\.drv$/ && $_ ne $build->drvpath } computeFSClosure(1, 0, $build->drvpath);
    foreach my $drv (@rdeps) {
    my $bs = $buildsByDrv->{$drv};
    next if !defined $bs;
    $blockedBuilds->insert($_) foreach @$bs;
    }
    }
  • replacement in src/script/hydra-queue-runner at line 95
    [3.334][3.334:379](),[3.379][3.3198:3296]()
    $buildsByDrv->{$_->drvpath} = $_->id
    foreach $db->resultset('Builds')->search({ finished => 0 }, { join => ['project'] });
    [3.334]
    [3.491]
    push @{$buildsByDrv->{$_->drvpath}}, $_->id
    foreach $db->resultset('Builds')->search({ finished => 0 });
    # Builds in the queue of which a dependency is already building.
    my $blockedBuilds = Set::Scalar->new();
    blockBuilds($buildsByDrv, $blockedBuilds, $_)
    foreach $db->resultset('Builds')->search({ finished => 0, busy => 1 });
  • edit in src/script/hydra-queue-runner at line 182
    [3.5931]
    [3.5931]
    next if $blockedBuilds->has($build->id);
  • edit in src/script/hydra-queue-runner at line 209
    [2.1259]
    [3.7220]
    blockBuilds($buildsByDrv, $blockedBuilds, $build);