# New Ticket Created by Justin DeVuyst
# Please include the string: [perl #132287]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/Ticket/Display.html?id=132287 >
Below is the best golfing I could manage. I ran it like so for
bisecting:
while perl6 test.pl6; do :; done
The symptom is that sometimes (90%+ on my box and ungolfed) the program
seems to stall out on the qqx line. The last thing that is printed is
"before". But on earlier commits (that actually build) no such
stallage
happened for a couple minutes run time.
[jdv@new-host-2]$ cat test.pl6
use v6.d.PREVIEW;
my %c = (:0reactor_count);
my $s = supply {
whenever IO::Socket::Async.listen('0.0.0.0', 5000) -> $c-conn {
%c{$c-conn}<bar>++;
emit $c-conn;
%c{$c-conn}<msgs-supplier> = Supplier.new;
$c-conn.Supply.lines.tap({
%c{$c-conn}<msgs-supplier>.emit: $_ });
}
}
sub start_reactor ($msgs-in) {
start {
react whenever $msgs-in -> $msg-in {
say "before";
say qqx{echo foo};
say "after";
%c<reactor_count>++;
}
}
}
start {
react whenever $s -> $c-conn {
start {
start_reactor(%c{$c-conn}<msgs-supplier>.Supply);
}
}
}
sleep 1;
my $c = await IO::Socket::Async.connect('0.0.0.0', 5000);
await $c.print("foo\n");
sleep 1;
exit %c<reactor_count> ?? 0 !! 1;
[jdv@new-host-2]$
[jdv@new-host-2]$ git bisect good
80b49320cf854ac68a17cdd216575ee26e380325 is the first bad commit
commit 80b49320cf854ac68a17cdd216575ee26e380325
Author: Jonathan Worthington <[email protected]>
Date: Wed Sep 13 16:08:58 2017 +0200
Initial re-implementation of thread pool scheduler
Has separate general and timer queues with separate workers, and
also
introduces affinity queues, which are intended for cases where
events
will be fed into a `Supply`, and thus there's no point having lots
of
threads competing over them only to immediately stumble over each
other. The separate timer queue helps with timer events being
delayed,
for example by a process producing a load of output.
The new implementation also adds a supervisor, which is where we
will
put the smarts on how many threads to have in the pool. For now, it
is
already smart enough to start a lot less threads than the previous
scheduler when they obviously aren't needed, which should help a
good
bit with memory consumption, as well as to add more when needed to
break deadlocks. This area will be further developed in upcoming
commits. The default maximum number of threads has been raised to
64,
now that the behavior of the scheduler is not to innevitably end up
starting the maximum number of threads even when they don't have
any
work to do.
Finally, a new RAKUDO_SCHEDULER_DEBUG environment variable can be
set
to see how many and what kinds of threads are being started.
:040000 040000 249e0613cf30b283f4fc3cbb0003474377f6019d
3bb01ba4471016067e4b542a2158ee3184cdc85c M src
:040000 040000 6a4e2506cb269875ff4d40054758a34e24c9024d
6a827bbc76dc09ba2cb3fda55083ebb3074ae552 M tools
[jdv@new-host-2]$