node/test/parallel/test-worker-stack-overflow-stack-size.js
Joyee Cheung f7d658a888
bootstrap: use a context snapshotted with primordials in workers
PR-URL: https://github.com/nodejs/node/pull/42867
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
2022-05-05 12:37:01 +01:00

64 lines
2.1 KiB
JavaScript

'use strict';
const common = require('../common');
const assert = require('assert');
const { once } = require('events');
const v8 = require('v8');
const { Worker } = require('worker_threads');
// Verify that Workers don't care about --stack-size, as they have their own
// fixed and known stack sizes.
async function runWorker(options = {}) {
const empiricalStackDepth = new Uint32Array(new SharedArrayBuffer(4));
const worker = new Worker(`
const { workerData: { empiricalStackDepth } } = require('worker_threads');
function f() {
empiricalStackDepth[0]++;
f();
}
f();`, {
eval: true,
workerData: { empiricalStackDepth },
...options
});
const [ error ] = await once(worker, 'error');
if (!options.skipErrorCheck) {
common.expectsError({
constructor: RangeError,
message: 'Maximum call stack size exceeded'
})(error);
}
return empiricalStackDepth[0];
}
(async function() {
{
v8.setFlagsFromString('--stack-size=500');
const w1stack = await runWorker();
v8.setFlagsFromString('--stack-size=1000');
const w2stack = await runWorker();
// Make sure the two stack sizes are within 10 % of each other, i.e. not
// affected by the different `--stack-size` settings.
assert(Math.max(w1stack, w2stack) / Math.min(w1stack, w2stack) < 1.1,
`w1stack = ${w1stack}, w2stack = ${w2stack} are too far apart`);
}
{
const w1stack = await runWorker({ resourceLimits: { stackSizeMb: 0.5 } });
const w2stack = await runWorker({ resourceLimits: { stackSizeMb: 1.0 } });
// Make sure the two stack sizes are at least 40 % apart from each other,
// i.e. affected by the different `stackSizeMb` settings.
assert(w2stack > w1stack * 1.4,
`w1stack = ${w1stack}, w2stack = ${w2stack} are too close`);
}
// Test that various low stack sizes result in an 'error' event.
// Currently the stack size needs to be at least 0.3MB for the worker to be
// bootstrapped properly.
for (const stackSizeMb of [ 0.3, 0.5, 1 ]) {
await runWorker({ resourceLimits: { stackSizeMb }, skipErrorCheck: true });
}
})().then(common.mustCall());