Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: Worker initialization failure test case #31929

Closed
63 changes: 63 additions & 0 deletions test/parallel/test-worker-init-failure.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const child_process = require('child_process');

// Test that workers fail with meaningful error message
// when their initialization fails.

if (common.isWindows) {
common.skip('ulimit does not work on Windows.');
}

// A reasonably low fd count. An empty node process
// creates around 30 fds for its internal purposes,
// so making it too low will crash the process early,
// making it too high will cause too much resource use.
const OPENFILES = 128;

// Double the open files - so that some workers fail for sure.
const WORKERCOUNT = 256;

if (process.argv[2] === 'child') {
const { Worker } = require('worker_threads');
for (let i = 0; i < WORKERCOUNT; ++i) {
const worker = new Worker(
'require(\'worker_threads\').parentPort.postMessage(2 + 2)',
{ eval: true });
worker.on('message', (result) => {
assert.strictEqual(result, 4);
});
worker.on('error', (e) => {
assert.match(e.message, /Worker initialization failure: EMFILE/);
assert.strictEqual(e.code, 'ERR_WORKER_INIT_FAILED');
});
}
addaleax marked this conversation as resolved.
Show resolved Hide resolved

} else {
// Limit the number of open files, to force workers to fail
lundibundi marked this conversation as resolved.
Show resolved Hide resolved
let testCmd = `ulimit -n ${OPENFILES} && `;

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit:

Suggested change

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lundibundi, thanks. Removed the extra line.

testCmd += `${process.execPath} ${__filename} child`;
const cp = child_process.exec(testCmd);
lundibundi marked this conversation as resolved.
Show resolved Hide resolved

let stdout = '';
let stderr = '';

cp.on('exit', common.mustCall((code, signal) => {
assert.strictEqual(code, 0);
addaleax marked this conversation as resolved.
Show resolved Hide resolved
assert.strictEqual(signal, null);
if (stdout !== '')
console.log(`child stdout: ${stdout}`);
if (stderr !== '')
console.log(`child stderr: ${stderr}`);
}));

// Turn on the child streams for debugging purpose
lundibundi marked this conversation as resolved.
Show resolved Hide resolved
cp.stderr.on('data', (chunk) => {
stdout += chunk;
});
cp.stdout.on('data', (chunk) => {
stderr += chunk;
});
}