Finally narrowed this down to a (admittedly bizarre) test case -- still looking into exactly why it happens -- but generally there appears to be a race condition or off-by-one in the timer unref management if the unref is called and then later the http module is required:
setImmediate(function () {
require("http")
})
var i = setInterval(function () {
setImmediate(process.exit)
}, 10)
i.unref()
process.on("exit", logstuff)
function logstuff() {
console.log(process._getActiveHandles())
}
With 0.10 or 0.12 this logs [] which is expected because the interval was unreferenced.
Even better test case that may pinpoint the issue more clearly:
varassert=require('assert');vari=setInterval(function(){// does not matter if we swap the nextTick with the setImmediateprocess.nextTick(function(){setImmediate(process.exit);})},1);i.unref();process.on('exit',function(){assert.strictEqual(process._getActiveHandles().length,0);});
Update: order of nextTick / setImmediate does not matter.
Activity
brendanashworth commented on Mar 13, 2015
Running on node v0.11.14 on OSX, I get the latter output (same on io.js v1.5.2). Which operating system are you running on?
brycebaril commented on Mar 13, 2015
@brendanashworth Ubuntu -- I also get the unexpected output with 0.11.14 (just tried it now)
brycebaril commented on Mar 13, 2015
Yeah, appears to happen in node 0.11.12 through 0.11.14, but not the earlier/later versions.
brycebaril commented on Mar 14, 2015
Applying this commit to iojs appears to fix this: nodejs/node-v0.x-archive@0d05123
Fishrock123 commented on Mar 14, 2015
Looks like a few core modules exhibit this. I can confirm that patch is not in io.js. Reading up on the original issue.
thlorenz commented on Mar 25, 2015
@brycebaril testing @Fishrock123's fix for this.
I did get what you listed above before the fix for both the Release and Debug builds.
After the fix I get:
OSX
[ { '0': [Function: listOnTimeout], _idleNext: [Circular], _idlePrev: [Circular], msecs: 10 } ]only when using the Debug build and only sometimes (well it's a timer issue).
For the Release build I get [] at all times.
So it seems not completely fixed right?
Linux
Here things appear to be fixed at least for this usecase, but one of the tests in the PR still segfaults.
Fishrock123 commented on Mar 25, 2015
Simplified test case:
Even better test case that may pinpoint the issue more clearly:
Update: order of nextTick / setImmediate does not matter.
src: emit 'beforeExit' event on process object
brendanashworth commented on Apr 18, 2015
This was fixed in #1330.
Fishrock123 commented on Apr 19, 2015
@brendanashworth I'm not sure about that, did you test it? This is the "timers running during beforeExit time" issue.
brendanashworth commented on Apr 19, 2015
@Fishrock123 whoops! I ran the original test and that didn't error, I didn't try your updated test. Reopening, sorry about that.
Fishrock123 commented on Jul 16, 2015
Defer to #1264