summaryrefslogtreecommitdiff
path: root/test/parallel/test-worker-resource-limits.js
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2019-03-08 19:35:40 +0100
committerAnna Henningsen <anna@addaleax.net>2019-11-05 19:57:13 +0100
commitd855904ef6a0daa0c0475e745fdd33815e760e0c (patch)
tree56c605726ad3200bd533a3bfab836c45ad48473e /test/parallel/test-worker-resource-limits.js
parent309e1eae797d3060126ef2e13ee0ab124808f575 (diff)
downloadandroid-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.js58
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]);
+}