I've done some more investigation. There are two seperate issues: 1. The main issue wrt this ticket. It hits you will you are editing code. It can be reproduced (on any platform) with:
P6="perl6" lib="templib" test -e $lib && rm -r $lib; mkdir $lib sleep="sleep 2"; echo 'class Top1 { }; need Needed;' > $lib/Top1.pm6 echo 'class Needed { };' > $lib/Needed.pm6; echo 'class Top2 { }; need Needed;' > $lib/Top2.pm6; while true; do printf '#' >> $lib/Needed.pm6 # touch isn't enough here $sleep; $P6 -I$lib -e 'need Top1; need Top2; say GLOBAL::.keys;' done ==== which will fail on the second iteration of the loop: (Top2 Needed Top1) ===SORRY!=== Missing or wrong version of dependency '/root/templib3/Needed.pm6 (Needed)' (from '/root/templib3/Top2.pm6 (Top2)') This one is different because the content of the file has to actually change rather than just the mtime to trigger it. 2. A smaller issue which is what I was investigating in the prior response. If you load/recompile a compunit in the same second as the source is modified it will fail. (your processor and disk has to be fast enough to pull this off which I *think* is why nine couldn't reproduce it rather than this being a mac specific thing). This race condition essentially happens in this line in !load-dependencies: return False if not $srcIO.e or $modified <= $srcIO.modified; because it's <= it opens the possibility that a precomp is marked as out of date a second time even after it has just been re-precompiled in the same process. The consequence seems to be a bad serialisation. (of course I'm not suggesting it shouldn't be <= but I guess the fact that something has just been re-precompiled should override this check). On Sun, May 22, 2016 at 7:12 AM Lloyd Fournier <lloyd.fo...@gmail.com> wrote: > nine++ has attempted to fix this issue: > > > https://github.com/rakudo/rakudo/commit/c59e4dc44772cb09edeb8aa7f0ce0385f951cf5d > > Though it seems to have made the failure more random. > > Try the following: > while true; do > test -e lib && rm -r lib; # this is needed to trigger it for some > reason > mkdir lib; > echo 'class One { }; need Two;' > lib/One.pm6 > echo 'class Two { }; need Three;' > lib/Two.pm6 > echo '' > lib/Three.pm6 > perl6 -Ilib -e 'need One;' > touch lib/Three.pm6 > perl6 -Ilib -e 'need One; say GLOBAL::.keys;' > done > > gives me: > > (Two One) > () > (Two One) > () > (Two One) > () > (Two One) > (Two One) > (Two One) > (Two One) > (Two One) > () > > I wrote a test and push it to roast. > > > https://github.com/perl6/roast/commit/4e8b2e02e77e607593907380d30898ff5a926bd7 > > It seems to have the same issue. > > On Sat, May 21, 2016 at 1:45 AM Lloyd Fournier <lloyd.fo...@gmail.com> > wrote: > >> It seems to have been introduced by one of nine's commits on the 13th. >> This or one of the commits just before it I think: >> >> >> https://github.com/rakudo/rakudo/commit/4fb3f94fcd39699f69e9d175315f9f1357e8faf3 >> >> >> On Fri, May 20, 2016 at 11:26 PM Lloyd Fournier <lloyd.fo...@gmail.com> >> wrote: >> >>> err leme try that again >>> >>> Precomp is broken for dependency chains 3 or longer when one of the >>> dependencies down the chain is *changed*. >>> >>> To expand: Sometimes it gives you a problem where you get "Missing or >>> wrong version of dependency" and sometimes symbols that should have been >>> merged from GLOBALish just aren't there which is the case in the example >>> above. >>> >>> On Fri, May 20, 2016 at 11:18 PM Lloyd Fournier <lloyd.fo...@gmail.com> >>> wrote: >>> >>>> I've been getting something similar and I've managed to golf it. >>>> >>>> mkdir lib; >>>> echo 'class One { }; need Two;' > lib/One.pm6 >>>> echo 'class Two { }; need Three;' > lib/Two.pm6 >>>> echo '' > lib/Three.pm6 >>>> perl6 -Ilib -e 'need One; say (GLOBAL::<One>:exists ?? "OK" !! "NOT >>>> OK")' >>>> echo "changing file" && touch lib/Two.pm6 # Three.pm6 will also break >>>> perl6 -Ilib -e 'need One; say (GLOBAL::<One>:exists ?? "OK" !! "NOT >>>> OK")' >>>> >>>> summary: Precomp is broken for dependency chains 3 or longer when one >>>> of the dependencies down the chain is broken. >>>> >>>> Do we have a way of writing tests for precomp? >>>> >>>> >>>> >>>> >>>> On Tue, May 17, 2016 at 4:23 AM mt1957 <perl6-bugs-follo...@perl.org> >>>> wrote: >>>> >>>>> # New Ticket Created by mt1957 >>>>> # Please include the string: [perl #128156] >>>>> # in the subject line of all future correspondence about this issue. >>>>> # <URL: https://rt.perl.org/Ticket/Display.html?id=128156 > >>>>> >>>>> >>>>> Hi, >>>>> >>>>> I get the following error more often than before after some edits in my >>>>> source files. >>>>> >>>>> Missing or wrong version of dependency >>>>> >>>>> '/home/marcel/Languages/Perl6/Projects/mongo-perl6-driver/lib/MongoDB/Wire.pm6 >>>>> (MongoDB::Wire)' (from >>>>> >>>>> '/home/marcel/Languages/Perl6/Projects/mongo-perl6-driver/lib/MongoDB/Cursor.pm6 >>>>> (MongoDB::Cursor)' >>>>> >>>>> A remedy to this is to touch all source files in the library I work on >>>>> and than retry. I think that this should not happen, at least not that >>>>> often (I've seen it several times in about a week I think, twice this >>>>> evening, to give an idea). >>>>> >>>>> This is Rakudo version 2016.04-200-gad82657 built on MoarVM version >>>>> 2016.04-134-g9879233 >>>>> implementing Perl 6.c. >>>>> >>>>> Greetings, >>>>> Marcel >>>>> >>>>