Show enters and exits. Hide enters and exits.
| 00:33:39 | leavengood | is MRI 1.8.7p352 fairly stable? |
| 00:33:58 | parndt | I'd say so |
| 00:34:01 | leavengood | alright |
| 00:34:14 | leavengood | I know some patch levels can have issues, this seems to be the latest 1.8.7 |
| 00:34:19 | parndt | so is ruby-1.9.3p0 |
| 00:34:40 | leavengood | the rbx README suggests 1.8.7 is required |
| 00:34:48 | parndt | right :) |
| 00:35:22 | leavengood | well I'm working on Haiku where I'll need to get an MRI working first, hehe |
| 00:35:31 | leavengood | unlike Linux where everything just works |
| 00:35:47 | leavengood | really need to try rvm too, though I imagine it would need some Haiku changes |
| 00:36:10 | leavengood | alright I'll see if I can get 1.8.7r352 going |
| 03:14:59 | SJD | Amusing 1.9.3 change: LoadError: cannot load such file -- foo |
| 03:15:03 | SJD | =] |
| 03:55:01 | Radar | oh neat find :) |
| 09:08:14 | rejeep | Hey. Does Rubinius support "GC.disable" and "GC.enable"? I mean, do the methods actually do something? |
| 09:19:09 | dbussink | rejeep: nope |
| 09:19:17 | dbussink | rejeep: they are there but don't do anything |
| 09:19:30 | dbussink | people don't need to do that |
| 09:19:38 | dbussink | that they need it in mri is because the gc isn't very good |
| 09:20:04 | rejeep | Well, it can be used to measure GC time |
| 09:20:18 | dbussink | rejeep: in rubinius you can use the agent to measure gc time |
| 09:20:26 | dbussink | it will give you that information pretty easily |
| 09:20:44 | dbussink | no need to muck around with gc enable / disable |
| 09:21:37 | rejeep | It would be great with a warning, like in JRuby: warning: "GC.enable does nothing on JRuby" |
| 09:48:21 | dbussink | rejeep: we could perhaps add a warning yeah |
| 09:48:31 | dbussink | rejeep: but as a feature we're not supporting it :0 |
| 09:48:31 | dbussink | :) |
| 09:49:10 | rejeep | I would still like it as a feature, but a warning is better than nothing! :) |
| 09:50:41 | rejeep | The reason I would like it, is because then I could easy compare the GC between different Ruby implementations. |
| 09:52:40 | rejeep | For example: http://pastie.org/2787031 |
| 09:53:09 | rejeep | If every VM has its own tools for measuring this kind of stuff, it's more difficult to compare them |
| 10:04:41 | dbussink | rejeep: well, i can tell you for sure we will never add it as a feature |
| 10:04:58 | dbussink | rejeep: we can provide information on how much time was spent in the gc |
| 10:06:34 | rejeep | right, but a warning would be great to avoid confusion! |
| 10:10:17 | stormbrew | you realize leaving the GC off will completely alter the performance characteristics? Time without - time with is not likely to be a useful measurement |
| 10:11:45 | stormbrew | you'll increase syscalls to retrieve/allocate new memory chunks, drastically reduce locality of reference, thrash both the virtual address and data (and possibly even code) caches on the cpu, etc. |
| 10:12:34 | dbussink | stormbrew: very true yeah |
| 10:12:46 | dbussink | a way better measurement is to measure time spent in gc during a normal run |
| 10:12:59 | dbussink | so you can see what the gc pressure of your benchmark is |
| 10:13:06 | stormbrew | the way to measure GC time is to actually measure GC time. The REE patches include a mechanism to do that for MRI, afaik |
| 10:13:20 | dbussink | stormbrew: echo :)_ |
| 10:13:22 | dbussink | :P |
| 10:14:05 | rejeep | Ok, so a "good" GC can actually perform better than no one at all? |
| 10:14:51 | stormbrew | once you get up to the amount of physical memory you have in allocated but uncleaned memory, no GC at all will perform rather ridiculously more poorly heh. |
| 10:15:08 | dbussink | rejeep: no, the thing is that removing gc changes behavior in such a way that the measurement is useless |
| 10:15:09 | stormbrew | and it won't take very long to do that, either |
| 10:15:32 | stormbrew | but yes, what dbussink said is more the point I was originally making |
| 10:15:46 | rejeep | Ohh.. that's useful to know! :) |
| 10:15:57 | dbussink | the only valid measurement is that for a benchmark you can say "it spends x% of the time in gc" |
| 10:16:16 | stormbrew | yep |
| 10:16:34 | stormbrew | also I don't know if rbx or the jvm even realistically could disable the GC |
| 10:16:42 | stormbrew | especially if the nursery generation is finite |
| 10:17:13 | dbussink | it will actually greatly reduce performance due to that reason |
| 10:17:22 | stormbrew | in other words, you can only really turn it off in MRI because MRI's collector is so incredibly dumb |
| 10:17:25 | dbussink | because if the nursery is full it will have to do an allocation from mature space each time |
| 10:17:44 | dbussink | which also means for example more locking overhead in allocating objects etc. |
| 10:18:03 | dbussink | so i wouldn't be suprised that turning of gc will make it slower in rbx |
| 10:18:07 | dbussink | rejeep: ^^ |
| 10:18:39 | rejeep | dbussink: I did find some cases were REE was slower with the GC off |
| 10:18:49 | rejeep | But not with MRI |
| 10:18:53 | dbussink | yeah, can very wel be yeah |
| 10:19:01 | dbussink | but that already shows that it's not a very useful measure |
| 10:19:09 | rejeep | Jupp! |
| 10:19:16 | stormbrew | REE doesn't really change that much about the collector afaik, so that's a bit surprising |
| 10:19:18 | dbussink | way better is to find ways that you can see how much time it spends in gc |
| 10:19:20 | stormbrew | it's mostly tuning changes |
| 10:19:38 | stormbrew | and the whole fork-friendly silliness |
| 10:20:09 | dbussink | well, it's not silly for mri :P |
| 10:20:24 | rejeep | dbussink: You said the agent can help with that? |
| 10:20:37 | heftig | i assume rbx2 will target 1.9.2 and not 1.9.3? |
| 10:20:38 | stormbrew | my experience is that it's only marginally helpful. Not as much of a gain as claimed |
| 10:21:16 | stormbrew | ruby apps' object churn is high enough that pages get touched rather frequently even with it |
| 10:21:22 | rejeep | dbussink: I tried the agent on a script, but it seems like the script cannot exit to use it? |
| 10:21:51 | dbussink | rejeep: https://gist.github.com/a2eafd0653af8a60c146 |
| 10:22:00 | stormbrew | the COW optimization makes a lot more sense in a language like C++ or C where a significant portion of the allocations take place on the stack and most heap allocations are long-lived |
| 10:22:01 | dbussink | rejeep: you can get a loopback into the current vm |
| 10:22:17 | rejeep | stormbrew: What about the AST? Not likely to change |
| 10:23:04 | stormbrew | yeah but because you're using a best-fit allocator for the actual storage and an object table for the ruby objects, both are likely to be written to even long after the initial allocations to those pages |
| 10:23:06 | rejeep | dbussink: Cool, thanks! |
| 10:23:35 | stormbrew | again because the churn is so high in general |
| 10:24:13 | rejeep | stormbrew: right |
| 10:24:22 | stormbrew | if those AST objects were all compacted into their own pages they'd COW well, but I think that's a relatively minor win. Especially for, say, Rails, which has a lot of objects in general |
| 10:25:04 | stormbrew | and the long-lived objects are allocated interleaved with the short-lived objects |
| 10:26:45 | rejeep | stormbrew: But it would be no loss if the AST would be placed in a "Mature Generation" directly, right? |
| 10:27:04 | stormbrew | if MRI had a mature generation :) |
| 10:27:13 | rejeep | Yes! :) |
| 10:27:20 | rejeep | But what about Rubinius for example? |
| 10:27:34 | dbussink | rubinius has a generational garbage collector |
| 10:27:46 | dbussink | so that means it allocates objects in a so called young stace |
| 10:27:48 | dbussink | space |
| 10:27:55 | dbussink | which is collected more frequently that the mature space |
| 10:27:57 | heftig | nursery |
| 10:28:10 | rejeep | Yes, so would it make sense to put for example the AST in the Mature Generation directly? |
| 10:28:10 | dbussink | if an object survives for a few generations, it is copied to the mature space |
| 10:28:25 | stormbrew | in rubinius not so much AST as bytecode |
| 10:28:33 | dbussink | objects of type Class are allocated into the mature generation by default |
| 10:28:38 | dbussink | since they are often there to stay |
| 10:28:47 | rejeep | right |
| 10:28:48 | dbussink | there's no AST in rubinius actually, but bytecode |
| 10:29:47 | rejeep | That's true. The AST does not live in the Ruby world, right? Only in the C++ parts... |
| 10:29:56 | dbussink | it does live in the ruby world |
| 10:30:06 | stormbrew | a similar fork-friendly optimization to the MRI (in spirit) might be to do an aggressive maturation just before a fork |
| 10:30:07 | dbussink | but it's not needed anymore after the compilation to bytecode |
| 10:30:13 | stormbrew | (in rubinius) |
| 10:30:27 | stormbrew | but I dunno if that'd really yield good results |
| 10:30:38 | dbussink | well, since rubinius has real native threads, it doesn't need the forking model to for example have a good parallel web server setup |
| 10:30:58 | stormbrew | absolutely |
| 10:31:35 | stormbrew | though I don't think either threads or fork obsolete the other |
| 10:31:41 | stormbrew | time and place for either |
| 10:32:04 | dbussink | true yeah |
| 10:32:16 | rejeep | dbussink: But that requires Rubinius to be thread safe as well, which it is right? |
| 10:32:19 | stormbrew | I meant "to the REE mark-table patch" above btw |
| 10:32:36 | dbussink | rejeep: it also requires people to write thread safe code on top of rubinius |
| 10:33:05 | rejeep | Sure! |
| 10:33:50 | dbussink | but for the web that's actually not that hard |
| 10:34:06 | dbussink | since each request is most of the time completely independent of others |
| 10:34:21 | dbussink | so as long as you don't save stuff into globals you're usually find |
| 10:34:23 | dbussink | fine |
| 10:34:51 | rejeep | What about DB read/writes? |
| 10:35:14 | stormbrew | which is why forking was a model that ever made sense for it |
| 10:37:09 | dbussink | rejeep: well, regardless of which model (threads / forks) you have to deal with that |
| 10:37:51 | rejeep | And that's what you talked about above, which requires people to write thread safe code on top of rubinius? |
| 10:37:51 | dbussink | rejeep: if you have a forking model server you have to make sure your database is sane still |
| 10:38:15 | dbussink | rejeep: well, for example not modyfing a shared data structure like an array or hash from multiple threads without proper locking |
| 10:39:53 | rejeep | dbussink: Is there ever any gain of running more than one instance of Rubinius since it supports native threads? |
| 10:42:28 | dbussink | rejeep: well, if you want to run for example multiple apps in the same process |
| 10:42:34 | dbussink | rejeep: then it could be useful |
| 10:42:43 | rejeep | I mean for the same app |
| 10:42:50 | dbussink | not really usually |
| 10:43:05 | rejeep | Ok, and that's why Rubinius does not have to use fork? |
| 10:44:02 | rejeep | (for that purpose) |
| 10:44:59 | dbussink | because it doesn't have a gil |
| 10:45:15 | dbussink | so it can use all the cores in your server with just a single process |
| 10:45:31 | rejeep | I see |
| 10:45:32 | dbussink | mri has a global interpreter lock which means it can only run 1 thread of ruby code at the same time |
| 10:46:05 | rejeep | For one process, right? |
| 10:46:41 | dbussink | always for one process yea |
| 10:46:52 | rejeep | ok |
| 10:46:53 | dbussink | because if you have 2 processes they don't have anything to do with eachother |
| 10:47:06 | rejeep | Gotta run, thanks a lot for the answer guys! |
| 10:47:23 | rejeep | right! |
| 10:47:44 | rejeep | *answers :) |
| 14:34:44 | cremes | evan, dbussink: using another program that really stresses threads, ffi, C extensions, etc i can make the latest |
| 14:35:00 | cremes | rbx master exit with an ArgumentError in just a few minutes |
| 14:35:01 | cremes | https://gist.github.com/1327622 |
| 14:35:23 | cremes | *very rarely* this will abort so i can catch it in gdb for you |
| 14:35:45 | cremes | any ideas on what we can do to figure out what's going on? |
| 14:35:49 | cremes | ping me when you get a chance |
| 14:40:45 | dbussink | cremes: does this happen with the jit disabled? |
| 14:41:23 | cremes | dbussink: i don't know; i'll test and let you know (give me 10m) |
| 14:44:19 | cremes | dbussink: while i am doing this test, are there any other switches you want me to enable/disable on rbx? |
| 14:48:50 | antares | dbussink: hi. Do you think it's OK to merge master into 2.0.testing? |
| 14:49:01 | antares | dbussink: looks like we can finally provision VMs tomorrow morning |
| 14:51:22 | cremes | dbussink: even with -Xint, there is a similar crash/exception: https://gist.github.com/1327651 |
| 14:54:33 | cremes | this particular crash is interesting... i oftentimes see it throw these exceptions when there is a slightly |
| 14:54:46 | cremes | complicated inheritance chain |
| 14:55:09 | cremes | in this case there is a base module that a class has included, so the call to #super in the class is supposed |
| 14:55:31 | cremes | to be handled by the module but it throws that #allocate error because it is trying to call #new on a module |
| 14:59:40 | dbussink | antares_: i know of some issues in master atm that i'd like to look at with evan actually |
| 14:59:56 | antares | dbussink: ok, lets keep 2.0.testing the way it is then |
| 14:59:56 | dbussink | cremes: hmm, weird, but this is reproduceable then? |
| 15:00:30 | cremes | dbussink: throwing an exception is reproducible, yes |
| 15:00:36 | cremes | it may not always happen in the same spot |
| 15:06:02 | dbussink | cremes: ah, well, reproducable is good anyway :) |
| 15:06:16 | dbussink | evan probably wants to make his hands dirty on that then ;) |
| 15:14:21 | dbussink | cremes: it's actually really weird it fails without the jit too :s |
| 15:15:02 | dbussink | cremes: you sure it passed down the option probably? if it forks it probably creates a sub process with jit enabled again |
| 15:15:58 | cremes | dbussink: this particular stress test does not call fork or #system; it has 10 threads |
| 15:16:05 | cremes | all within the same process |
| 15:16:20 | dbussink | hmm, very strange then |
| 15:16:38 | cremes | if it wasn't strange then it wouldn't be any fun to track down & fix |
| 15:24:41 | dbussink | cremes: do you think you're able to abstract this nested structure issue? |
| 15:25:09 | dbussink | cremes: the thing is that without the jit enabled, there are much less moving parts, so it should fail on the first attempt always and consistently |
| 15:25:27 | cremes | dbussink: i have tried to do that a few times but of course my extraction works correctly |
| 15:32:33 | dbussink | cremes: well, can't really say much more without diving in then |
| 15:40:35 | cremes | dbussink: if you have any ideas on how i can help track this down, i'm all ears |
| 16:08:57 | dbussink | cremes: not really, could you perhaps write up steps to reproduce this on your machine? |
| 16:09:03 | dbussink | cremes: which command(s) to run etc |
| 16:09:04 | dbussink | ? |
| 16:10:08 | cremes | dbussink: yes |
| 16:11:37 | cremes | it's a component in a distributed system, so i'll have to create a "stub" that generates the data it is listening for |
| 16:11:55 | cremes | *and* i'll have to modify a downstream component so that it does *not* actually write to a database |
| 16:12:42 | cremes | i can probably whip this up in 30m |
| 16:13:04 | dbussink | that would be great |
| 16:13:12 | dbussink | then we could look into it on your machine |
| 16:46:53 | evan | morning! |
| 16:46:56 | evan | alexsuraci: pokes! |
| 16:47:44 | phlebas | morning! |
| 16:51:23 | evan | what's the skinny timmy? |
| 16:52:55 | cremes | dbussink: got an interesting crash in gdb you might want to see... problem with a singleton class |
| 16:52:58 | cremes | want to debug? |
| 16:55:18 | cremes | https://gist.github.com/1327994 |
| 16:56:01 | evan | hrm. |
| 16:56:48 | rue | Skinny Timmy sounds like a name of a band even worse than Skinny Puppy |
| 16:57:04 | cremes | evan: it could be due to some of my older and uglier ruby code so pls don't hit me too hard if that's so :) |
| 16:57:16 | cremes | vm shouldn't crash even if some of the code is ugly |
| 16:57:25 | evan | :) |
| 16:57:29 | evan | yeah, it shouldn't. |
| 16:57:33 | evan | wonder what's going on there though. |
| 16:57:44 | cremes | it doesn't happen *every* time |
| 16:57:56 | cremes | sometimes it says vm is exiting abnormally but it doesn't get caught by gdb |
| 16:58:07 | evan | well, in fact. |
| 16:58:12 | evan | if you see that exitting abnormally output |
| 16:58:14 | evan | it should NEVER crash. |
| 16:58:18 | evan | so that is itself, a bug. |
| 16:58:27 | cremes | ok |
| 16:58:51 | cremes | i can try to reload it in gdb a few more times to see if gdb will catch it like it did the *first* time |
| 17:00:00 | evan | well |
| 17:00:19 | evan | thats fine, but we should ignore that and get to why you're getting that abnormal exit |
| 17:00:23 | evan | thats what needs to be solved. |
| 17:01:13 | cremes | something to do with singleton |
| 17:02:12 | evan | well |
| 17:02:19 | evan | I can't see why you're saying that from the gist |
| 17:02:24 | evan | could you explain more? |
| 17:02:31 | evan | or maybe gist me some of the code? |
| 17:03:01 | cremes | that gist is pointing to container.rb line 33 which is trying to retrieve a singleton |
| 17:03:26 | cremes | that's why i say it has something to do with singletons :) |
| 17:05:16 | evan | sure |
| 17:05:20 | evan | but unless I can see some of the code |
| 17:05:25 | evan | I can't make anything else out |
| 17:05:46 | evan | what is line 33 doing? |
| 17:06:05 | cremes | reload that gist |
| 17:06:48 | evan | um |
| 17:06:51 | evan | which is line 33? |
| 17:07:07 | evan | oh, |
| 17:07:10 | evan | your comment is on the end. |
| 17:07:11 | cremes | and reload again ... |
| 17:08:18 | evan | hrm, something is definitely quite confused |
| 17:08:24 | evan | because Layer2::MarketData::Container::Message is nowhere to be seen in this code |
| 17:08:40 | evan | does this app use fibers? |
| 17:08:44 | cremes | no fibers |
| 17:08:49 | evan | k |
| 17:08:53 | cremes | and yes, i don't know where Message is coming from |
| 17:09:02 | cremes | it *might* be coming from ZMQ::Message |
| 17:09:12 | evan | does it blow up like this when it does blow up? |
| 17:09:15 | cremes | which means the module parent/child structure is messed up |
| 17:09:47 | evan | ie, are there other failures that I could use as data in my bug finding mission? |
| 17:10:12 | evan | though |
| 17:10:13 | cremes | similarly... it will complain about a missing method on an object like #open on class Array |
| 17:10:17 | evan | one issue you will absolutely have |
| 17:10:25 | evan | is you're sharing one Mongo connection across all threads? |
| 17:10:35 | evan | is there a lock around it's operations? |
| 17:10:43 | cremes | yes; the driver is supposedly thread safe and allows this |
| 17:10:59 | evan | i like the "supposedly" in there. |
| 17:11:02 | cremes | :) |
| 17:11:14 | cremes | concurrency is hard |
| 17:11:26 | cremes | which is why i say supposedly... there might be things missing |
| 17:11:28 | evan | makes me wonder if it really is. |
| 17:11:33 | evan | at any rate |
| 17:11:42 | evan | do you have any backtrace or anything about that Array#open error? |
| 17:11:50 | cremes | no |
| 17:11:58 | cremes | because it throws an exception and just exits normally |
| 17:12:20 | evan | well |
| 17:12:25 | evan | if it throws an exception |
| 17:12:28 | evan | there should be a backtrace? |
| 17:12:45 | cremes | oh, i thought you meant gdb backtrace |
| 17:12:50 | evan | absolutely not |
| 17:12:53 | cremes | yes, it will write a ruby bt |
| 17:12:55 | evan | i always mean ruby backtrace |
| 17:12:59 | cremes | k |
| 17:13:07 | evan | if i mean VM backtrace, i'll say as such :) |
| 17:13:12 | evan | it's too confusing otherwise |
| 17:13:16 | cremes | k |
| 17:13:25 | evan | and I generally only ask for a VM backtrace if the VM is crashing |
| 17:13:28 | evan | which is not the case here. |
| 17:20:39 | cremes | looks to me like a race between multiple threads trying to retrieve that singleton all at the same time |
| 17:21:19 | cremes | i saw a problem with this many months ago; the fix was to "backport" the MRI 1.9 singleton.rb code to rbx because it |
| 17:21:29 | cremes | supposedly fixed the race conditions for singletons |
| 17:21:38 | cremes | there's that "supposedly" again |
| 17:22:03 | evan | hm, |
| 17:22:34 | evan | i'm not a big fan of Singleton, but it should work right |
| 17:22:41 | evan | does this happen very quickyl |
| 17:22:44 | evan | or over time? |
| 17:22:51 | cremes | immediately on launch |
| 17:22:57 | evan | oh good. |
| 17:23:02 | cremes | if you login and attach to screen you can see it |
| 17:23:02 | evan | that supports your theory. |
| 17:23:06 | cremes | :) |
| 17:23:47 | evan | where at? |
| 17:23:50 | evan | I don't see it in the screens |
| 17:24:01 | evan | i'm watching, you can just get the screen session to it. |
| 17:24:23 | evan | this is why screen -x is awesome. |
| 17:24:30 | evan | oh oh |
| 17:24:31 | evan | i see. |
| 17:24:39 | evan | we have different sized windows |
| 17:24:39 | evan | ok |
| 17:24:51 | cremes | yeah, mine is 146x57 |
| 17:24:55 | evan | oh hm. |
| 17:25:03 | evan | i don't see any error ouput actually |
| 17:25:09 | evan | just that Trying to retrieve |
| 17:25:12 | evan | what should I be seeing? |
| 17:25:32 | cremes | it should "hang" because it's in a forever loop waiting for input |
| 17:25:39 | cremes | it's a network app |
| 17:25:43 | evan | sure sur |
| 17:25:50 | evan | but it just exits gracefully it appears |
| 17:25:57 | evan | so i'm not sure what to do with this info :) |
| 17:26:03 | cremes | hang on... |
| 17:26:38 | cremes | when i try to run it under gdb several times, eventually it will give me that vm error |
| 17:26:45 | cremes | do you see it in the scrollback there? |
| 17:26:59 | evan | yep |
| 17:27:02 | evan | i can see you scrolling back |
| 17:27:28 | cremes | the text i scrolled back to is the same as what i put in that gist earlier |
| 17:27:47 | cremes | if you want, try running it under gdb like i did a few times to see it fail |
| 17:28:00 | evan | ok |
| 17:28:08 | evan | gdb doesn't really have anything to do with it. |
| 17:28:17 | evan | let me poke at it a bit |
| 17:28:22 | cremes | no, but it seems to help cause that a little more often |
| 17:28:28 | evan | gotcha |
| 17:29:09 | evan | oh fun times. |
| 17:29:11 | evan | -d to the rescue! |
| 17:31:00 | cremes | where did those LoadErrors come from? weird.... |
| 17:31:03 | evan | cremes: do you mind if I open these files? |
| 17:31:06 | evan | cremes: those are from rubygems |
| 17:31:13 | cremes | go for it |
| 17:31:31 | evan | that first NameError is funny |
| 17:31:49 | evan | because it appears to be being printed from multiple threads simulatiniously |
| 17:31:53 | evan | or whatever that word is. |
| 17:32:46 | evan | cremes: this is good |
| 17:32:53 | evan | i'm going to poke around for a little bit |
| 17:33:52 | cremes | glad you are finding it interesting... this may lead to a very subtle bug somewhere... |
| 17:36:14 | evan | hm |
| 17:36:20 | evan | maybe it's just cascaded in a funny way |
| 17:36:41 | evan | no, it's multiple threads. |
| 17:46:20 | evan | cremes: where is the Connection class? |
| 17:46:44 | evan | got it. |
| 17:46:45 | cremes | are you asking for the file path? |
| 17:46:58 | evan | yeah, but I found it. |
| 17:47:00 | cremes | k |
| 17:51:10 | evan | oh, look at this crazy output. |
| 17:52:28 | evan | cremes: is Container autoloaded? |
| 17:53:05 | cremes | i don't know anything about autoloader so i don't know |
| 17:53:09 | evan | er. |
| 17:53:14 | evan | Connection |
| 17:53:31 | cremes | there should be a file chuckkit.rb that requires everything including Connection |
| 17:55:57 | evan | cremes: where are the threads started? |
| 17:56:01 | evan | what file |
| 17:56:31 | cremes | ~/dev/ChuckKit/test/cqg/connectivity/inserter_mt.rb |
| 17:57:10 | evan | gotcha |
| 17:57:11 | evan | ok |
| 17:59:25 | cheba | Does ObjectSpace count symbols as objects? |
| 17:59:31 | evan | nope |
| 18:00:41 | cheba | So ruby dynamically creates object whenever I refer to :symbol? |
| 18:00:50 | evan | nope |
| 18:01:03 | evan | it creates them at parse time. |
| 18:01:22 | cheba | I see. |
| 18:01:24 | evan | they are global, immutable, singleton objects. |
| 18:01:31 | evan | like, say, 3 |
| 18:01:39 | evan | every 3 in the system is the same Fixnum object. |
| 18:01:40 | cheba | And if I do "str".to_sym? |
| 18:01:54 | evan | that will either return the existing symbol for :str |
| 18:01:58 | evan | or make a new one and return it. |
| 18:02:17 | evan | you can DOS ruby by creating symbols in a loop |
| 18:02:21 | evan | it's a known issue. |
| 18:02:48 | cheba | Sure. |
| 18:03:33 | cheba | Is there any method do find out where (and when) symbols created? Apart from grep to_sym, I mean. |
| 18:04:04 | evan | you can look up String#to_sym |
| 18:04:05 | evan | sure. |
| 18:04:45 | cheba | I mean, is that the only way to create symbols at runtime? |
| 18:04:59 | evan | yep. |
| 18:05:01 | evan | well |
| 18:05:04 | evan | you can do |
| 18:05:08 | evan | :"blah #{foo}" |
| 18:05:17 | evan | but thats even harder to find out how it works |
| 18:05:26 | cheba | Right. Thanks. |
| 18:05:30 | evan | are you asking about rubinius or MRI? |
| 18:05:45 | evan | because how they implement symbols is simaliar in algorithm |
| 18:05:49 | evan | but completely different otherwise |
| 18:09:13 | cheba | rbx. But I assume it's not very different in mri. |
| 18:09:43 | alexsuraci | evan: mornin'. i take it you saw my pull request? :) |
| 18:09:49 | cheba | What's the difference? |
| 18:09:51 | evan | alexsuraci: i did! |
| 18:09:55 | evan | alexsuraci: and want to reject it! |
| 18:09:59 | evan | so we have to talk! |
| 18:10:02 | alexsuraci | haha, not unexpected |
| 18:10:05 | evan | cheba: completely different code bases |
| 18:10:24 | evan | alexsuraci: I added something else for you to use |
| 18:10:39 | alexsuraci | oh? |
| 18:10:42 | evan | check out lib/compiler/runtime.rb |
| 18:10:47 | cheba | But they're persisted in the same way and all of them have their singletone objects. Right? |
| 18:10:56 | evan | basically, you can reference a constant from the literals tuple now |
| 18:11:11 | headius | evan: given any thought to what might break if symbols could GC? |
| 18:11:17 | evan | you have to just define rbx_marshal_constant to indicate the name of the constant to resolve when the .rbc is reloaded |
| 18:11:25 | evan | headius: yeah, i've got a good list. |
| 18:11:37 | evan | cheba: yes, semantics are exactly the same. |
| 18:11:45 | headius | it wouldn't be hard to make them GC, but can think of a few oddities that might result |
| 18:11:52 | evan | cremes: oh geez. Message is the BEGINNING of this contsant |
| 18:11:53 | evan | ! |
| 18:11:56 | evan | I missed that for the last hour |
| 18:11:59 | evan | HILARIOUS. |
| 18:12:06 | evan | should that be Messaging:: |
| 18:12:06 | evan | ? |
| 18:12:10 | cheba | evan: that's what I was interested in. Thanks. |
| 18:12:16 | evan | cremes: ^^ |
| 18:13:12 | cremes | evan: Messaging is a namespace |
| 18:13:24 | evan | look in screen |
| 18:13:34 | evan | you're accessing Message::Layer2 |
| 18:13:38 | evan | but elsewhere you have Messaging::Layer2 |
| 18:13:49 | evan | should Message::Layer2 be Messaging::Layer2? |
| 18:13:55 | evan | ie, is this a typo? |
| 18:14:13 | dbussink | hi peeps |
| 18:14:17 | evan | headius: we'll discuss GC symbols in a sec, once i'm done with cheba |
| 18:14:17 | evan | er. |
| 18:14:18 | evan | cremes: |
| 18:14:25 | headius | sure |
| 18:14:57 | evan | oh cool |
| 18:14:59 | evan | it works now |
| 18:15:01 | evan | it was a typo |
| 18:15:09 | cremes | evan: if that's what it was doing, then yes it's a typo |
| 18:15:11 | evan | cremes: pokes pokes pokes pokes |
| 18:15:18 | evan | it seems to be running now. |
| 18:15:19 | cremes | poked |
| 18:15:22 | cremes | ok |
| 18:15:30 | rue | Needs a pager trigger |
| 18:15:33 | evan | so the error was accurate |
| 18:15:53 | cremes | so i had a typo in container.rb ? |
| 18:15:57 | evan | yep |
| 18:16:00 | cremes | d'oh |
| 18:16:06 | evan | you had Message::Layer2 |
| 18:16:21 | cremes | ok, time to put this thing under some stress to see if i can expose any threading issues |
| 18:16:34 | evan | this error certainly wasn't reported well though |
| 18:16:42 | evan | which is the source of a bug |
| 18:16:45 | evan | that i'll work on now |
| 18:16:48 | evan | i'm going to detach from screen |
| 18:16:51 | evan | you can take over again |
| 18:16:59 | cremes | k |
| 18:17:13 | dbussink | evan: when you have time, i have a question too :) |
| 18:17:18 | evan | headius: so, GC Symbols |
| 18:17:25 | headius | yeah |
| 18:17:33 | evan | MRI can't do it because they have static ID values everywhere |
| 18:17:41 | headius | I've implemented it a couple times but never committed |
| 18:17:41 | evan | so thats why they don't. |
| 18:17:50 | evan | but at a semantic level |
| 18:17:55 | alexsuraci | evan: ok, so I do push_literal x, where x is something that defines rbx_marshal_constant, which returns something like "::Foo::Bar"? |
| 18:18:14 | headius | at C level, you mean, yes? |
| 18:18:18 | evan | it's less problematic |
| 18:18:22 | evan | headius: yes. |
| 18:18:29 | headius | yeah, well, C level suxors |
| 18:18:30 | evan | esp. since rubinius removed Symbol#to_i long ago |
| 18:18:38 | evan | and it hasn't caused really any issues |
| 18:18:39 | alexsuraci | evan: and if I do that for all constants it shouldn't matter what the StaticScope is? |
| 18:18:48 | evan | Symbol#to_i would be where compacting would cause a problem |
| 18:19:01 | headius | also __id__ |
| 18:19:07 | headius | that was the main one I'd thought of |
| 18:19:10 | evan | oh yes. |
| 18:19:11 | evan | yes yes |
| 18:19:13 | headius | using a symbol's object ID |
| 18:19:16 | evan | thats the same as #to_i really |
| 18:19:18 | headius | yes |
| 18:19:21 | evan | thats the issue |
| 18:19:23 | headius | but you can't remove it |
| 18:19:32 | evan | people use .__id__ of a symbol as a hash key |
| 18:19:36 | evan | or in a memoized method name |
| 18:19:51 | headius | ick |
| 18:19:52 | evan | alexsuraci: well, no. |
| 18:20:00 | evan | alexsuraci: my point was that rather than adding instructions |
| 18:20:13 | evan | alexsuraci: you should create a runtime object that implements your set_scope method instead of the instruction |
| 18:20:47 | evan | you effectively get unlimited, extensible instructions implemented as ruby methods |
| 18:21:11 | alexsuraci | how do I actually do the scope-setting in ruby, then? |
| 18:21:11 | evan | you can see khaase used it to implement flipflop |
| 18:21:24 | evan | what do you want to do? |
| 18:21:30 | evan | just set the lexical scope? |
| 18:21:34 | alexsuraci | ah, I'll check the rest of that commit |
| 18:21:55 | evan | CompiledMethod#scope = some_static_scope_object |
| 18:21:57 | evan | like that. |
| 18:22:01 | manveru | i thought Symbol#to_i is dead? |
| 18:22:10 | evan | manveru: it is, but :a.__id__ isn't. |
| 18:22:25 | alexsuraci | evan: well, in atomy each method branch ends up in one CompiledMethod, effectively a big case statement, but each branch needs to retain the static scope from their definition |
| 18:22:33 | dbussink | evan: this weekend i found this one: https://github.com/rubinius/rubinius/issues/1386 |
| 18:22:51 | dbussink | evan: which makes we wonder why we do this code in the first place: https://gist.github.com/a76f491ff2e42dceef4d |
| 18:22:59 | manveru | but ObjectSpace.id2obj or whatever that was is dead too? |
| 18:23:01 | dbussink | evan: seems a bit weird to always wake that up when waking up a thread |
| 18:23:15 | dbussink | i was wondering what the rationale is behind doing that on contented objects when a thread wakes up |
| 18:23:21 | evan | dbussink: ok, I have to figure out this code before we discuss it |
| 18:23:25 | headius | manveru: I think evan's saying people still use Symbol#__id__ as a one-way hashing algorithm |
| 18:23:36 | evan | headius: yes, thats what I mean |
| 18:23:39 | manveru | ah |
| 18:23:40 | evan | and _id2ref isn't dead either. |
| 18:23:40 | headius | and expect the same symbol later, regardless of GC characteristics, to produce the same result |
| 18:23:43 | evan | it's very much alive. |
| 18:23:45 | manveru | yeah, that's not great |
| 18:24:03 | manveru | damn |
| 18:24:11 | evan | alexsuraci: seems simple |
| 18:24:14 | rue | Maybe Greg can put that in a Ruby Worst Practices |
| 18:24:29 | evan | alexsuraci: you call a set_scope method instead of using your set_scope instruction |
| 18:24:40 | dbussink | evan: ok, np, i've gone through it a bit so i should be able to explain things too ;) |
| 18:24:42 | headius | let's just convert symbol's string into a base 256 number :D |
| 18:24:46 | headius | done! |
| 18:24:55 | evan | :) |
| 18:25:11 | headius | Symbol can be an immutable Bignum |
| 18:25:14 | headius | done! |
| 18:25:34 | headius | er, well...bignum is immutable already |
| 18:25:37 | evan | an option, realisticly, is to assign Symbol's a numeric id lazily |
| 18:25:42 | headius | so we just need Symbol methods on Bignum |
| 18:26:02 | evan | and if a symbol gets an id |
| 18:26:06 | dbussink | evan: and then not gc them if they have an id? |
| 18:26:12 | evan | it's retained forever |
| 18:27:51 | headius | hmm |
| 18:28:43 | evan | dbussink: ok, that release_contention is not actually releasing |
| 18:28:46 | evan | thats a misnomer |
| 18:28:48 | headius | looks like we already assign __id__ lazil |
| 18:28:49 | headius | y |
| 18:29:05 | headius | at which point it goes into a weak map from id to obj |
| 18:29:07 | evan | dbussink: it simply signals any contending thread to recheck |
| 18:29:09 | dbussink | evan: i saw it's signaling right? |
| 18:29:17 | dbussink | but does that really help in this case? |
| 18:29:20 | evan | right |
| 18:29:27 | evan | but anyone waiting just wakes up and rechecks things. |
| 18:29:31 | headius | oddly enough it appears we have never been assigning symbol __id__ eagerly |
| 18:29:35 | dbussink | as in, how useful is it to wake up here? |
| 18:29:42 | evan | dbussink: absolutely critical. |
| 18:29:49 | evan | because if you're waiting on a lock |
| 18:29:55 | evan | in a the main thread |
| 18:30:00 | evan | and SIGINT arrives |
| 18:30:07 | evan | SIGINT must abort the lock attempt |
| 18:30:12 | headius | system ~/projects/jruby $ jruby -e "p :foo.__id__; p :foo.to_i" |
| 18:30:13 | headius | 2000 |
| 18:30:13 | headius | 171 |
| 18:30:47 | headius | to_i is still the eagerly-assigned monotonically-increasing symbol index |
| 18:30:59 | alexsuraci | evan: what would I be passing to that method, though? looks like flip flops just mutates the StaticScope; would I just be replacing the relevant bits? (i.e. what makes them deep-equal) |
| 18:31:18 | dbussink | evan: ok, then we need to fix this issue, the problem here is that because now there's a gc lock guard around that release contention |
| 18:31:28 | dbussink | evan: i explained it also a bit in the issue |
| 18:31:57 | evan | alexsuraci: lets table this |
| 18:32:01 | evan | IRC is only good for one convo at a time. |
| 18:32:07 | evan | and dbussink is winning this battle |
| 18:32:22 | evan | dbussink: ok, looking now. |
| 18:32:43 | evan | dbussink: hm |
| 18:32:45 | alexsuraci | evan: sure |
| 18:32:49 | evan | i guess i'm confused about WHY this is crashing still. |
| 18:32:49 | dbussink | evan: ok, btw, the way i triggered this issue is by running ci in a loop inside gdb |
| 18:33:06 | headius | evan: so I think in jruby we could have symbol's lazily-generated ID trigger a hard reference and other symbols could GC |
| 18:33:25 | dbussink | evan: well, a thread is woken up and right after a gc is requested so a stop the world is attempted |
| 18:33:26 | rue | That does sound like a reasonable compromise |
| 18:33:40 | headius | still a potential leak/DOS, but less exposure |
| 18:33:41 | rue | Between id'ing all symbols and setting everybody on fire |
| 18:33:53 | dbussink | so that thread that is woken up is marked as suspended but then tries to unlock the contention lock |
| 18:34:23 | evan | hm |
| 18:34:27 | dbussink | and in that unlocking it sees it's already suspended and therefore aborts |
| 18:34:33 | evan | I need to trace this |
| 18:34:40 | evan | i'm not getting it completely yet. |
| 18:34:42 | dbussink | the 'bug' is because there's an explicit rubinius::bug() here |
| 18:34:45 | dbussink | ok |
| 18:35:05 | yipdw | headius: just as an FYI, Chez Scheme does something similar to that with its implementation of gensym |
| 18:35:52 | dbussink | evan: this is how i run it in a loop: https://gist.github.com/391e20d1879a5af0e83d |
| 18:36:04 | dbussink | evan: works well as a stress test to let it run a while ;) |
| 18:36:16 | evan | hehe |
| 18:36:18 | evan | ok |
| 18:40:22 | rue | Was there a decision made on #to_bool |
| 18:40:24 | rue | ? |
| 18:40:39 | rue | Instead of the pervasive !!'s |
| 18:40:41 | headius | yipdw: ahh, interesting |
| 18:41:37 | alexsuraci | evan: figured out a way to do it without adding set_scope :) |
| 18:41:45 | evan | k |
| 18:42:02 | alexsuraci | push_variables; send :method, 0; push_literal scope; send :"scope=", 1 |
| 18:42:13 | alexsuraci | kind of a roundabout way of doing it, but it works. |
| 18:42:38 | dbussink | evan: oh, btw, i wasn't able to trigger this with a dev build :s |
| 18:42:46 | boyscout | Merge pull request #1387 from xaviershay/proc-19-take2 - 6789158 - Eero Saynatkari |
| 18:42:56 | dbussink | evan: only with a regular one it actually failed once in a while |
| 18:43:03 | evan | dbussink: yeah, it's totally a timing bug. |
| 18:43:33 | evan | and reenforces that we need to start tracking more thread state to detect potential deadlocks and bad states proactively |
| 18:43:42 | evan | rather than trying to eek timing issues out |
| 18:44:09 | dbussink | well, the bug() check here is kinda thread state checking |
| 18:44:25 | rue | Hm |
| 18:45:11 | rue | It's refusing to build on 1.9.3-p0 for me, but it could be an rvm/env issue. Anyone else seen? |
| 18:46:47 | headius | I need to merge that Proc#curry in too |
| 18:51:13 | evan | dbussink: ok, so why was the thread calling wakeup already suspended? |
| 18:51:19 | evan | dbussink: I don't see where that would be |
| 18:52:52 | dbussink | evan: in wait_to_run |
| 18:53:03 | dbussink | evan: line 6 of backtraces in the gist linked in the issue |
| 18:53:07 | dbussink | evan: https://gist.github.com/e8c1247fa5e7b2d01b02 |
| 18:53:21 | evan | well |
| 18:53:21 | evan | no. |
| 18:53:27 | evan | thats not the thread that called rubinius::bug |
| 18:54:00 | evan | that is just the Channel starting to wait |
| 18:54:12 | dbussink | evan: it has the same state actually, 0x109003e50 |
| 18:54:25 | evan | same as what? |
| 18:54:29 | evan | i don't follow. |
| 18:54:40 | dbussink | #4 0x00000001000e001b in rubinius::WorldState::wait_to_run (this=0x100f06800, state=0x109003e50) at shared_state.cpp:189 |
| 18:54:45 | evan | also, you've got optimizations on, so you can't trust that. |
| 18:54:55 | dbussink | #4 0x00000001000e0082 in rubinius::WorldState::become_independent (this=0x100f06800, state=0x109003e50) at world_state.hpp:56 |
| 18:54:56 | evan | please give me lines in the gist |
| 18:54:58 | evan | to compare |
| 18:55:10 | evan | because i have no context for those pastes |
| 18:55:16 | dbussink | line 6 and 72 |
| 18:55:42 | dbussink | evan: can you repro it using those gdb scripts? |
| 18:55:50 | evan | i'm not trying. |
| 18:55:55 | dbussink | ok |
| 18:55:56 | evan | i'm trying to fully understand this first. |
| 18:55:59 | evan | thats more important. |
| 18:56:09 | evan | ok, that line 6 and 72 are the same IS BAD |
| 18:56:10 | evan | VERY |
| 18:56:12 | evan | VER |
| 18:56:13 | evan | BAD |
| 18:56:19 | dbussink | yeah |
| 18:56:29 | evan | that means this is not that isuse at all |
| 18:56:34 | evan | but rather the wrong state is used |
| 18:56:35 | evan | FUCK |
| 18:56:36 | evan | yes. |
| 18:56:38 | evan | line 384 |
| 18:56:41 | evan | this should be state |
| 18:57:00 | dbussink | which file? |
| 18:57:04 | evan | vm.cpp |
| 18:57:12 | evan | thats the bug. |
| 18:57:21 | evan | release_contention needs to be passed the current thread's STATE |
| 18:57:28 | evan | NOT the state of the thread we're trying to wakeup |
| 18:57:31 | dbussink | ah, of course! |
| 18:57:35 | evan | exactly. |
| 18:57:54 | Defiler | What could go wrong? |
| 18:57:55 | Defiler | :) |
| 18:58:16 | evan | this is one flaw in my organization |
| 18:58:36 | evan | the "current thread state" is the same as "some other threads state" |
| 18:58:45 | evan | so static typing doesn't help us out |
| 18:58:54 | evan | maybe I should bite the bullet and change the type of STATE |
| 18:59:41 | dbussink | evan: actually looks like a really ancient bug |
| 18:59:42 | evan | dbussink: wanna commit this fix? |
| 18:59:45 | evan | yeah |
| 18:59:46 | dbussink | yeah |
| 18:59:50 | dbussink | after stress testing it] |
| 18:59:54 | evan | I'm going to bite the bullet |
| 18:59:59 | evan | and see how much work it would be to change STATE |
| 19:00:11 | dbussink | should be very little ;_ |
| 19:00:16 | evan | :) |
| 19:00:18 | dbussink | or a lot of potential bugs show up ;) |
| 19:00:23 | evan | exactly. |
| 19:00:29 | evan | now is the time too |
| 19:00:30 | evan | pre 2.0 |
| 19:01:35 | jdsiegel | crystal method's Now is the Time (Rubinius MIX) |
| 19:01:49 | evan | :D |
| 19:03:20 | boyscout | Added docs for 1.9 Proc#curry, #source_location, #to_s. - 81214a0 - Eero Saynatkari |
| 19:08:05 | dbussink | evan: no crash yet :) |
| 19:08:20 | evan | :) |
| 19:08:37 | dbussink | going to let it run for a few more runs and push it |
| 19:08:43 | dbussink | it's wrong anyway how it's now :P |
| 19:09:44 | boyscout | We need to pass in the current thread - c5adaa5 - Dirkjan Bussink |
| 19:11:16 | evan | :) |
| 19:11:23 | evan | I've started the STATE change |
| 19:11:35 | evan | hopefully will be able to get it done today |
| 19:11:38 | evan | but now, lunch! |
| 19:14:40 | dbussink | evan: cool :) |
| 20:18:02 | dbussink | evan: i was looking at https://github.com/rubinius/rubinius/issues/1365 but i'm really stumped by what is happening there, doesn't seem to make any sense :s |
| 20:18:19 | evan | yeah, no clue. |
| 20:18:22 | evan | it's not a null pointer problem |
| 20:18:27 | evan | so don't let that confuse you. |
| 20:19:04 | dbussink | evan: that linkedlist is totally weird there; https://gist.github.com/e59aa77594e68f096f29 |
| 20:20:11 | evan | you've got optimizations on probably |
| 20:20:13 | evan | so don't be too confused |
| 20:20:32 | dbussink | nope, this is with DEV=1 |
| 20:20:45 | evan | did you rake clean first? |
| 20:20:49 | dbussink | yeah |
| 20:20:53 | evan | :/ |
| 20:21:01 | evan | no clue. |
| 20:21:06 | dbussink | it's trivially easy to reproduce with the stuff in that issue though |
| 20:21:19 | dbussink | also tried without the jit, no difference |
| 20:21:21 | evan | i wonder if Fibers are confusing a thread's variable buffer list. |
| 20:21:46 | dbussink | must be something like that i guess :s |
| 20:21:56 | dbussink | but my assembly fiber fu isn't up to that :p |
| 20:22:17 | evan | could you comment on the issue at least |
| 20:22:22 | evan | indicating that you can repro it easily |
| 20:22:30 | evan | so I don't forget to look |
| 20:24:07 | dbussink | commented with the gist attached |
| 20:25:39 | dbussink | evan: tarcieri was also seeing some pretty heavy performance regression in those fiber benchmarks btw |
| 20:26:03 | evan | yeah |
| 20:26:04 | evan | i know. |
| 20:26:08 | evan | i haven't investigated it. |
| 20:32:18 | dbussink | evan: easy to change STATE or does it expose more stuff? |
| 20:32:38 | evan | a lot of places to change and fix |
| 20:32:40 | evan | but it's good. |
| 20:32:47 | evan | because it's letting me unwind a bunch of things |
| 20:35:25 | dbussink | evan: things such as? |
| 20:35:46 | evan | the VM class a bunch of crap on it |
| 20:35:52 | evan | it's full of random functions |
| 20:40:22 | evan | oh |
| 20:40:25 | evan | already found a bug. |
| 20:41:14 | dbussink | yay! |
| 20:50:34 | evan | and found another one. |
| 20:50:48 | evan | all in the agent |
| 20:55:58 | dbussink | agent could cause stuff to crash? |
| 20:56:05 | dbussink | or issues in the agent itself? |
| 21:17:31 | evan | dbussink: both. |
| 22:02:02 | antares | dbussink: hi |
| 22:02:07 | antares | dbussink: are you still around? |
| 22:21:59 | evan | dbussink: found more bugs |
| 22:22:02 | evan | huzzah for this change. |
| 22:22:21 | rue | Yay changes |
| 22:22:29 | rue | Ooh, GVR is dissing Zed :D |
| 22:23:43 | steveklabnik | heh |
| 22:23:50 | evan | rue: where at? |
| 22:24:09 | petercooper | shooting fish in a barrel |
| 22:24:11 | rue | https://twitter.com/#!/gvanrossum/status/131133804302704642 |
| 22:36:48 | antares | evan: hi. Can you guys tell me why Rubinius needs exactly Ruby 1.8.7 to be built? |
| 22:37:03 | evan | it doesn't. |
| 22:37:16 | antares | evan: well, if we want 1.8 mode by default it does |
| 22:37:25 | evan | nah. |
| 22:37:25 | antares | evan: jruby or 1.8.6 won't work, rubinius itself won't work |
| 22:37:33 | evan | should work fine |
| 22:37:35 | evan | what doesn't work? |
| 22:37:59 | antares | evan: what happened is 1.8.6 was installed before rubinius so rubinius build system picked it and then failed to build |
| 22:38:13 | evan | failed how is my question |
| 22:38:27 | evan | jruby will fail probably because we need C extensions to build it properly |
| 22:38:29 | antares | evan: this is definitely an issue with our cookbook, too, but I am curious as to whether it is an issue with 1.8.6 support or by design |
| 22:38:39 | evan | so we build melbourne, the C extension, for the builder ruby |
| 22:38:48 | evan | what error did you get? |
| 22:38:52 | antares | evan: I did not recover the log |
| 22:38:58 | evan | my guess is we haven't tried to build with 1.8.6 in a long time is all. |
| 22:39:15 | antares | evan: right, that was my idea, too |
| 22:39:17 | evan | but I can't speak to any problems without looking at a log |
| 22:39:25 | antares | that it just so happens that 1.8.6 build issue wasn't noticed |
| 22:39:48 | antares | evan: that's ok, we are reworking our RVM cookbook to install things in a strict order anyway |
| 22:40:05 | evan | ok |
| 22:40:13 | evan | we should support most versions of MRI |
| 22:40:23 | evan | if 1.8.6 is busted |
| 22:40:28 | evan | it might be a simple fix to get it going again |
| 22:44:02 | rue | Hm, should see if I can debug that .3-p0 failure. |
| 23:10:30 | bakkdoor | anybody else getting this error with SHA1? https://gist.github.com/1329353 |
| 23:12:13 | rue | bakkdoor: Yep |
| 23:12:19 | bakkdoor | :( |
| 23:15:03 | brixen | I think I fixed one like this before |
| 23:15:14 | brixen | building rbx right now, I'll take a look in a sec. |
| 23:16:00 | bakkdoor | ok |
| 23:16:05 | bakkdoor | it worked before |
| 23:16:15 | brixen | k |
| 23:16:28 | brixen | some lib stuff has been moved around recently |
| 23:17:01 | evan | this kind of thing happens when the file is loaded twice |
| 23:17:19 | evan | because orig_new points to the previous version of the wrapper code |
| 23:22:21 | bakkdoor | ok found the problem |
| 23:22:33 | bakkdoor | the same code is in lib/sha1.rb and lib/digest/sha1.rb |
| 23:22:38 | bakkdoor | where should it stay? |
| 23:22:56 | evan | ha. |
| 23:23:04 | evan | oh geez. |
| 23:23:05 | evan | um. |
| 23:23:08 | evan | go check 1.8 |
| 23:23:13 | bakkdoor | -_- |
| 23:24:15 | bakkdoor | i suppose just keep it in lib/digest/sha1.rb |
| 23:24:50 | bakkdoor | i wonder how this worked before, those files haven't been touched in a while |
| 23:24:54 | brixen | yeah, just have lib/sha1.rb require the other |
| 23:25:03 | brixen | most people require 'digesh/sha1' |
| 23:25:22 | bakkdoor | ok |
| 23:25:25 | bakkdoor | good to know |
| 23:25:26 | bakkdoor | will push |
| 23:25:30 | brixen | k |
| 23:25:45 | steveklabnik | oh man. |
| 23:25:49 | steveklabnik | those docs are the worst too |
| 23:25:54 | steveklabnik | i was trying to look at them the other day |
| 23:26:05 | steveklabnik | all of Digest is spread out over like 6 c and 4 ruby files. |
| 23:29:04 | brixen | I wonder if we should revisit using submodules in the main rubinius repo |
| 23:29:17 | brixen | not for specs, like before, but stuff like the web/ directory |
| 23:29:23 | brixen | and the gems we are making |
| 23:29:49 | brixen | the build step could automatically pull code |
| 23:32:33 | evan | maybe. |
| 23:36:38 | boyscout | Removed duplicate code from lib/sha1.rb and just let it require lib/digest/sha1.rb which has the same wrapper code already - acf6926 - Christopher Bertels |
| 23:39:20 | brixen | evan: that way we could work on the docs with less thrashing in Rubinius itself |
| 23:40:03 | evan | i'm open to it |
| 23:40:04 | brixen | also could be a good way to manage contributions to stuff like the profiler or debugger porcelain |
| 23:40:11 | evan | if you can figure out how to make it work well. |
| 23:40:13 | brixen | ok |
| 23:40:40 | brixen | evan: I'm thinking about making melbourne18, melbourne19, and melbourne20 |
| 23:40:52 | brixen | and you can load any of them with no symbols clashing |
| 23:41:11 | brixen | but break up the code by language version into separate repos |
| 23:41:59 | evan | sure |
| 23:42:20 | brixen | I'd like to do the same with the bytecode compiler without duplicating much code |
| 23:44:02 | evan | i'm a little less comfortable with that. |
| 23:44:06 | evan | but we can talk about it. |
| 23:44:29 | brixen | well, the idea is to have better separation between the language versions |
| 23:44:37 | brixen | we're now going to have 1.8, 1.9 and 2.0 |
| 23:44:55 | brixen | it will also be nice to build a 1.9 or 2.0 version of rbx that has no baggage |
| 23:45:06 | brixen | thinking about how to support this better |