diff options
author | Anna Henningsen <anna@addaleax.net> | 2019-07-20 23:12:41 +0200 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2019-07-23 08:15:42 +0200 |
commit | 302865e8b9756812b45d9ff60403c2a231c01152 (patch) | |
tree | 05102fcdd46137778bbb98b36e31823d72c0cbaf /test | |
parent | c0f24be185a995ae05e55c44fde0ff83e81e63d9 (diff) | |
download | android-node-v8-302865e8b9756812b45d9ff60403c2a231c01152.tar.gz android-node-v8-302865e8b9756812b45d9ff60403c2a231c01152.tar.bz2 android-node-v8-302865e8b9756812b45d9ff60403c2a231c01152.zip |
src: do not include partial AsyncWrap instances in heap dump
Heap dumps can be taken either through the inspector or the public API
for it during an async_hooks init() hook, but at that point the
AsyncWrap in question is not done initializing yet and virtual methods
cannot be called on it.
Address this issue (somewhat hackily) by excluding `AsyncWrap`
instances which have not yet executed their `init()` hook fully
from heap dumps.
Fixes: https://github.com/nodejs/node/issues/28786
PR-URL: https://github.com/nodejs/node/pull/28789
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'test')
-rw-r--r-- | test/parallel/test-heapdump-async-hooks-init-promise.js | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/test/parallel/test-heapdump-async-hooks-init-promise.js b/test/parallel/test-heapdump-async-hooks-init-promise.js new file mode 100644 index 0000000000..c59cb89baa --- /dev/null +++ b/test/parallel/test-heapdump-async-hooks-init-promise.js @@ -0,0 +1,46 @@ +// Flags: --expose-gc +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const async_hooks = require('async_hooks'); +const v8 = require('v8'); + +// Regression test for https://github.com/nodejs/node/issues/28786 +// Make sure that creating a heap snapshot inside an async_hooks hook +// works for Promises. + +const createSnapshot = common.mustCall(() => { + v8.getHeapSnapshot().resume(); +}, 8); // 2 × init + 2 × resolve + 1 × (after + before) + 2 × destroy = 8 calls + +const promiseIds = []; + +async_hooks.createHook({ + init(id, type) { + if (type === 'PROMISE') { + createSnapshot(); + promiseIds.push(id); + } + }, + + before(id) { + if (promiseIds.includes(id)) createSnapshot(); + }, + + after(id) { + if (promiseIds.includes(id)) createSnapshot(); + }, + + promiseResolve(id) { + assert(promiseIds.includes(id)); + createSnapshot(); + }, + + destroy(id) { + if (promiseIds.includes(id)) createSnapshot(); + } +}).enable(); + + +Promise.resolve().then(() => {}); +setImmediate(global.gc); |