diff options
author | Anna Henningsen <anna@addaleax.net> | 2019-03-08 19:35:40 +0100 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2019-11-05 19:57:13 +0100 |
commit | d855904ef6a0daa0c0475e745fdd33815e760e0c (patch) | |
tree | 56c605726ad3200bd533a3bfab836c45ad48473e /test/parallel/test-worker-resource-limits.js | |
parent | 309e1eae797d3060126ef2e13ee0ab124808f575 (diff) | |
download | android-node-v8-d855904ef6a0daa0c0475e745fdd33815e760e0c.tar.gz android-node-v8-d855904ef6a0daa0c0475e745fdd33815e760e0c.tar.bz2 android-node-v8-d855904ef6a0daa0c0475e745fdd33815e760e0c.zip |
worker: allow specifying resource limits
Allow specifying resource limits for the JS engine instance created
as part of a Worker.
PR-URL: https://github.com/nodejs/node/pull/26628
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
Diffstat (limited to 'test/parallel/test-worker-resource-limits.js')
-rw-r--r-- | test/parallel/test-worker-resource-limits.js | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/test/parallel/test-worker-resource-limits.js b/test/parallel/test-worker-resource-limits.js new file mode 100644 index 0000000000..2d4ebbc0ce --- /dev/null +++ b/test/parallel/test-worker-resource-limits.js @@ -0,0 +1,58 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const v8 = require('v8'); +const { Worker, resourceLimits, isMainThread } = require('worker_threads'); + +if (isMainThread) { + assert.deepStrictEqual(resourceLimits, {}); +} + +const testResourceLimits = { + maxOldGenerationSizeMb: 16, + maxYoungGenerationSizeMb: 4, + codeRangeSizeMb: 16, +}; + +// Do not use isMainThread so that this test itself can be run inside a Worker. +if (!process.env.HAS_STARTED_WORKER) { + process.env.HAS_STARTED_WORKER = 1; + const w = new Worker(__filename, { resourceLimits: testResourceLimits }); + assert.deepStrictEqual(w.resourceLimits, testResourceLimits); + w.on('exit', common.mustCall((code) => { + assert.strictEqual(code, 1); + assert.deepStrictEqual(w.resourceLimits, {}); + })); + w.on('error', common.expectsError({ + code: 'ERR_WORKER_OUT_OF_MEMORY', + message: 'Worker terminated due to reaching memory limit' + })); + return; +} + +assert.deepStrictEqual(resourceLimits, testResourceLimits); +const array = []; +while (true) { + // Leave 10 % wiggle room here. + const usedMB = v8.getHeapStatistics().used_heap_size / 1024 / 1024; + assert(usedMB < resourceLimits.maxOldGenerationSizeMb * 1.1); + + let seenSpaces = 0; + for (const { space_name, space_size } of v8.getHeapSpaceStatistics()) { + if (space_name === 'new_space') { + seenSpaces++; + assert( + space_size / 1024 / 1024 < resourceLimits.maxYoungGenerationSizeMb * 2); + } else if (space_name === 'old_space') { + seenSpaces++; + assert(space_size / 1024 / 1024 < resourceLimits.maxOldGenerationSizeMb); + } else if (space_name === 'code_space') { + seenSpaces++; + assert(space_size / 1024 / 1024 < resourceLimits.codeRangeSizeMb); + } + } + assert.strictEqual(seenSpaces, 3); + + for (let i = 0; i < 100; i++) + array.push([array]); +} |