test: fix flaky test-child-process-pass-fd
test-child-process-pass-fd needs to launch many processes simultaneously. On Fedora 24, this can result in EAGAIN "Resource temporarily unavailable" errors. When this occurs, simply try to launch a worker again. PR-URL: https://github.com/nodejs/node/pull/17598 Fixes: https://github.com/nodejs/node/issues/17589 Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com> Reviewed-By: Gibson Fahnestock <gibfahn@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
This commit is contained in:
parent
560c18238b
commit
d64b0a85e6
@ -18,26 +18,42 @@ const { fork } = require('child_process');
|
||||
const net = require('net');
|
||||
|
||||
const N = 80;
|
||||
let messageCallbackCount = 0;
|
||||
|
||||
function forkWorker() {
|
||||
const messageCallback = (msg, handle) => {
|
||||
messageCallbackCount++;
|
||||
assert.strictEqual(msg, 'handle');
|
||||
assert.ok(handle);
|
||||
worker.send('got');
|
||||
|
||||
let recvData = '';
|
||||
handle.on('data', common.mustCall((data) => {
|
||||
recvData += data;
|
||||
}));
|
||||
|
||||
handle.on('end', () => {
|
||||
assert.strictEqual(recvData, 'hello');
|
||||
worker.kill();
|
||||
});
|
||||
};
|
||||
|
||||
const worker = fork(__filename, ['child']);
|
||||
worker.on('error', (err) => {
|
||||
if (/\bEAGAIN\b/.test(err.message)) {
|
||||
forkWorker();
|
||||
return;
|
||||
}
|
||||
throw err;
|
||||
});
|
||||
worker.once('message', messageCallback);
|
||||
}
|
||||
|
||||
if (process.argv[2] !== 'child') {
|
||||
for (let i = 0; i < N; ++i) {
|
||||
const worker = fork(__filename, ['child']);
|
||||
worker.once('message', common.mustCall((msg, handle) => {
|
||||
assert.strictEqual(msg, 'handle');
|
||||
assert.ok(handle);
|
||||
worker.send('got');
|
||||
|
||||
let recvData = '';
|
||||
handle.on('data', common.mustCall((data) => {
|
||||
recvData += data;
|
||||
}));
|
||||
|
||||
handle.on('end', () => {
|
||||
assert.strictEqual(recvData, 'hello');
|
||||
worker.kill();
|
||||
});
|
||||
}));
|
||||
forkWorker();
|
||||
}
|
||||
process.on('exit', () => { assert.strictEqual(messageCallbackCount, N); });
|
||||
} else {
|
||||
let socket;
|
||||
let cbcalls = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user