/
2012-07-09.txt
513 lines (513 loc) · 62.7 KB
/
2012-07-09.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
{"nick":"deoxxa","message":"mmalecki: might that be because of that \"lots of tiny writes\" optimisation stuff?","date":"2012-07-09T00:01:12.077Z","type":"message"}
{"nick":"mmalecki","message":"deoxxa: that matches what our load balancer does. is that in the changelog or something?","date":"2012-07-09T00:01:46.379Z","type":"message"}
{"nick":"deoxxa","message":"i just remember a gist pasted a couple of months back that made me lol","date":"2012-07-09T00:02:06.020Z","type":"message"}
{"nick":"mmalecki","message":"oh, I think I know what you mean. is that about string optimisations made by pisci?","date":"2012-07-09T00:02:41.830Z","type":"message"}
{"nick":"deoxxa","message":"pooossibly, i remember it had a catchy little jab at java in the title","date":"2012-07-09T00:03:06.319Z","type":"message"}
{"nick":"mmalecki","message":"lol, I don't remember it","date":"2012-07-09T00:03:28.133Z","type":"message"}
{"nick":"deoxxa","message":"heh","date":"2012-07-09T00:03:39.377Z","type":"message"}
{"nick":"deoxxa","message":"i can't remember much about it except that i lol'd at java (yet again)","date":"2012-07-09T00:03:53.232Z","type":"message"}
{"nick":"mmalecki","message":"well, everyone lol's at java","date":"2012-07-09T00:04:27.404Z","type":"message"}
{"nick":"erickt","reason":"Quit: erickt","date":"2012-07-09T00:15:10.269Z","type":"quit"}
{"nick":"toothrot","reason":"Ping timeout: 240 seconds","date":"2012-07-09T00:15:57.591Z","type":"quit"}
{"nick":"toothr","date":"2012-07-09T00:20:03.220Z","type":"join"}
{"nick":"loladiro_","reason":"Read error: Connection reset by peer","date":"2012-07-09T00:20:19.716Z","type":"quit"}
{"nick":"loladiro","date":"2012-07-09T00:20:24.409Z","type":"join"}
{"nick":"toothr","reason":"Changing host","date":"2012-07-09T00:21:26.082Z","type":"quit"}
{"nick":"toothr","date":"2012-07-09T00:21:26.323Z","type":"join"}
{"nick":"toothr","new_nick":"toothrot","date":"2012-07-09T00:21:30.338Z","type":"nick"}
{"nick":"loladiro","reason":"Read error: Operation timed out","date":"2012-07-09T00:30:35.232Z","type":"quit"}
{"nick":"CIA-108","message":"\u0002libuv:\u000f \u000303Ben Noordhuis\u000f \u000307master\u000f * r\u0002c5761f7\u000f \u000310\u000f/ src/unix/async.c \u0002:\u000f unix: speed up uv_async_send() some more still - http://git.io/G6iQBw","date":"2012-07-09T00:50:07.129Z","type":"message"}
{"nick":"bnoordhuis","message":"^ taking micro-optimization to a whole new level","date":"2012-07-09T00:50:30.560Z","type":"message"}
{"nick":"felixge","date":"2012-07-09T00:52:06.372Z","type":"join"}
{"nick":"felixge","reason":"Changing host","date":"2012-07-09T00:52:07.370Z","type":"quit"}
{"nick":"felixge","date":"2012-07-09T00:52:07.620Z","type":"join"}
{"nick":"travis-ci","date":"2012-07-09T00:52:07.620Z","type":"join"}
{"nick":"travis-ci","message":"[travis-ci] joyent/libuv#488 (master - c5761f7 : Ben Noordhuis): The build is still failing.","date":"2012-07-09T00:52:07.620Z","type":"message"}
{"nick":"travis-ci","message":"[travis-ci] Change view : https://github.com/joyent/libuv/compare/3d9c1ebfeb3f...c5761f72b32b","date":"2012-07-09T00:52:07.620Z","type":"message"}
{"nick":"travis-ci","message":"[travis-ci] Build details : http://travis-ci.org/joyent/libuv/builds/1813267","date":"2012-07-09T00:52:07.621Z","type":"message"}
{"nick":"travis-ci","date":"2012-07-09T00:52:07.621Z","type":"part"}
{"nick":"tjfontaine","message":"oh goodness","date":"2012-07-09T00:52:14.119Z","type":"message"}
{"nick":"bnoordhuis","message":"i've resisted the urge for days","date":"2012-07-09T00:54:56.986Z","type":"message"}
{"nick":"bnoordhuis","message":"but tonight i caved in","date":"2012-07-09T00:55:01.483Z","type":"message"}
{"nick":"bnoordhuis","message":"i confess i don't quite understand why xchg is sometimes so much faster than cmpxchg","date":"2012-07-09T01:08:39.523Z","type":"message"}
{"nick":"bnoordhuis","message":"i mean, it's a simpler operation and it's always at least 10% faster","date":"2012-07-09T01:09:13.882Z","type":"message"}
{"nick":"bnoordhuis","message":"but sometimes it just speeds away and is like several times faster","date":"2012-07-09T01:09:27.666Z","type":"message"}
{"nick":"indutny","message":"haha","date":"2012-07-09T01:14:05.966Z","type":"message"}
{"nick":"indutny","message":"cache","date":"2012-07-09T01:14:06.963Z","type":"message"}
{"nick":"indutny","message":"bnoordhuis: this is a cache,m na","date":"2012-07-09T01:14:11.400Z","type":"message"}
{"nick":"indutny","message":"s/m na/man","date":"2012-07-09T01:14:15.610Z","type":"message"}
{"nick":"bnoordhuis","message":"indutny: it can't be that because both instructions dirty the cache","date":"2012-07-09T01:14:38.301Z","type":"message"}
{"nick":"indutny","message":"you think so?","date":"2012-07-09T01:14:49.364Z","type":"message"}
{"nick":"bnoordhuis","message":"indutny: like that one ion said to another: i'm positive","date":"2012-07-09T01:15:01.584Z","type":"message"}
{"nick":"indutny","message":"sure, you're","date":"2012-07-09T01:16:46.015Z","type":"message"}
{"nick":"indutny","message":"ok, gtg","date":"2012-07-09T01:17:55.372Z","type":"message"}
{"nick":"indutny","message":"Haru Sushi is waiting for us","date":"2012-07-09T01:18:01.880Z","type":"message"}
{"nick":"indutny","message":":D","date":"2012-07-09T01:18:02.147Z","type":"message"}
{"nick":"bnoordhuis","message":"enjoy it, fedor","date":"2012-07-09T01:18:11.793Z","type":"message"}
{"nick":"indutny","message":"bnoordhuis: thanks, ban","date":"2012-07-09T01:20:21.599Z","type":"message"}
{"nick":"indutny","message":"btw, are you going to be in Portugal on lxjs?","date":"2012-07-09T01:20:27.959Z","type":"message"}
{"nick":"bnoordhuis","message":"indutny: probably not","date":"2012-07-09T01:20:35.014Z","type":"message"}
{"nick":"indutny","message":"bnoordhuis: oh, I'm going to visit you then :P","date":"2012-07-09T01:20:54.805Z","type":"message"}
{"nick":"bnoordhuis","message":"indutny: you're coming to the netherlands?","date":"2012-07-09T01:21:09.974Z","type":"message"}
{"nick":"indutny","message":"bnoordhuis: probably yes :D","date":"2012-07-09T01:21:18.983Z","type":"message"}
{"nick":"bnoordhuis","message":"cool","date":"2012-07-09T01:21:27.148Z","type":"message"}
{"nick":"indutny","message":"I think we'll ride over europe","date":"2012-07-09T01:21:28.396Z","type":"message"}
{"nick":"indutny","message":"before going to lxjs","date":"2012-07-09T01:21:35.405Z","type":"message"}
{"nick":"indutny","message":"ok","date":"2012-07-09T01:21:59.996Z","type":"message"}
{"nick":"indutny","message":"ttyl","date":"2012-07-09T01:22:00.937Z","type":"message"}
{"nick":"mmalecki","message":"indutny: and Poland?","date":"2012-07-09T01:24:08.488Z","type":"message"}
{"nick":"abraxas","date":"2012-07-09T01:33:54.761Z","type":"join"}
{"nick":"bnoordhuis","reason":"Ping timeout: 246 seconds","date":"2012-07-09T01:44:46.275Z","type":"quit"}
{"nick":"EhevuTov","reason":"Read error: Connection reset by peer","date":"2012-07-09T01:45:46.722Z","type":"quit"}
{"nick":"EhevuTov","date":"2012-07-09T01:48:32.752Z","type":"join"}
{"nick":"erickt","date":"2012-07-09T02:04:57.574Z","type":"join"}
{"nick":"mmalecki","reason":"Ping timeout: 255 seconds","date":"2012-07-09T02:13:54.842Z","type":"quit"}
{"nick":"EhevuTov","reason":"Quit: This computer has gone to sleep","date":"2012-07-09T02:29:10.730Z","type":"quit"}
{"nick":"erickt","reason":"Quit: erickt","date":"2012-07-09T02:29:34.793Z","type":"quit"}
{"nick":"brson","reason":"Ping timeout: 250 seconds","date":"2012-07-09T02:59:42.407Z","type":"quit"}
{"nick":"dshaw_","reason":"Quit: Leaving.","date":"2012-07-09T03:01:03.293Z","type":"quit"}
{"nick":"dshaw_","date":"2012-07-09T03:06:59.508Z","type":"join"}
{"nick":"indutny","message":"mmalecki: no Poland in plans, sorry","date":"2012-07-09T03:18:40.341Z","type":"message"}
{"nick":"indutny","message":":D","date":"2012-07-09T03:18:41.287Z","type":"message"}
{"nick":"indutny","message":"piscisaureus: have you been in Poland?","date":"2012-07-09T03:18:57.995Z","type":"message"}
{"nick":"indutny","message":"I think my grand-grand-grand-grand-ma was from Poland","date":"2012-07-09T03:19:21.406Z","type":"message"}
{"nick":"indutny","message":"not really sure if I wish to visit this country ever","date":"2012-07-09T03:19:33.569Z","type":"message"}
{"nick":"indutny","message":"bnoordhuis: interesting","date":"2012-07-09T03:35:02.181Z","type":"message"}
{"nick":"indutny","message":"using instricts","date":"2012-07-09T03:35:19.944Z","type":"message"}
{"nick":"dshaw_","reason":"Quit: Leaving.","date":"2012-07-09T03:35:24.431Z","type":"quit"}
{"nick":"indutny","message":"inline all the things!","date":"2012-07-09T03:35:56.961Z","type":"message"}
{"nick":"indutny","message":"so you was sort of inspired about inline assembly","date":"2012-07-09T03:36:09.300Z","type":"message"}
{"nick":"EhevuTov","date":"2012-07-09T03:36:36.838Z","type":"join"}
{"nick":"chobi_e","new_nick":"chobi_e_","date":"2012-07-09T03:43:37.812Z","type":"nick"}
{"nick":"CIA-108","message":"\u0002node:\u000f \u000303Nathan Rajlich\u000f \u000307v0.8\u000f * r\u0002d3d83d7\u000f \u000310\u000f/ (src/node.cc test/simple/test-process-hrtime.js)\u0002:\u000f process: throw a TypeError when anything but an Array is passed to hrtime() - http://git.io/9ahepg","date":"2012-07-09T03:54:24.481Z","type":"message"}
{"nick":"c4milo","date":"2012-07-09T03:54:32.352Z","type":"join"}
{"nick":"chobi_e_","new_nick":"chobi_e","date":"2012-07-09T03:54:53.191Z","type":"nick"}
{"nick":"nathansobo","date":"2012-07-09T04:20:08.500Z","type":"join"}
{"nick":"nathansobo","message":"hi… i'm interested in getting Node.js running inside a Chromium renderer process. since the renderer has its own event loop, it seems like the best approach might be to run Node's event loop on another thread, but register and execute callbacks on the renderer thread since V8 isn't thread safe. I found an example in the libev documentation that does this using locks to protect the event loop data, and using a combination of ","date":"2012-07-09T04:24:53.557Z","type":"message"}
{"nick":"nathansobo","message":"async_send and condition variables to coordinate thread interaction. that example uses some libev hooks that don't seem to have analogs in libuv. does anyone have any thoughts on my approach? am i heading off a cliff here?","date":"2012-07-09T04:24:53.917Z","type":"message"}
{"nick":"indutny","message":"isaacs: hm... ab sometimes goes stuck on latest node","date":"2012-07-09T04:27:15.176Z","type":"message"}
{"nick":"indutny","message":"isaacs: and server starts timing out","date":"2012-07-09T04:27:26.592Z","type":"message"}
{"nick":"indutny","message":"have we seen this before?","date":"2012-07-09T04:27:38.175Z","type":"message"}
{"nick":"indutny","message":"I'm quite sure that ulimit is fine","date":"2012-07-09T04:27:49.639Z","type":"message"}
{"nick":"indutny","message":"probably node, is leaking fds (dunno)","date":"2012-07-09T04:28:03.122Z","type":"message"}
{"nick":"felixge","reason":"Quit: felixge","date":"2012-07-09T04:37:23.287Z","type":"quit"}
{"nick":"indutny","message":"ok, that really looks like v8 fault","date":"2012-07-09T04:37:57.216Z","type":"message"}
{"nick":"indutny","message":"going to rebuild node with older v8","date":"2012-07-09T04:38:05.985Z","type":"message"}
{"nick":"indutny","message":"3.10","date":"2012-07-09T04:40:28.377Z","type":"message"}
{"nick":"brson","date":"2012-07-09T04:41:27.951Z","type":"join"}
{"nick":"felixge","date":"2012-07-09T04:43:08.365Z","type":"join"}
{"nick":"felixge","reason":"Changing host","date":"2012-07-09T04:43:08.684Z","type":"quit"}
{"nick":"felixge","date":"2012-07-09T04:43:08.935Z","type":"join"}
{"nick":"indutny","message":"ok, the same thing with 3.10","date":"2012-07-09T04:45:46.957Z","type":"message"}
{"nick":"c4milo","reason":"Remote host closed the connection","date":"2012-07-09T04:50:04.512Z","type":"quit"}
{"nick":"c4milo","date":"2012-07-09T04:50:30.648Z","type":"join"}
{"nick":"indutny","message":"nathansobo: so you can just use uv_async_send","date":"2012-07-09T04:51:26.339Z","type":"message"}
{"nick":"indutny","message":"and some sort of analogue for the chrome's eventloop","date":"2012-07-09T04:51:51.721Z","type":"message"}
{"nick":"nathansobo","message":"indutny: what about managing mutual exclusion around the loop data structure?","date":"2012-07-09T04:52:11.765Z","type":"message"}
{"nick":"indutny","message":"nathansobo: you just should not change loop from other loop","date":"2012-07-09T04:53:01.569Z","type":"message"}
{"nick":"indutny","message":"nathansobo: the only safe way of interaction with loop from another thread is uv_async_send","date":"2012-07-09T04:53:38.393Z","type":"message"}
{"nick":"c4milo","reason":"Ping timeout: 245 seconds","date":"2012-07-09T04:54:43.383Z","type":"quit"}
{"nick":"nathansobo","message":"libev offers ev_set_loop_release_cb, which takes two callbacks to acquire and release the lock","date":"2012-07-09T04:55:20.097Z","type":"message"}
{"nick":"nathansobo","message":"so you can add a watch while the loop is asleep","date":"2012-07-09T04:55:59.823Z","type":"message"}
{"nick":"indutny","message":"well, why do you need that?","date":"2012-07-09T04:56:12.893Z","type":"message"}
{"nick":"nathansobo","message":"and then do an async send to wake it up","date":"2012-07-09T04:56:13.135Z","type":"message"}
{"nick":"nathansobo","message":"yeah maybe you can help me think of another approach","date":"2012-07-09T04:56:24.869Z","type":"message"}
{"nick":"nathansobo","message":"i want to run node in the renderer thread","date":"2012-07-09T04:56:32.061Z","type":"message"}
{"nick":"indutny","message":"it won't work","date":"2012-07-09T04:56:43.318Z","type":"message"}
{"nick":"nathansobo","message":"basically have javascript be able to access node.js function AND the dom","date":"2012-07-09T04:56:43.765Z","type":"message"}
{"nick":"indutny","message":"node's blocking","date":"2012-07-09T04:56:46.476Z","type":"message"}
{"nick":"nathansobo","message":"that's why i want to run its event loop in another thread","date":"2012-07-09T04:56:57.109Z","type":"message"}
{"nick":"indutny","message":"yes, you should do that","date":"2012-07-09T04:57:03.655Z","type":"message"}
{"nick":"indutny","message":"and you don't need locks for loop","date":"2012-07-09T04:57:17.846Z","type":"message"}
{"nick":"nathansobo","message":"okay… glad we're on the same page there","date":"2012-07-09T04:57:18.087Z","type":"message"}
{"nick":"nathansobo","message":"oh… howcome?","date":"2012-07-09T04:57:28.375Z","type":"message"}
{"nick":"indutny","message":"just uv_async_send","date":"2012-07-09T04:57:38.046Z","type":"message"}
{"nick":"indutny","message":"to invoke some action in node's loop","date":"2012-07-09T04:57:47.607Z","type":"message"}
{"nick":"nathansobo","message":"what if i register a new watch from the renderer thread?","date":"2012-07-09T04:57:54.517Z","type":"message"}
{"nick":"indutny","message":"what's a watch?","date":"2012-07-09T04:58:00.661Z","type":"message"}
{"nick":"indutny","message":"is it some sort of chromium thing?","date":"2012-07-09T04:58:06.631Z","type":"message"}
{"nick":"nathansobo","message":"no, i mean a callback","date":"2012-07-09T04:58:12.173Z","type":"message"}
{"nick":"indutny","message":"callback for what","date":"2012-07-09T04:58:19.297Z","type":"message"}
{"nick":"nathansobo","message":"okay… i'll paint a scenario...","date":"2012-07-09T04:58:30.747Z","type":"message"}
{"nick":"indutny","message":"yeah :)","date":"2012-07-09T04:58:35.058Z","type":"message"}
{"nick":"nathansobo","message":"so i start up my chromium render thread and grab its v8 context, and load up all the node.js bindings into it. then in javascript let's say i want to watch a file on disk. that javascript is running on the renderer thread, and presumably to watch this file the node code has to register a callback on the event loop data structure. but there's another thread (the one that's doing the blocking) accessing that loop structure concurrent","date":"2012-07-09T05:00:53.783Z","type":"message"}
{"nick":"nathansobo","message":"(potentially).","date":"2012-07-09T05:00:54.215Z","type":"message"}
{"nick":"nathansobo","message":"what i'd like to happen is be able to register a callback from the renderer thread (because that's where the javascript vm will be running)","date":"2012-07-09T05:01:17.538Z","type":"message"}
{"nick":"nathansobo","message":"and also have that callback execute on the renderer thread","date":"2012-07-09T05:01:30.141Z","type":"message"}
{"nick":"nathansobo","message":"but do the blocking on io","date":"2012-07-09T05:01:33.435Z","type":"message"}
{"nick":"nathansobo","message":"both libeio and libev seem to offer affordances","date":"2012-07-09T05:01:41.517Z","type":"message"}
{"nick":"nathansobo","message":"to that effect","date":"2012-07-09T05:01:50.163Z","type":"message"}
{"nick":"nathansobo","message":"in case you're interested, there's an example in the libev docs: http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#THREAD_LOCKING_EXAMPLE","date":"2012-07-09T05:02:13.309Z","type":"message"}
{"nick":"indutny","message":"the thing is","date":"2012-07-09T05:02:27.245Z","type":"message"}
{"nick":"indutny","message":"that your concept is invalid","date":"2012-07-09T05:02:32.552Z","type":"message"}
{"nick":"nathansobo","message":"oh, bummer.","date":"2012-07-09T05:02:37.491Z","type":"message"}
{"nick":"indutny","message":":)","date":"2012-07-09T05:02:39.542Z","type":"message"}
{"nick":"indutny","message":"yeah","date":"2012-07-09T05:02:40.740Z","type":"message"}
{"nick":"nathansobo","message":"where am i going wrong?","date":"2012-07-09T05:02:47.827Z","type":"message"}
{"nick":"indutny","message":"you can't load node in chromium's v8 context","date":"2012-07-09T05:02:55.577Z","type":"message"}
{"nick":"indutny","message":"aaah","date":"2012-07-09T05:03:10.225Z","type":"message"}
{"nick":"nathansobo","message":"is there something different about the v8 context that node initializes for itself in node::Start","date":"2012-07-09T05:03:29.595Z","type":"message"}
{"nick":"nathansobo","message":"?","date":"2012-07-09T05:03:30.289Z","type":"message"}
{"nick":"indutny","message":"so you want two loops to run in one thread, each in the times where another is sleeping","date":"2012-07-09T05:03:35.370Z","type":"message"}
{"nick":"indutny","message":"well, that may work","date":"2012-07-09T05:03:48.375Z","type":"message"}
{"nick":"indutny","message":"sorry, it's late night in my place","date":"2012-07-09T05:03:58.228Z","type":"message"}
{"nick":"nathansobo","message":"oh no worries i *really* appreciate you talking to me about this","date":"2012-07-09T05:04:10.456Z","type":"message"}
{"nick":"indutny","message":"I think you may want to look at uv_run_once","date":"2012-07-09T05:04:30.222Z","type":"message"}
{"nick":"indutny","message":"and patch node to run it when chromium's loop isn't busy","date":"2012-07-09T05:04:55.333Z","type":"message"}
{"nick":"nathansobo","message":"that would be for running two event loops in one thread, rather than trying for two threads","date":"2012-07-09T05:05:10.809Z","type":"message"}
{"nick":"indutny","message":"two threads won't work","date":"2012-07-09T05:05:18.693Z","type":"message"}
{"nick":"indutny","message":"really","date":"2012-07-09T05:05:20.167Z","type":"message"}
{"nick":"indutny","message":"there are a lot of nuances, and proper locking would cost much more","date":"2012-07-09T05:05:43.374Z","type":"message"}
{"nick":"indutny","message":"(I suppose)","date":"2012-07-09T05:05:45.822Z","type":"message"}
{"nick":"nathansobo","message":"it's weird because the libev / libeio docs seem to be all about it","date":"2012-07-09T05:05:48.032Z","type":"message"}
{"nick":"nathansobo","message":"but perhaps trying to do it in one thread is better","date":"2012-07-09T05:06:02.112Z","type":"message"}
{"nick":"nathansobo","message":"what i was reading in uv.h is that run once actually blocks","date":"2012-07-09T05:06:12.100Z","type":"message"}
{"nick":"nathansobo","message":"if there are no events","date":"2012-07-09T05:06:14.947Z","type":"message"}
{"nick":"nathansobo","message":"but i think uv could be hacked a bit to poll with a zero timeout","date":"2012-07-09T05:06:32.143Z","type":"message"}
{"nick":"indutny","message":"hm... yes","date":"2012-07-09T05:06:37.029Z","type":"message"}
{"nick":"indutny","message":"you're right","date":"2012-07-09T05:06:39.119Z","type":"message"}
{"nick":"indutny","message":"well, there's another way","date":"2012-07-09T05:06:44.683Z","type":"message"}
{"nick":"nathansobo","message":"but that just seems sad because now we're polling the shit out of this function instead of just blocking on the renderer event loop","date":"2012-07-09T05:07:01.103Z","type":"message"}
{"nick":"indutny","message":"using fibers","date":"2012-07-09T05:07:02.086Z","type":"message"}
{"nick":"indutny","message":"or, in another words, v8 isolates","date":"2012-07-09T05:07:12.373Z","type":"message"}
{"nick":"indutny","message":"err...","date":"2012-07-09T05:07:22.725Z","type":"message"}
{"nick":"nathansobo","message":"maybe that doesn't matter, the polling","date":"2012-07-09T05:07:37.084Z","type":"message"}
{"nick":"indutny","message":"though I'm using wrong words, but you probably get what I'm saying about","date":"2012-07-09T05:07:43.518Z","type":"message"}
{"nick":"nathansobo","message":"about v8 isolates?","date":"2012-07-09T05:08:00.529Z","type":"message"}
{"nick":"indutny","message":"the thing is that you can just do locking around parts where you're accessing v8's context","date":"2012-07-09T05:08:02.811Z","type":"message"}
{"nick":"indutny","message":"hm...","date":"2012-07-09T05:08:32.381Z","type":"message"}
{"nick":"nathansobo","message":"yeah i saw v8 has a Locker class","date":"2012-07-09T05:08:33.083Z","type":"message"}
{"nick":"indutny","message":"right!","date":"2012-07-09T05:08:38.200Z","type":"message"}
{"nick":"indutny","message":"I'm to tired to really consider that","date":"2012-07-09T05:08:49.597Z","type":"message"}
{"nick":"indutny","message":"let me think about it for some time","date":"2012-07-09T05:08:54.227Z","type":"message"}
{"nick":"nathansobo","message":"so in that scenario you could just run node's event loop entirely on another thread","date":"2012-07-09T05:08:59.333Z","type":"message"}
{"nick":"nathansobo","message":"and if it ever needs to execute js or anything","date":"2012-07-09T05:09:09.884Z","type":"message"}
{"nick":"indutny","message":"yes, that's what I'm talking about","date":"2012-07-09T05:09:10.157Z","type":"message"}
{"nick":"nathansobo","message":"it just does it in a locker","date":"2012-07-09T05:09:13.928Z","type":"message"}
{"nick":"indutny","message":"yeah, that won't work","date":"2012-07-09T05:09:16.875Z","type":"message"}
{"nick":"indutny","message":"if you want to execute some node's C++ code from JS","date":"2012-07-09T05:09:26.490Z","type":"message"}
{"nick":"indutny","message":"because it'll be executed in another thread","date":"2012-07-09T05:09:38.035Z","type":"message"}
{"nick":"nathansobo","message":"yeah to subscribe, for example","date":"2012-07-09T05:09:42.181Z","type":"message"}
{"nick":"indutny","message":"indeed","date":"2012-07-09T05:09:45.736Z","type":"message"}
{"nick":"nathansobo","message":"that will be on the renderer thread","date":"2012-07-09T05:09:49.319Z","type":"message"}
{"nick":"indutny","message":"so you'll need to be able to block renderer thread somehow","date":"2012-07-09T05:09:57.458Z","type":"message"}
{"nick":"indutny","message":"like sending async signal to node's thread and waiting on semaphore","date":"2012-07-09T05:10:17.612Z","type":"message"}
{"nick":"nathansobo","message":"i'd be really interested to hear what you think about that libev example i pasted a link to, when you get time","date":"2012-07-09T05:10:30.155Z","type":"message"}
{"nick":"indutny","message":"k","date":"2012-07-09T05:10:43.877Z","type":"message"}
{"nick":"nathansobo","message":"yeah in their example they take advantage of this feature that libev offers","date":"2012-07-09T05:10:49.956Z","type":"message"}
{"nick":"nathansobo","message":"basically you can take control of the function that processes pending events","date":"2012-07-09T05:11:00.506Z","type":"message"}
{"nick":"nathansobo","message":"with ev_set_invoke_pending_cb","date":"2012-07-09T05:11:07.695Z","type":"message"}
{"nick":"isaacs","message":"indutny: master or v0.8?","date":"2012-07-09T05:11:37.914Z","type":"message"}
{"nick":"nathansobo","message":"and in their example, you use that callback to signal the main thread (renderer thread in this case) that events are ready to process","date":"2012-07-09T05:11:39.042Z","type":"message"}
{"nick":"indutny","message":"isaacs: master, and probably 0.8","date":"2012-07-09T05:11:46.745Z","type":"message"}
{"nick":"isaacs","message":"indutny: what os?","date":"2012-07-09T05:11:55.114Z","type":"message"}
{"nick":"indutny","message":"yeah, 0.8 too","date":"2012-07-09T05:12:01.060Z","type":"message"}
{"nick":"indutny","message":"osx","date":"2012-07-09T05:12:01.577Z","type":"message"}
{"nick":"isaacs","message":"weird.","date":"2012-07-09T05:12:04.218Z","type":"message"}
{"nick":"indutny","message":"tried with both siege and ab","date":"2012-07-09T05:12:08.411Z","type":"message"}
{"nick":"isaacs","message":"indutny: can you post an issue with the reproduction steps?","date":"2012-07-09T05:12:22.118Z","type":"message"}
{"nick":"indutny","message":"https://gist.github.com/550a330bc2dc039a696a","date":"2012-07-09T05:12:26.601Z","type":"message"}
{"nick":"isaacs","message":"indutny: it seems to work for me","date":"2012-07-09T05:12:26.847Z","type":"message"}
{"nick":"indutny","message":"that's my ulimit -a","date":"2012-07-09T05:12:31.250Z","type":"message"}
{"nick":"indutny","message":"probably 2560 open files is too small for it?","date":"2012-07-09T05:12:39.409Z","type":"message"}
{"nick":"nathansobo","message":"and then on the renderer thread you basically process all the events and then signal a condition variable","date":"2012-07-09T05:12:40.609Z","type":"message"}
{"nick":"nathansobo","message":"which tells the event loop thread that you're done","date":"2012-07-09T05:12:46.432Z","type":"message"}
{"nick":"nathansobo","message":"and it goes back to sleep","date":"2012-07-09T05:12:49.566Z","type":"message"}
{"nick":"isaacs","message":"indutny: yes, most likely","date":"2012-07-09T05:12:56.153Z","type":"message"}
{"nick":"isaacs","message":"indutny: what's your ab setting?","date":"2012-07-09T05:13:01.683Z","type":"message"}
{"nick":"indutny","message":"ah","date":"2012-07-09T05:13:11.513Z","type":"message"}
{"nick":"indutny","message":"no, it still hangs","date":"2012-07-09T05:13:20.301Z","type":"message"}
{"nick":"indutny","message":"ab -n 12000 -c 100 http://localhost:8080/","date":"2012-07-09T05:13:26.635Z","type":"message"}
{"nick":"isaacs","message":"indutny: what's the ab command?","date":"2012-07-09T05:13:27.010Z","type":"message"}
{"nick":"isaacs","message":"-c100 should be fine","date":"2012-07-09T05:13:31.817Z","type":"message"}
{"nick":"indutny","message":"even with ulimit -n 10000","date":"2012-07-09T05:13:32.059Z","type":"message"}
{"nick":"indutny","message":"indeed","date":"2012-07-09T05:13:35.475Z","type":"message"}
{"nick":"isaacs","message":"well within 2560","date":"2012-07-09T05:13:37.188Z","type":"message"}
{"nick":"isaacs","message":"indutny: does it work with 127.0.0.1:8080?","date":"2012-07-09T05:13:50.713Z","type":"message"}
{"nick":"isaacs","message":"instead of \"localhost\"?","date":"2012-07-09T05:13:54.552Z","type":"message"}
{"nick":"indutny","message":"one sec","date":"2012-07-09T05:13:56.287Z","type":"message"}
{"nick":"indutny","message":"nope","date":"2012-07-09T05:14:09.697Z","type":"message"}
{"nick":"indutny","message":"more interesting","date":"2012-07-09T05:14:18.565Z","type":"message"}
{"nick":"indutny","message":"it hangs on second run of that ab command","date":"2012-07-09T05:14:24.507Z","type":"message"}
{"nick":"isaacs","message":"indutny: what's the server?","date":"2012-07-09T05:14:38.532Z","type":"message"}
{"nick":"indutny","message":"and opening page from chrome works atm","date":"2012-07-09T05:14:40.443Z","type":"message"}
{"nick":"indutny","message":"http.createServer(function(req, res) {","date":"2012-07-09T05:14:48.260Z","type":"message"}
{"nick":"indutny","message":" res.end('');","date":"2012-07-09T05:14:48.501Z","type":"message"}
{"nick":"indutny","message":"}).listen(8080, function() {","date":"2012-07-09T05:14:48.501Z","type":"message"}
{"nick":"indutny","message":" console.log('listening');","date":"2012-07-09T05:14:48.501Z","type":"message"}
{"nick":"indutny","message":"})","date":"2012-07-09T05:14:48.501Z","type":"message"}
{"nick":"isaacs","message":"also, review? https://github.com/isaacs/node/commit/e3aafac6c6df992141c1303af0ba11a71e8a946f","date":"2012-07-09T05:15:01.883Z","type":"message"}
{"nick":"indutny","message":"nothing relevant in server's code","date":"2012-07-09T05:15:02.121Z","type":"message"}
{"nick":"indutny","message":"one sec","date":"2012-07-09T05:15:06.617Z","type":"message"}
{"nick":"mikeal","reason":"Quit: Leaving.","date":"2012-07-09T05:15:14.886Z","type":"quit"}
{"nick":"isaacs","message":"indutny: works for me just fine","date":"2012-07-09T05:16:10.615Z","type":"message"}
{"nick":"indutny","message":"ohh","date":"2012-07-09T05:16:30.752Z","type":"message"}
{"nick":"indutny","message":"may be that's my VPN killing it","date":"2012-07-09T05:16:38.851Z","type":"message"}
{"nick":"indutny","message":"one sec","date":"2012-07-09T05:16:40.500Z","type":"message"}
{"nick":"isaacs","message":"lol","date":"2012-07-09T05:16:55.080Z","type":"message"}
{"nick":"indutny","message":"nope, it isn't","date":"2012-07-09T05:16:57.938Z","type":"message"}
{"nick":"isaacs","message":"yes, vpn's often have problems with stuff like that :)","date":"2012-07-09T05:17:04.055Z","type":"message"}
{"nick":"isaacs","message":"oh, ok","date":"2012-07-09T05:17:07.278Z","type":"message"}
{"nick":"indutny","message":"at least I turned it off","date":"2012-07-09T05:17:12.721Z","type":"message"}
{"nick":"indutny","message":"and it still does the same thing","date":"2012-07-09T05:17:17.569Z","type":"message"}
{"nick":"isaacs","message":"well... like i said, works here.","date":"2012-07-09T05:17:27.298Z","type":"message"}
{"nick":"indutny","message":"most interesting thing is that node isn't actually hanging","date":"2012-07-09T05:17:29.410Z","type":"message"}
{"nick":"isaacs","message":"i'm on the 0.8.2-release","date":"2012-07-09T05:17:34.982Z","type":"message"}
{"nick":"indutny","message":"so if I'll add setInterval(...) it'll constantly log data","date":"2012-07-09T05:17:41.754Z","type":"message"}
{"nick":"isaacs","message":"yeah, probably ab is busted.","date":"2012-07-09T05:17:47.749Z","type":"message"}
{"nick":"isaacs","message":"it's not a very good program, it' sjust the one everyone uses","date":"2012-07-09T05:17:55.187Z","type":"message"}
{"nick":"indutny","message":"probably","date":"2012-07-09T05:18:11.419Z","type":"message"}
{"nick":"indutny","message":"but siege fails too","date":"2012-07-09T05:18:13.906Z","type":"message"}
{"nick":"indutny","message":"isaacs: btw, on your commit","date":"2012-07-09T05:18:21.780Z","type":"message"}
{"nick":"indutny","message":"lgtm","date":"2012-07-09T05:18:48.174Z","type":"message"}
{"nick":"indutny","message":":D","date":"2012-07-09T05:18:49.165Z","type":"message"}
{"nick":"isaacs","message":"kewl, thanks","date":"2012-07-09T05:18:55.048Z","type":"message"}
{"nick":"isaacs","message":"i was looking for this for so long","date":"2012-07-09T05:19:06.096Z","type":"message"}
{"nick":"isaacs","message":"it's a small memory leak, but a definite one.","date":"2012-07-09T05:19:14.268Z","type":"message"}
{"nick":"indutny","message":"yeah, I read zlib's readme","date":"2012-07-09T05:19:21.379Z","type":"message"}
{"nick":"indutny","message":"it deallocates some internal buffer","date":"2012-07-09T05:19:26.534Z","type":"message"}
{"nick":"isaacs","message":"yep","date":"2012-07-09T05:19:29.754Z","type":"message"}
{"nick":"indutny","action":"is that related to unzip() leak problem?","date":"2012-07-09T05:19:50.896Z","type":"action"}
{"nick":"indutny","message":"oops","date":"2012-07-09T05:19:52.845Z","type":"message"}
{"nick":"piscisaureus_","date":"2012-07-09T05:20:03.748Z","type":"join"}
{"nick":"CIA-108","message":"\u0002node:\u000f \u000303isaacs\u000f \u000307v0.8\u000f * r\u0002d2cd456\u000f \u000310\u000f/ src/node_zlib.cc \u0002:\u000f zlib: Call inflateEnd for UNZIP. Fixes memory leak. - http://git.io/gCNaFw","date":"2012-07-09T05:20:25.105Z","type":"message"}
{"nick":"isaacs","message":"indutny: yes, that's the one.","date":"2012-07-09T05:21:16.847Z","type":"message"}
{"nick":"mikeal","date":"2012-07-09T05:21:24.500Z","type":"join"}
{"nick":"isaacs","message":"gunzip() works fine, but unzip() leaks like 2048b of memory, exactly, every iteration","date":"2012-07-09T05:21:34.620Z","type":"message"}
{"nick":"isaacs","message":"like clockwork","date":"2012-07-09T05:21:46.181Z","type":"message"}
{"nick":"isaacs","message":"oh, wait, a fucking typo.","date":"2012-07-09T05:22:19.034Z","type":"message"}
{"nick":"indutny","message":"k","date":"2012-07-09T05:22:30.414Z","type":"message"}
{"nick":"indutny","message":"I've created an issue: https://github.com/joyent/node/issues/3670","date":"2012-07-09T05:22:38.325Z","type":"message"}
{"nick":"indutny","message":"going to sleep now","date":"2012-07-09T05:22:48.646Z","type":"message"}
{"nick":"indutny","message":"ttyl","date":"2012-07-09T05:22:49.365Z","type":"message"}
{"nick":"CIA-108","message":"\u0002node:\u000f \u000303isaacs\u000f \u000307v0.8\u000f * r\u0002bf539f9\u000f \u000310\u000f/ src/node_zlib.cc \u0002:\u000f zlib: Call inflateEnd for UNZIP. Fixes memory leak. - http://git.io/25NvbQ","date":"2012-07-09T05:23:05.269Z","type":"message"}
{"nick":"isaacs","message":"you saw nothing.","date":"2012-07-09T05:23:05.794Z","type":"message"}
{"nick":"indutny","message":"hahah","date":"2012-07-09T05:23:23.815Z","type":"message"}
{"nick":"indutny","message":"FORCE PUSH","date":"2012-07-09T05:23:27.941Z","type":"message"}
{"nick":"LOUDBOT","message":"GET OUT OR I WILL KICK BAN YOU","date":"2012-07-09T05:23:28.790Z","type":"message"}
{"nick":"isaacs","message":"10-second rule :)","date":"2012-07-09T05:23:35.080Z","type":"message"}
{"nick":"indutny","message":"=== is my often C++ error","date":"2012-07-09T05:23:50.859Z","type":"message"}
{"nick":"indutny","message":"s/error/mistake","date":"2012-07-09T05:23:55.150Z","type":"message"}
{"nick":"indutny","message":"ok, time for shower","date":"2012-07-09T05:23:59.381Z","type":"message"}
{"nick":"isaacs","message":"i'd put some debugging code around there, and didn't re-check it after removing it","date":"2012-07-09T05:23:59.715Z","type":"message"}
{"nick":"indutny","message":"haha","date":"2012-07-09T05:24:04.536Z","type":"message"}
{"nick":"indutny","message":"yeah, that happens","date":"2012-07-09T05:24:07.511Z","type":"message"}
{"nick":"isaacs","message":"but yeah, === in C++","date":"2012-07-09T05:24:11.520Z","type":"message"}
{"nick":"isaacs","message":"lame","date":"2012-07-09T05:24:14.081Z","type":"message"}
{"nick":"isaacs","message":"we should just define it as an operator in node.h","date":"2012-07-09T05:24:21.026Z","type":"message"}
{"nick":"isaacs","message":"so === gets converted to == silently for us","date":"2012-07-09T05:24:27.998Z","type":"message"}
{"nick":"isaacs","message":"i'm off too. gnite","date":"2012-07-09T05:26:14.544Z","type":"message"}
{"nick":"paddybyers","date":"2012-07-09T05:26:42.532Z","type":"join"}
{"nick":"piscisaureus_","reason":"Ping timeout: 246 seconds","date":"2012-07-09T05:47:38.205Z","type":"quit"}
{"nick":"mikeal","reason":"Quit: Leaving.","date":"2012-07-09T06:03:57.170Z","type":"quit"}
{"nick":"mikeal","date":"2012-07-09T06:10:54.347Z","type":"join"}
{"nick":"piscisaureus_","date":"2012-07-09T06:18:23.172Z","type":"join"}
{"nick":"brson","reason":"Quit: leaving","date":"2012-07-09T06:37:39.545Z","type":"quit"}
{"nick":"stephank","reason":"Quit: *Poof!*","date":"2012-07-09T07:11:38.835Z","type":"quit"}
{"nick":"rendar","date":"2012-07-09T07:12:49.431Z","type":"join"}
{"type":"message","nick":"@isaacs","message":"I think it's clear that we need more real-world use case examples, though","date":"2012-07-09T18:22:08.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"isaacs: perhaps, but if had two isolated clusters in the same process, it would only mean that if anything breaks both clusters breaks and you will have a lot of downtime.","date":"2012-07-09T18:22:15.000Z"}
{"type":"message","nick":"@isaacs","message":"right","date":"2012-07-09T18:22:35.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"isaacs: I agree with that, the testcase use case is not important.","date":"2012-07-09T18:22:36.000Z"}
{"type":"message","nick":"@isaacs","message":"what you usually want is for the master to be basically nothing but a thing that manages workers, and does nothing else.","date":"2012-07-09T18:23:11.000Z"}
{"type":"message","nick":"@isaacs","message":"and then workers do all the work, and if they crash or blow up, then the master creates a new one","date":"2012-07-09T18:23:27.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"isaacs: exactly","date":"2012-07-09T18:23:30.000Z"}
{"type":"message","nick":"@isaacs","message":"if you have two tasks, then just create two clusters.","date":"2012-07-09T18:23:44.000Z"}
{"type":"message","nick":"@isaacs","message":"two master.","date":"2012-07-09T18:23:47.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"isaacs: the master should be so simple that you will never need to restart it","date":"2012-07-09T18:23:54.000Z"}
{"type":"message","nick":"@isaacs","message":"and your SFM or init or whatever can take care of that","date":"2012-07-09T18:24:05.000Z"}
{"type":"message","nick":"@isaacs","message":"node task-one.js --workers=2 ; node task-two.js --workers=6","date":"2012-07-09T18:24:21.000Z"}
{"type":"message","nick":"@isaacs","message":"i think i basically agree with you. it's just that the API is a little bit inflexible.","date":"2012-07-09T18:24:47.000Z"}
{"type":"message","nick":"@isaacs","message":"but if we're going to add a bunch of complexity JUST for some flexibility that might one day be useful, then that's not really the right choice.","date":"2012-07-09T18:25:07.000Z"}
{"type":"message","nick":"@isaacs","message":"someone has to actually need it today, in a way that can't be handled more simply by doing some other thing.","date":"2012-07-09T18:25:31.000Z"}
{"type":"message","nick":"@isaacs","message":"AndreasMadsen: have you seen my cluster-master module?","date":"2012-07-09T18:26:06.000Z"}
{"type":"message","nick":"@isaacs","message":"AndreasMadsen: i'm using it on npm-www, and it's really nice.","date":"2012-07-09T18:26:13.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"isaacs: yes, i did","date":"2012-07-09T18:26:20.000Z"}
{"type":"message","nick":"@isaacs","message":"i push new code, then HUP the master, and it reloads all the workers gracefully","date":"2012-07-09T18:26:20.000Z"}
{"type":"message","nick":"@isaacs","message":"it's still a bit vulnerable to fast crashes","date":"2012-07-09T18:26:41.000Z"}
{"type":"message","nick":"@isaacs","message":"like, if there's a route that throws, and everyone hits it at once, then it'll bring down the server, cuz it's kinda dumb.","date":"2012-07-09T18:27:00.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"isaacs: using disconnect? I looked at it, before that feature was introduced.","date":"2012-07-09T18:27:01.000Z"}
{"type":"message","nick":"@isaacs","message":"AndreasMadsen: well, the worker just calls server.close() when there's an error caught by a domain. then the master sees the disconnect, and spawns a new worker to replace it, and if it's not gone by 2 seconds, it kills it forcibly.","date":"2012-07-09T18:27:39.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"isaacs: ahh, perfect :)","date":"2012-07-09T18:28:01.000Z"}
{"type":"message","nick":"@isaacs","message":"also, when you HUP, it spawns a new worker first, waits to make sure it stays up for 2 seconds, and then does a graceful restart.","date":"2012-07-09T18:28:26.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"isaacs: I thougt about extending process.send(Server) so Server don't take any connections if Server.lisenters('connect') === 0, that way cluster could almost be an extern module without using any internal API.","date":"2012-07-09T18:29:10.000Z"}
{"type":"message","nick":"@isaacs","message":"but the close-on-error thing is not quite resilient. what i need to do is have the worker send a message to the master, saying, \"I had an error, can I shut down?\" and then the master gives it permission.","date":"2012-07-09T18:29:19.000Z"}
{"type":"message","nick":"@isaacs","message":"AndreasMadsen: yeah, i'd like for cluster to not rely on any internal APIs.","date":"2012-07-09T18:30:03.000Z"}
{"type":"message","nick":"@isaacs","message":"AndreasMadsen: if it was userland-able, then we could tell people to just write their own cluster module, using the builtin as an example.","date":"2012-07-09T18:30:17.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"isaacs: ^ that should be perfectly doable, process.send is sync (wtf)","date":"2012-07-09T18:30:44.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"> \"I had an error, can I shut down?\"","date":"2012-07-09T18:30:56.000Z"}
{"type":"message","nick":"@isaacs","message":"yeah, we need to fix that.","date":"2012-07-09T18:31:00.000Z"}
{"type":"message","nick":"@isaacs","message":"process.send should not be sync","date":"2012-07-09T18:31:04.000Z"}
{"type":"message","nick":"@isaacs","message":"AndreasMadsen: well, the error is caught by a domain.","date":"2012-07-09T18:31:23.000Z"}
{"type":"message","nick":"@isaacs","message":"but if 8 people hit the same error in rapid succession, then all the workers will shut down","date":"2012-07-09T18:31:37.000Z"}
{"type":"message","nick":"@isaacs","message":"ie, server.close()","date":"2012-07-09T18:31:43.000Z"}
{"type":"message","nick":"@isaacs","message":"now i'm not serving requests.","date":"2012-07-09T18:31:47.000Z"}
{"type":"message","nick":"@isaacs","message":"they should wait to call server.close() until the master has spawned their replacement","date":"2012-07-09T18:32:11.000Z"}
{"type":"message","nick":"@isaacs","message":"worker-A domain.error -> \"i got an error, lmk when i can shut down\", master spawns fresh worker-B, master tells worker-A \"ok, close\", worker-A calls server.close()","date":"2012-07-09T18:33:04.000Z"}
{"type":"message","nick":"@isaacs","message":"2 seconds later, if worker-a is still alive, master kills it","date":"2012-07-09T18:33:14.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"isaacs: the right solution would be for the OS to pause the new requests until a new server is attached. I never liked the idea about delaying throws. But what you suggest is perfectly doable with process.send.","date":"2012-07-09T18:33:20.000Z"}
{"type":"message","nick":"@isaacs","message":"well, there should never be a throw that actually crashes the server.","date":"2012-07-09T18:33:43.000Z"}
{"type":"message","nick":"@isaacs","message":"it'll just hit the domain, and then the domain will know what to do about it","date":"2012-07-09T18:33:58.000Z"}
{"type":"message","nick":"@isaacs","message":"but keep in mind, there are 7 other workers","date":"2012-07-09T18:34:20.000Z"}
{"type":"message","nick":"@isaacs","message":"of course, if send is async, you might get one or two reqs in before you get a response, but meh.","date":"2012-07-09T18:43:06.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"isaacs: as I said the perfect right solution would be for the OS/master to pause the request until a worker is online. Restarting a worker don't take long time, so the client won't really notic. The important thing is that there request didn't die.","date":"2012-07-09T18:43:07.000Z"}
{"type":"message","nick":"@isaacs","message":"you might have gotten that anyway","date":"2012-07-09T18:43:10.000Z"}
{"type":"message","nick":"@isaacs","message":"restarting a worker takes a long time.","date":"2012-07-09T18:43:19.000Z"}
{"type":"message","nick":"@isaacs","message":"several milliseconds.","date":"2012-07-09T18:43:25.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"isaacs: can you count that","date":"2012-07-09T18:43:33.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"in your head","date":"2012-07-09T18:43:39.000Z"}
{"type":"message","nick":"@isaacs","message":"sometimes several hundred","date":"2012-07-09T18:43:42.000Z"}
{"type":"message","nick":"@isaacs","message":"i read config files, do sync IO for require(), etc.","date":"2012-07-09T18:43:53.000Z"}
{"type":"message","nick":"@isaacs","message":"you'll see more reqs hit in that time than in the time it takes to ask for permission to close","date":"2012-07-09T18:44:16.000Z"}
{"type":"message","nick":"AndreasMadsen","message":"isaacs: right, but the 100 ms it takes to restart a worker, is not much in an Internet request.","date":"2012-07-09T18:44:52.000Z"}
{"type":"message","nick":"@isaacs","message":"and server.close() just takes it out of rotation. it'll still serve requests that it's already accepted","date":"2012-07-09T18:44:53.000Z"}
{"nick":"isaacs","message":"AndreasMadsen: it's slow enough taht if i do `svcadm restart npm-www` and then hit refresh, I get a blank screen 3 or 4 times.","date":"2012-07-09T18:46:28.661Z","type":"message"}
{"nick":"dap","reason":"Quit: Leaving.","date":"2012-07-09T18:46:44.292Z","type":"quit"}
{"nick":"isaacs","message":"and that's just before the first worker comes on","date":"2012-07-09T18:46:44.624Z","type":"message"}
{"nick":"isaacs","message":"if i HUP it, there's no downtime.","date":"2012-07-09T18:46:57.326Z","type":"message"}
{"nick":"isaacs","message":"why should other requests wait for 200ms or more for a new worker?","date":"2012-07-09T18:47:27.812Z","type":"message"}
{"nick":"isaacs","message":"what if there are half a dozen people all hitting the same error? then we wait for all the workers to be online?","date":"2012-07-09T18:47:47.382Z","type":"message"}
{"nick":"AndreasMadsen","message":"isaacs: no, just one","date":"2012-07-09T18:48:10.862Z","type":"message"}
{"nick":"AndreasMadsen","message":"isaacs: ideally they shouldn't and it is only in the edgecase. But it will prevent downtime (I'm only interested in what there will actually provoke the client) and dirty workers.","date":"2012-07-09T18:49:51.992Z","type":"message"}
{"nick":"isaacs","message":"yeah, so, the choice is: a) downtime, b) dirty workers, or c) slower responses.","date":"2012-07-09T18:50:29.384Z","type":"message"}
{"nick":"AndreasMadsen","message":"isaacs: yep, pick one","date":"2012-07-09T18:50:52.001Z","type":"message"}
{"nick":"isaacs","message":"i don't think (b) is all that bad (since you can't *fully* prevent it anyway), and it's easy to minimize.","date":"2012-07-09T18:51:29.765Z","type":"message"}
{"nick":"isaacs","message":"you can't fully prevent it becasue there will probably already be multiple requests being served at the time that the error occurs.","date":"2012-07-09T18:51:52.833Z","type":"message"}
{"nick":"isaacs","message":"and those others are now being served by a dirty worker.","date":"2012-07-09T18:52:03.534Z","type":"message"}
{"nick":"AndreasMadsen","message":"isaacs: I agree.","date":"2012-07-09T18:52:04.648Z","type":"message"}
{"nick":"isaacs","message":"so what? it'll work mostly.","date":"2012-07-09T18:52:06.931Z","type":"message"}
{"nick":"isaacs","message":"if your server is built properly, in fact, there's probably nothing wrong with just keeping it alive forever, even if there is an error.","date":"2012-07-09T18:52:35.228Z","type":"message"}
{"nick":"AndreasMadsen","message":"isaacs: perfection is an illusion. You can come seriously close, but you will never hit perfection. ","date":"2012-07-09T18:53:00.934Z","type":"message"}
{"nick":"isaacs","message":"but since errors are necessarily unintended and unexpected, it's not very wise to assume that that's ok","date":"2012-07-09T18:53:05.374Z","type":"message"}
{"nick":"isaacs","message":"yes","date":"2012-07-09T18:53:09.863Z","type":"message"}
{"nick":"AndreasMadsen","message":"isaacs: something totally different, would this offend you https://github.com/isaacs/npm/issues/2588","date":"2012-07-09T18:54:54.917Z","type":"message"}
{"nick":"AndreasMadsen","message":"?","date":"2012-07-09T18:54:59.432Z","type":"message"}
{"nick":"isaacs","message":"AndreasMadsen: never gonna happen, sorry.","date":"2012-07-09T18:55:33.456Z","type":"message"}
{"nick":"isaacs","message":"AndreasMadsen: it's assumed in SOO many places that the folder will be named 'node_modules'","date":"2012-07-09T18:55:50.289Z","type":"message"}
{"nick":"isaacs","message":"AndreasMadsen: just have piccolo use the same folder name.","date":"2012-07-09T18:55:57.653Z","type":"message"}
{"nick":"tjfontaine","message":"or check for one or the other?","date":"2012-07-09T18:56:07.165Z","type":"message"}
{"nick":"isaacs","message":"tjfontaine: if only it was that simple...","date":"2012-07-09T18:56:16.153Z","type":"message"}
{"nick":"tjfontaine","message":"isaacs: I mean for piccolo, not npm","date":"2012-07-09T18:56:27.557Z","type":"message"}
{"nick":"AndreasMadsen","message":"isaacs: that can happen, sorry. That would result in node modules being send to the client.","date":"2012-07-09T18:56:41.931Z","type":"message"}
{"nick":"AndreasMadsen","message":"s/can/can't","date":"2012-07-09T18:56:51.044Z","type":"message"}
{"nick":"isaacs","message":"$ git grep node_modules | egrep -v 'gitignore|npmignore|doc|man|package.json|README' | wc -l","date":"2012-07-09T18:57:40.766Z","type":"message"}
{"nick":"isaacs","message":" 96","date":"2012-07-09T18:57:43.733Z","type":"message"}
{"nick":"isaacs","message":"the shitstorm that arose from even trying that out for a brief moment back in 0.3 caused such huge catastrophes that took me weeks to fix.","date":"2012-07-09T18:59:20.089Z","type":"message"}
{"nick":"isaacs","message":"everyone wants to name it something different.","date":"2012-07-09T18:59:28.596Z","type":"message"}
{"nick":"isaacs","message":"then nothing works.","date":"2012-07-09T18:59:33.335Z","type":"message"}
{"nick":"AndreasMadsen","message":"isaacs: I do understand why it can't happen. It is just so sad, that this sort of complexity is whats killing (not exactly) a really good project.","date":"2012-07-09T19:00:43.691Z","type":"message"}
{"nick":"isaacs","message":"npm install --node_modules=isaacs_awesome_modules ..","date":"2012-07-09T19:00:46.538Z","type":"message"}
{"nick":"isaacs","message":"npm's not so big. just fork it and perl -pi -e it ","date":"2012-07-09T19:01:23.362Z","type":"message"}
{"nick":"isaacs","message":"how bad can it be!?","date":"2012-07-09T19:01:31.706Z","type":"message"}
{"nick":"isaacs","message":"i do want to move more of its guts out into the open.","date":"2012-07-09T19:01:52.137Z","type":"message"}
{"nick":"isaacs","message":"which should make it easier to build sort of what your'e asking for, using the parts of npm that make sense, but without adding complexity to npm itself about that","date":"2012-07-09T19:02:17.350Z","type":"message"}
{"nick":"AndreasMadsen","message":"isaacs: it can be bad, npm publish is very understood and highly used. If I have to implement that in another subroutine/program that would require users to do both npm publish && pick (or whatever) publish - since piccolo is hardly known that would be a real blocker.","date":"2012-07-09T19:04:26.939Z","type":"message"}
{"nick":"isaacs","message":"AndreasMadsen: or you can build a system that requires less ocean-boiling. just accept that people will publish modules to npm, and figure out how to leverage what's already there.","date":"2012-07-09T19:05:45.058Z","type":"message"}
{"nick":"isaacs","message":"AndreasMadsen: browserify does this very well, i think","date":"2012-07-09T19:06:09.548Z","type":"message"}
{"nick":"isaacs","message":"ok, i'm gonna get lunch and head into the office. have a nice evening :)","date":"2012-07-09T19:06:25.417Z","type":"message"}
{"nick":"AndreasMadsen","message":"interesting, will look intro it.","date":"2012-07-09T19:07:29.598Z","type":"message"}
{"nick":"mjr___","date":"2012-07-09T19:25:08.435Z","type":"join"}
{"nick":"mjr_","reason":"Read error: Connection reset by peer","date":"2012-07-09T19:25:08.829Z","type":"quit"}
{"nick":"mjr___","new_nick":"mjr_","date":"2012-07-09T19:25:09.072Z","type":"nick"}
{"nick":"mikeal","reason":"Quit: Leaving.","date":"2012-07-09T19:31:04.106Z","type":"quit"}
{"nick":"AndreasMadsen","reason":"Remote host closed the connection","date":"2012-07-09T19:43:47.412Z","type":"quit"}
{"nick":"xaq","reason":"Read error: Connection reset by peer","date":"2012-07-09T19:44:04.558Z","type":"quit"}
{"nick":"AndreasMadsen","date":"2012-07-09T19:44:07.451Z","type":"join"}
{"nick":"xaq","date":"2012-07-09T19:44:38.999Z","type":"join"}
{"nick":"mjr_","reason":"Read error: Connection reset by peer","date":"2012-07-09T19:48:52.035Z","type":"quit"}
{"nick":"mjr_","date":"2012-07-09T19:49:09.526Z","type":"join"}
{"nick":"TooTallNate","message":"bnoordhuis: hey i can get you shell access to an OSX machine if you wanna work on the /dev/tty thing","date":"2012-07-09T19:52:38.918Z","type":"message"}
{"nick":"mikeal","date":"2012-07-09T19:53:44.061Z","type":"join"}
{"nick":"hz","date":"2012-07-09T19:57:15.076Z","type":"join"}
{"nick":"mikeal","reason":"Client Quit","date":"2012-07-09T19:57:47.874Z","type":"quit"}
{"nick":"piscisaureus_","message":"hah","date":"2012-07-09T19:59:15.978Z","type":"message"}
{"nick":"piscisaureus_","message":"<3 automation","date":"2012-07-09T19:59:19.053Z","type":"message"}
{"nick":"piscisaureus_","message":"https://gist.github.com/3078540","date":"2012-07-09T19:59:20.519Z","type":"message"}
{"nick":"TooTallNate","message":"piscisaureus_: nice :)","date":"2012-07-09T20:09:08.210Z","type":"message"}
{"nick":"piscisaureus_","message":"hopefully it won't be too painful to do libuv releases now :-)","date":"2012-07-09T20:09:51.144Z","type":"message"}
{"nick":"piscisaureus_","message":"Now to upload tarballs to libuv.org","date":"2012-07-09T20:10:04.532Z","type":"message"}
{"nick":"piscisaureus_","message":"now for bnoordhuis to add an autoconf script","date":"2012-07-09T20:10:39.504Z","type":"message"}
{"nick":"piscisaureus_","message":"and the distros are ours _p","date":"2012-07-09T20:10:45.394Z","type":"message"}
{"nick":"mmalecki","reason":"Quit: leaving","date":"2012-07-09T20:11:40.752Z","type":"quit"}
{"nick":"loladiro","reason":"Ping timeout: 264 seconds","date":"2012-07-09T20:17:08.082Z","type":"quit"}
{"nick":"loladiro","date":"2012-07-09T20:18:56.318Z","type":"join"}
{"nick":"`3rdEden","reason":"Quit: Leaving...","date":"2012-07-09T20:25:04.831Z","type":"quit"}
{"nick":"piscisaureus_","message":"\u000301","date":"2012-07-09T20:26:58.046Z","type":"message"}
{"nick":"piscisaureus_","message":"\u0003\u000301http://www.youtube.com/watch?v=nIwrgAnx6Q8&feature=youtube_gdata_player","date":"2012-07-09T20:26:58.286Z","type":"message"}
{"nick":"piscisaureus_","message":"sleepy time now","date":"2012-07-09T20:27:06.195Z","type":"message"}
{"nick":"piscisaureus_","reason":"Quit: ~ Trillian Astra - www.trillian.im ~","date":"2012-07-09T20:27:09.175Z","type":"quit"}
{"nick":"bradleymeck","date":"2012-07-09T20:29:50.845Z","type":"join"}
{"nick":"bradleymeck","message":"is the js http parser lying around on some fork/branch or is it not developed yet?","date":"2012-07-09T20:30:22.103Z","type":"message"}
{"nick":"loladiro_","date":"2012-07-09T20:30:56.329Z","type":"join"}
{"nick":"loladiro","reason":"Ping timeout: 244 seconds","date":"2012-07-09T20:33:14.359Z","type":"quit"}
{"nick":"loladiro_","new_nick":"loladiro","date":"2012-07-09T20:33:14.605Z","type":"nick"}
{"nick":"EhevuTov","reason":"Quit: Leaving","date":"2012-07-09T20:37:01.042Z","type":"quit"}
{"nick":"`3rdEden","date":"2012-07-09T20:47:21.075Z","type":"join"}
{"nick":"EhevuTov","date":"2012-07-09T20:48:48.206Z","type":"join"}
{"nick":"bradleymeck","reason":"Quit: bradleymeck","date":"2012-07-09T20:52:34.581Z","type":"quit"}
{"nick":"`3rdEden","reason":"Quit: Linkinus - http://linkinus.com","date":"2012-07-09T20:54:53.471Z","type":"quit"}
{"nick":"arlolra","date":"2012-07-09T21:02:45.804Z","type":"join"}
{"nick":"loladiro","reason":"Ping timeout: 245 seconds","date":"2012-07-09T21:03:03.448Z","type":"quit"}
{"nick":"paddybyers_","date":"2012-07-09T21:08:52.414Z","type":"join"}
{"nick":"paddybyers","reason":"Ping timeout: 240 seconds","date":"2012-07-09T21:10:27.600Z","type":"quit"}
{"nick":"paddybyers_","new_nick":"paddybyers","date":"2012-07-09T21:10:27.845Z","type":"nick"}
{"nick":"AndreasMadsen","reason":"Remote host closed the connection","date":"2012-07-09T21:25:45.342Z","type":"quit"}
{"nick":"loladiro","date":"2012-07-09T21:27:30.006Z","type":"join"}
{"nick":"paddybyers_","date":"2012-07-09T21:45:23.998Z","type":"join"}
{"nick":"bnoordhuis","message":"back","date":"2012-07-09T21:46:44.946Z","type":"message"}
{"nick":"EhevuTov","reason":"Quit: This computer has gone to sleep","date":"2012-07-09T21:46:46.055Z","type":"quit"}
{"nick":"bradleymeck","date":"2012-07-09T21:47:52.786Z","type":"join"}
{"nick":"paddybyers","reason":"Ping timeout: 245 seconds","date":"2012-07-09T21:48:53.386Z","type":"quit"}
{"nick":"paddybyers_","new_nick":"paddybyers","date":"2012-07-09T21:48:53.628Z","type":"nick"}
{"nick":"mattstevens","date":"2012-07-09T21:58:27.304Z","type":"join"}
{"nick":"hz","date":"2012-07-09T22:01:08.777Z","type":"quit"}
{"nick":"c4milo","reason":"Remote host closed the connection","date":"2012-07-09T22:06:08.566Z","type":"quit"}
{"nick":"c4milo","date":"2012-07-09T22:06:44.191Z","type":"join"}
{"nick":"rendar","date":"2012-07-09T22:07:43.186Z","type":"quit"}
{"nick":"bnoordhuis","message":"isaacs: https://github.com/joyent/node-in-the-industry/pull/1 <- who manages that?","date":"2012-07-09T22:08:22.145Z","type":"message"}
{"nick":"isaacs","message":"bnoordhuis: me","date":"2012-07-09T22:09:00.813Z","type":"message"}
{"nick":"bnoordhuis","message":"okay, cool","date":"2012-07-09T22:09:06.698Z","type":"message"}
{"nick":"isaacs","message":"bnoordhuis: the legalese is not sanctioned yet, so it might chnage if anyone really tests it.","date":"2012-07-09T22:09:28.785Z","type":"message"}
{"nick":"isaacs","message":"but the point is just to make clear that we control who gets in there, and you can't pay joyent for time on the nodejs.org site.","date":"2012-07-09T22:09:53.705Z","type":"message"}
{"nick":"isaacs","message":"ie, it's an ad for US, not for THEM","date":"2012-07-09T22:09:58.534Z","type":"message"}
{"nick":"EhevuTov","date":"2012-07-09T22:10:50.527Z","type":"join"}
{"nick":"mikeal","date":"2012-07-09T22:11:46.009Z","type":"join"}
{"nick":"c4milo","reason":"Ping timeout: 265 seconds","date":"2012-07-09T22:11:47.939Z","type":"quit"}
{"nick":"mikeal","reason":"Client Quit","date":"2012-07-09T22:13:54.823Z","type":"quit"}
{"nick":"mikeal","date":"2012-07-09T22:22:11.022Z","type":"join"}
{"nick":"EhevuTov","reason":"Quit: Leaving","date":"2012-07-09T22:31:31.885Z","type":"quit"}
{"nick":"bnoordhuis","message":"isaacs: i want to compile with -O2 instead of -O3 from now on","date":"2012-07-09T22:32:20.155Z","type":"message"}
{"nick":"bnoordhuis","message":"people are still reporting that 'pure virtual method called' build error even with -fno-strict-aliasing...","date":"2012-07-09T22:32:49.284Z","type":"message"}
{"nick":"isaacs","message":"yeah, sounds fine to me.","date":"2012-07-09T22:33:15.489Z","type":"message"}
{"nick":"isaacs","message":"what's the difference between o2 and o3 anyway?","date":"2012-07-09T22:33:26.831Z","type":"message"}
{"nick":"bnoordhuis","message":"isaacs: -fgcse-after-reload -finline-functions -fipa-cp-clone -fpredictive-commoning -ftree-vectorize -funswitch-loops apparently :)","date":"2012-07-09T22:35:55.358Z","type":"message"}
{"nick":"bnoordhuis","message":"no doubt it's the tree vectorizer that's buggy","date":"2012-07-09T22:36:14.069Z","type":"message"}
{"nick":"bnoordhuis","message":"let's test that just in case","date":"2012-07-09T22:36:22.069Z","type":"message"}
{"nick":"bnoordhuis","message":"okay, maybe it's not -ftree-vectorize","date":"2012-07-09T22:43:49.068Z","type":"message"}
{"nick":"bnoordhuis","message":"-fgcse-after-reload is my second best guess","date":"2012-07-09T22:44:11.019Z","type":"message"}
{"nick":"tjfontaine","message":"huh I would have guess tree as well","date":"2012-07-09T22:45:44.640Z","type":"message"}
{"nick":"isaacs","message":"bnoordhuis: if you wanna mess around with those flags, be my guest.","date":"2012-07-09T22:47:39.957Z","type":"message"}
{"nick":"bnoordhuis","message":"isaacs: yep, applying the principle of exclusion as we speak","date":"2012-07-09T22:47:56.787Z","type":"message"}
{"nick":"isaacs","message":"bnoordhuis: but the biggest perf improvement i've seen is usually between -O0 and -O1","date":"2012-07-09T22:48:01.343Z","type":"message"}
{"nick":"isaacs","message":"the diff between 2 and 3 is usually prety minor in practice","date":"2012-07-09T22:48:13.717Z","type":"message"}
{"nick":"bnoordhuis","message":"isaacs: actually... i ran some -O2 vs -O3 benchmarks a while ago and -O2 was slightly faster","date":"2012-07-09T22:48:27.751Z","type":"message"}
{"nick":"isaacs","message":"see? even more argument for not doing O3","date":"2012-07-09T22:48:41.606Z","type":"message"}
{"nick":"bnoordhuis","message":"that's on my puny core 2 duo with 32k of L1 icache though","date":"2012-07-09T22:49:42.215Z","type":"message"}
{"nick":"tjfontaine","message":"clearly what we should be testing here is gcc -O3 vs clang -O3","date":"2012-07-09T22:49:46.144Z","type":"message"}
{"nick":"isaacs","message":"pquerna: you around?","date":"2012-07-09T22:49:57.405Z","type":"message"}
{"nick":"bnoordhuis","message":"tjfontaine: clang is not affected","date":"2012-07-09T22:50:16.999Z","type":"message"}
{"nick":"bnoordhuis","message":"haven't benchmarked it though :)","date":"2012-07-09T22:50:33.335Z","type":"message"}
{"nick":"tjfontaine","message":"bnoordhuis: I meant for the benchmarks, not the gcc weirdness","date":"2012-07-09T22:50:38.609Z","type":"message"}
{"nick":"bnoordhuis","message":"apparently it's also not -fgcse-after-reload...","date":"2012-07-09T22:51:22.216Z","type":"message"}
{"nick":"c4milo","date":"2012-07-09T22:52:13.313Z","type":"join"}
{"nick":"EhevuTov","date":"2012-07-09T22:53:11.204Z","type":"join"}
{"nick":"paddybyers","reason":"Quit: paddybyers","date":"2012-07-09T23:04:27.691Z","type":"quit"}
{"nick":"bnoordhuis","message":"it's -finline-functions...","date":"2012-07-09T23:14:36.736Z","type":"message"}
{"nick":"tjfontaine","message":"how much of the inline keyword are you abusing?","date":"2012-07-09T23:15:31.700Z","type":"message"}
{"nick":"tjfontaine","message":"or rather do you know which method it's barfing on?","date":"2012-07-09T23:16:03.400Z","type":"message"}
{"nick":"bnoordhuis","message":"tjfontaine: yes. v8::internal::CodeStub::FindCodeInCache(v8::internal::Code**)","date":"2012-07-09T23:18:56.212Z","type":"message"}
{"nick":"bnoordhuis","message":"tjfontaine: https://github.com/joyent/node/issues/2912#issuecomment-5135600","date":"2012-07-09T23:19:14.749Z","type":"message"}
{"nick":"tjfontaine","message":"jeepers","date":"2012-07-09T23:19:43.584Z","type":"message"}
{"nick":"loladiro","reason":"Quit: loladiro","date":"2012-07-09T23:23:12.494Z","type":"quit"}
{"nick":"bradleymeck","message":"anyone know who is in charge of the fabled JS HTTP parser i have heard of?","date":"2012-07-09T23:44:32.774Z","type":"message"}
{"nick":"dap","date":"2012-07-09T23:55:17.744Z","type":"join"}