Geth rakudo: 345fbf5a06 | (Elizabeth Mattijsen)++ | lib/Telemetry.pm6
More Telemetry tweaks and fixes

  - make sure Telemetry object correctly roundtrip
  - no longer try to make sense of Telemetry:U - Telemetry:U, just die
  - add some more return types to add optimization opportunities
12:01
lizmat Files=1229, Tests=75833, 323 wallclock secs (14.74 usr 5.29 sys + 2171.38 cusr 214.53 csys = 2405.94 CPU)
Geth rakudo: b80d486c7e | (Elizabeth Mattijsen)++ | lib/Telemetry.pm6
Handle empty Telemetry reports better
12:20
rakudo: ba49b34329 | (Elizabeth Mattijsen)++ | t/07-telemetry/01-basic.t
Add some more basic Telemetry tests
12:22
nine actually uses a push mover. Though frankly his girlfriend does most of the mowing. 12:26
Geth rakudo: fe799a9888 | (Elizabeth Mattijsen)++ | src/core/ThreadPoolScheduler.pm
Handle thread exhaustion more gracefully

  - leave more CPU to the threads that *are* doing stuff
  - add $!exhausted attribute to ThreadPoolScheduler
  - this gets set if creating a new thread failed
  - which then inhibits trying to add any more workers
13:12
tbrowder .tell Zoffixi added a blurb about kebab-case on the p6 wiki, please critique and correct as necessary <en.wikipedia.org/wiki/Perl_6> 13:13
yoleaux tbrowder: I'll pass your message to Zoffixi.
tbrowder .tell Zoffix 13:14
yoleaux tbrowder: I don't know what you want me to say to Zoffix.
tbrowder .tell Zoffix i added a blurb about kebab-case on the p6 wiki, please critique and correct as necessary
yoleaux tbrowder: I'll pass your message to Zoffix.
timotimo m: Bag.new.pick(1) 13:57
camelia (signal SEGV)
timotimo oh?
ah, moarvm not bumped 13:58
travis-ci Rakudo build failed. Elizabeth Mattijsen 'Add some more basic Telemetry tests' 14:18
travis-ci.org/rakudo/rakudo/builds/300587018 github.com/rakudo/rakudo/compare/b...49b34329bb
buggable [travis build above] ☠ Did not recognize some failures. Check results manually.
MasterDuke_ /home/travis/build/rakudo/rakudo/install/bin/moar --libpath=src/vm/moar/stage0 src/vm/moar/stage0/nqp.moarvm --bootstrap --module-path=gen/moar/stage1 --setting=NULL --no-regex-lib --target=mbc --output=gen/moar/stage1/NQPCORE.setting.moarvm gen/moar/stage1/NQPCORE.setting 14:21
Segmentation fault (core dumped)
only on one job 14:22
Geth rakudo: ufobat++ created pull request #1246:
RFC: IO::Path.resolve for windows 2nd attempt
14:41
synopsebot RAKUDO#1246 [open]: github.com/rakudo/rakudo/pull/1246 RFC: IO::Path.resolve for windows 2nd attempt
ugexe Does fe799a assume that once exhausted there can -never- be another thread created? 15:31
timotimo yes 15:35
ugexe Why? Cannot the thread use go down at some point and thus allow more workers to spawn? 15:36
timotimo what do you mean by "thread use"? 15:38
ugexe Well, what does exhausted mean? And is it truely a state that cannot be changed once reached? 15:40
timotimo the common failure case is "too many open files"
ugexe yes, but what if 100 threads suddenly complete their task and there are now more files that can be opened 15:41
timotimo then you don't need to add another thread because 100 threads just became free
ugexe hmmm I’m not sure this adds up right to me but I can’t really say why so just ignore me 15:42
timotimo i can see why you're worried about this
adding more threads is one mechanism we use to dislodge deadlocks that could be solved by finishing up some more work tasks 15:43
in that situation the whole program (or maybe just big parts of it) are at a standstill anyway
ugexe Wouldn’t hours manual thread creation be gimped by this? 15:57
hours / bouts of
or rather the scheduler gimped by bouts of manual thread creation
timotimo yeah, Don't Do That :) 15:58
manual thread creation should hardly ever be used
ugexe Yes but if you want to be smarter than the schedule you should be able to (without supplying a different scheduler) 16:02
this just seems like some line that, once crossed in the program, will change its running characteristics for the remainder of its runtime. But this may be a case of I prefer the program blowing up and telling me it’s broke than trying to work around my situation 16:05
so a naive compliment to this might reset the exhausted flag if I successfully create a thread manually. 16:06
timotimo that would require Thread to know about the Scheduler in question, that's weird 16:12
i wouldn't be against just preventing threads from being created with exponential backoff timing
i suspect before this commit it would have tried to build new threads 100 times a second orwhatever the interval for the supervisor is 16:14
that's clearly Bad
bbl
ugexe yes not a real solution, but more trying to explain the behavior i expect 16:20
AlexDaniel releasable6: next 17:02
releasable6 AlexDaniel, Next release in 7 days and ≈1 hour. No blockers. 0 out of 155 commits logged
AlexDaniel, Details: gist.github.com/d8161556014814006f...e5af051797
lizmat timotimo ugexe I'm thinking about only trying to have another try at creating a new Thread once a second (aka once every 100 supervisor loops) 18:26
ugexe: please note that in the current setup, a Thread === a worker, *not* a task 18:33
once started, a Thread will never stop (in the current setup) 18:34
it will just block for another task to appear as soon as it runs out of tasks
Geth rakudo: fe1f8632c1 | (Elizabeth Mattijsen)++ | src/core/Baggy.pm
Fix segfault on Bag.new.pick(1)

Although it would be interesting to see how that was possible to begin with. Problem was, it should have selected the empty iterator, but there was no check on an empty Baggy in there yet. This commit basically adds that.
18:38
timotimo lizmat: with a newer moarvm it doesn't segfault, instead it throws an exception 18:40
jnthn lizmat: Pretty sure timotimo fixed the segv
heh :)
lizmat ah, ok, good
ugexe i see. so is the goal to allow the workers to change to another type of worker? or does work stealing make this pointless? 18:41
timotimo stealing allows workers that are bored to steal from other workers that are overloaded 18:43
i haven't looked at the code to see if it crosses worker types or not
but i think it does, at least in some directions
ugexe otherwise I question what this means for the performance profile of an application when worker/affinity differences are caused by what happened in the past
e.g. i run the application one time and get 9/1, and another time I get 4/5 18:44
lizmat although this implementation is much more advanced than before
it's still pretty simple in its assumptions
ugexe which could be problematic for anything long running
timotimo your system should allow you to get far more than 10 threads
lizmat 1. whenever a worker pool seems to need another worker, we add one
I've now added: 18:45
2. if we've run out of low level system threads, don't bother trying to add them
jnthn github.com/rakudo/rakudo/commit/fe799a9888 introduces a regression 18:46
prod-affinity-workers should be run every time
And should not be inside of the loop 18:47
lizmat but I didn't move them into the loop ?
they were always there ?
jnthn It was moved into unless $!exhausted {
lizmat that;'s not a loop ?
jnthn github.com/rakudo/rakudo/commit/fe...ec119fR545
oh shit
should not be inside of the *unless
Sorry 18:48
That was confusing
lizmat you mean to say that you always need to prod ?
jnthn Yes
lizmat ok, will do
jnthn prod doesn't start new threads
It just steals work from a stuck affinity queue into the general queue
To try and break deadlocks
lizmat ok
still, my change was spectest clean :-) 18:49
jnthn If there is a test that'd catch this, I think it'd be a stresstest
I also wonder a little if there's a more robust way to detect the failure to start thread exception than by text
lizmat well, then it should throw something else than an X::AdHoc :-) 18:50
jnthn Yeah, we could wrap it up in Thread.start I guess :)
timotimo maybe make the catch much tighter so the only thing it's catching for is ... yes
or that 18:51
jnthn In the meantime, I'm meant to cook some dinner :)
timotimo me bbl, too
lizmat jnthn timotimo but if we wrap it in Thread.start, how will the supervisor every know ? 18:52
jnthn Thread.start is where the exception is coming from today, I think? 18:53
Well, the nqp::startthread op inside of it, at least
timotimo right, put a catch around only that, then throw a proper typed exception
jnthn github.com/rakudo/rakudo/commit/fe...ec119fR280
Yes, what timotimo said is what I meant by wrap
lizmat ok, gotcha 18:54
jnthn: I assume you mean nqp::newthread, right ? 18:55
jnthn I forget the exact op names
There's one that creates the object and one that runs it 18:56
lizmat yeah, newthread it is then :0)
$!vm_thread := nqp::newthread(
jnthn github.com/rakudo/rakudo/blob/nom/...ead.pm#L40
I think that one (nqp::threadrun) may be the one that throws the exception you're catching to day, rather than nqp::newthread 18:57
Not 100% certain though
lizmat ok, will check
jnthn But certainly a lot of the setup work actually happens in threadrun
And newthread just creates a handle object
Looking at the code, github.com/MoarVM/MoarVM/blob/mast...eads.c#L30 might throw 18:58
lizmat so that would be nqp::newthread 19:00
jnthn Yup
Really cooking :)
bbl
Geth rakudo: 57374490ae | (Elizabeth Mattijsen)++ | src/core/ThreadPoolScheduler.pm
Try creating a new Thread once a second if exhausted

Instead of completely not try anymore. Also, always prod the affinity workers, even if thread creation will not work.
MasterDuke AlexDaniel: you ran the toaster last release, right? have you done a new one for the upcoming release? 19:14
AlexDaniel MasterDuke: not yet 19:28
MasterDuke: but see toast.perl6.party/ 19:29
MasterDuke: Zoffix++ did run it a few days ago
MasterDuke ah, good 19:30
AlexDaniel MasterDuke: now I'm curious. Why? 19:32
MasterDuke just curious myself. lot fewer changes this month, hoped there was less fallout 19:33
AlexDaniel yeah, this release should be much quieter :) 19:34
but we have a whole week to do disruptive changes! 19:35
Geth rakudo: 14fbb5e76d | (Elizabeth Mattijsen)++ | 3 files
Add typed error for thread creation exhaustion

  - and make sure the supervisor knows about it
  - bikeshedding on the new X::Exhausted exception may start
19:42
ugexe it should be X::hausted 19:45
lizmat and mauve of course :-) 19:47
Zoffix Don't see toast.perl6.party/ It's outdated. The change causing most of that fallout was reverted. 19:52
yoleaux 13:14Z <tbrowder> Zoffix: i added a blurb about kebab-case on the p6 wiki, please critique and correct as necessary
bartolin while looking for some failures on the jvm backend where a wrong multi candidate is selected, i stubled above this inconsistency: 19:57
m: multi sub foo(Int $bar is rw) { }; foo(42) ## X::Multi::NoMatch
camelia Cannot resolve caller foo(Int); the following candidates
match the type but require mutable arguments:
(Int $bar is rw)
in block <unit> at <tmp> line 1
bartolin m: multi sub foo(int $bar is rw) { }; foo(42) ## X::TypeCheck::Argument+{X::Comp}
camelia 5===SORRY!5=== Error while compiling <tmp>
Calling foo(Int) will never work with any of these multi signatures:
(int $bar is rw)
at <tmp>:1
------> 3multi sub foo(int $bar is rw) { }; 7⏏5foo(42) ## X::TypeCheck::Argument+{X::C
bartolin with this change the first evaluation becomes a compile time error, too: github.com/usev6/rakudo/commit/db077336c5 19:58
but we have some tests that expect a X::Multi::NoMatch there.
i'd like to get some feedback whether the suggested patch makes sense. (at least it fixes a problem on the jvm) 20:00
MasterDuke catching thing at compile time is good 20:02
bartolin the patch that catches the native case went in shortly before christmas: github.com/rakudo/rakudo/commit/c96deddc2a 20:04
maybe jnthn can remember why the check for $literal was not applied for the non-native case ... 20:06
Geth rakudo: 3e4ccce9b8 | (Elizabeth Mattijsen)++ | lib/Telemetry.pm6
Tweak the T:I:Usage.preamble + allow util% in R_R_COLUMNS

  - also show final memory size for easy observation
  - make sure you can specify a column name with % in RAKUDO_REPORT_COLUMNS
20:07
rakudo: 6959349e7f | (Elizabeth Mattijsen)++ | src/core/ThreadPoolScheduler.pm
Move variable definitions out of the supervisor loop

  - this does not seem to have a measurable effect on CPU
  - but saves about 3M of memory on a 10 second run
   - assuming this is not a leak, it's just about less GC churn
   - but we cannot tell since we cannot profile this cause its threading
  - wish there was a nqp::vmstat op for things like number of GC runs
20:23
lizmat afk for some time& 20:38
Geth rakudo: 86e9f44aec | (Elizabeth Mattijsen)++ | lib/Telemetry.pm6
Telemetry::Instrument.columns -> default-columns

  - this is a better name for what it returns
  - also add a .columns method that returns all columns in alphabetical order
21:50
lizmat good night, #perl6-dev! 21:52