summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2019-07-20 23:12:41 +0200
committerMichaël Zasso <targos@protonmail.com>2019-07-23 08:15:42 +0200
commit302865e8b9756812b45d9ff60403c2a231c01152 (patch)
tree05102fcdd46137778bbb98b36e31823d72c0cbaf /test
parentc0f24be185a995ae05e55c44fde0ff83e81e63d9 (diff)
downloadandroid-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.js46
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);