mirror of https://github.com/lukechilds/node.git
Browse Source
Until now, the async_hooks PromiseHook did not register the Promise’s async id and trigger id on the id stack, so inside the `.then()` handler those ids would be invalid. To fix this, add push and pop calls to its `before` and `after` parts, respectively. Some care needs to be taken for the cases that the Promise hook is being disabled or enabled during the execution of a Promise handler; in the former case, actually removing the hook is delayed by adding another task to the microtask queue, in the latter case popping the id off the async id stack is skipped if the ids don’t match. Fixes: https://github.com/nodejs/node/issues/13583 PR-URL: https://github.com/nodejs/node/pull/13585 Reviewed-By: Trevor Norris <trevnorris@gmail.com>v6
7 changed files with 97 additions and 15 deletions
@ -0,0 +1,17 @@ |
|||
'use strict'; |
|||
const common = require('../common'); |
|||
const async_hooks = require('async_hooks'); |
|||
|
|||
const hook = async_hooks.createHook({ |
|||
init: common.mustCall(2), |
|||
before: common.mustCall(1), |
|||
after: common.mustNotCall() |
|||
}).enable(); |
|||
|
|||
Promise.resolve(1).then(common.mustCall(() => { |
|||
hook.disable(); |
|||
|
|||
Promise.resolve(42).then(common.mustCall()); |
|||
|
|||
process.nextTick(common.mustCall()); |
|||
})); |
@ -0,0 +1,13 @@ |
|||
'use strict'; |
|||
const common = require('../common'); |
|||
const async_hooks = require('async_hooks'); |
|||
|
|||
Promise.resolve(1).then(common.mustCall(() => { |
|||
async_hooks.createHook({ |
|||
init: common.mustCall(), |
|||
before: common.mustCall(), |
|||
after: common.mustCall(2) |
|||
}).enable(); |
|||
|
|||
process.nextTick(common.mustCall()); |
|||
})); |
@ -0,0 +1,32 @@ |
|||
'use strict'; |
|||
const common = require('../common'); |
|||
const assert = require('assert'); |
|||
const async_hooks = require('async_hooks'); |
|||
|
|||
common.crashOnUnhandledRejection(); |
|||
|
|||
const promiseAsyncIds = []; |
|||
|
|||
async_hooks.createHook({ |
|||
init: common.mustCallAtLeast((id, type, triggerId) => { |
|||
if (type === 'PROMISE') { |
|||
// Check that the last known Promise is triggering the creation of
|
|||
// this one.
|
|||
assert.strictEqual(promiseAsyncIds[promiseAsyncIds.length - 1] || 1, |
|||
triggerId); |
|||
promiseAsyncIds.push(id); |
|||
} |
|||
}, 3), |
|||
before: common.mustCall((id) => { |
|||
assert.strictEqual(id, promiseAsyncIds[1]); |
|||
}), |
|||
after: common.mustCall((id) => { |
|||
assert.strictEqual(id, promiseAsyncIds[1]); |
|||
}) |
|||
}).enable(); |
|||
|
|||
Promise.resolve(42).then(common.mustCall(() => { |
|||
assert.strictEqual(async_hooks.executionAsyncId(), promiseAsyncIds[1]); |
|||
assert.strictEqual(async_hooks.triggerAsyncId(), promiseAsyncIds[0]); |
|||
Promise.resolve(10); |
|||
})); |
Loading…
Reference in new issue