Skip to content

Commit

Permalink
[backend] BSRunner: do not wait 10 seconds between jobs if we ran int…
Browse files Browse the repository at this point in the history
…o the maxchild limit

Instead reap every second and recheck if some child finished.
  • Loading branch information
mlschroe committed May 13, 2019
1 parent 2cb2a95 commit a74222e
Showing 1 changed file with 17 additions and 6 deletions.
23 changes: 17 additions & 6 deletions src/backend/BSRunner.pm
Expand Up @@ -31,10 +31,13 @@ sub reap {
my ($maxchild, $chld, $chld_flavor) = @_;

my $pid;
my $numreaped = 0;
while (($pid = waitpid(-1, defined($maxchild) && keys(%$chld) > $maxchild ? 0 : POSIX::WNOHANG)) > 0) {
my $cflavor = delete $chld->{$pid};
delete $chld_flavor->{$cflavor}->{$pid} if defined $cflavor && $chld_flavor->{$cflavor};
$numreaped++;
}
return $numreaped;
}

sub run {
Expand All @@ -55,7 +58,9 @@ sub run {

my @events = $conf->{'lsevents'}->($conf);
my $havedelayed;
my $havelimited;
my $havereaped;
my $numreaped = 0;

for my $event (@events) {
last if grep {-e $_} sort %{$conf->{'filechecks'} || {}};
Expand All @@ -71,15 +76,15 @@ sub run {
$flavor = $conf->{'getflavor'}->($req);
if (defined($flavor) && $maxchild_flavor->{$flavor}) {
if (keys(%{$chld_flavor{$flavor} || {}}) >= $maxchild_flavor->{$flavor}) {
$havedelayed = 1;
$havelimited = 1;
next;
}
}
$req->{'flavor'} = $flavor if defined $flavor;
}

if ($nofork || !$maxchild || $maxchild == 1) {
reap(0, \%chld, \%chld_flavor) if $nofork && $nofork == 2 && %chld;
$numreaped += reap(0, \%chld, \%chld_flavor) if $nofork && $nofork == 2 && %chld;
eval {
$conf->{'dispatch'}->($req);
};
Expand All @@ -95,19 +100,25 @@ sub run {

$chld{$pid} = $flavor;
$chld_flavor{$flavor}->{$pid} = undef if defined $flavor;
reap($maxchild, \%chld, \%chld_flavor);
$numreaped += reap($maxchild, \%chld, \%chld_flavor);
$havereaped = 1;
}

reap($maxchild, \%chld, \%chld_flavor) if $havedelayed && !$havereaped && %chld;
$numreaped += reap($maxchild, \%chld, \%chld_flavor) if ($havedelayed || $havelimited) && !$havereaped && %chld;

for my $fc (sort %{$conf->{'filechecks'} || {}}) {
next unless -e $fc;
reap(0, \%chld, \%chld_flavor) if %chld;
$numreaped += reap(0, \%chld, \%chld_flavor) if %chld;
$conf->{'filechecks'}->{$fc}->($conf, $fc);
}

if ($havedelayed) {
if ($havelimited) {
my $tries = 10;
while (%chld && !$numreaped && $tries--) {
last if BSUtil::waitping($ping, 1);
$numreaped += reap($maxchild, \%chld, \%chld_flavor) if %chld && !$numreaped;
}
} elsif ($havedelayed) {
BSUtil::waitping($ping, 10);
} else {
if ($conf->{'testmode'}) {
Expand Down

0 comments on commit a74222e

Please sign in to comment.