Skip to content

Commit

Permalink
f
Browse files Browse the repository at this point in the history
  • Loading branch information
fengmk2 committed Dec 15, 2024
1 parent fa36be0 commit 1f94388
Show file tree
Hide file tree
Showing 7 changed files with 180 additions and 188 deletions.
22 changes: 11 additions & 11 deletions test/cfork.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,15 @@ describe('test/cfork.test.ts', () => {
await urllib.request('http://127.0.0.1:1984/error', {
dataType: 'text',
});
}, /(timeout|other side closed)/);
}, /(timeout|other side closed|ECONNRESET)/);
});

it('should worker exit', async () => {
await assert.rejects(async () => {
await urllib.request('http://127.0.0.1:1984/exit', {
dataType: 'text',
});
}, /other side closed/);
}, /other side closed|ECONNRESET/);
});

it('should slave listen worked', async () => {
Expand Down Expand Up @@ -109,7 +109,7 @@ describe('test/cfork.test.ts', () => {
if (process.platform === 'win32') {
assert.match(err.message, /ECONNRESET/);
} else {
assert.match(err.message, /(socket hang up|other side closed|timeout)/);
assert.match(err.message, /(socket hang up|other side closed|timeout|ECONNRESET)/);
}
return true;
});
Expand Down Expand Up @@ -148,7 +148,7 @@ describe('test/cfork.test.ts', () => {
});
}, (err: any) => {
// console.error(err);
assert.match(err.message, /(other side closed|ECONNREFUSED)/);
assert.match(err.message, /(other side closed|ECONNREFUSED|ECONNRESET)/);
return true;
});

Expand Down Expand Up @@ -187,7 +187,7 @@ describe('test/cfork.test.ts', () => {
timeout: 5000,
});
}, (err: any) => {
assert.match(err.message, /(timeout|ECONNREFUSED|other side closed)/);
assert.match(err.message, /(timeout|ECONNREFUSED|other side closed|ECONNRESET)/);
return true;
});
await assert.rejects(async () => {
Expand All @@ -196,7 +196,7 @@ describe('test/cfork.test.ts', () => {
timeout: 5000,
});
}, (err: any) => {
assert.match(err.message, /(timeout|ECONNREFUSED|other side closed)/);
assert.match(err.message, /(timeout|ECONNREFUSED|other side closed|ECONNRESET)/);
return true;
});
await assert.rejects(async () => {
Expand All @@ -205,7 +205,7 @@ describe('test/cfork.test.ts', () => {
timeout: 5000,
});
}, (err: any) => {
assert.match(err.message, /(timeout|ECONNREFUSED|other side closed)/);
assert.match(err.message, /(timeout|ECONNREFUSED|other side closed|ECONNRESET)/);
return true;
});
await assert.rejects(async () => {
Expand All @@ -214,7 +214,7 @@ describe('test/cfork.test.ts', () => {
timeout: 5000,
});
}, (err: any) => {
assert.match(err.message, /(timeout|ECONNREFUSED|other side closed)/);
assert.match(err.message, /(timeout|ECONNREFUSED|other side closed|ECONNRESET)/);
return true;
});
await assert.rejects(async () => {
Expand All @@ -223,7 +223,7 @@ describe('test/cfork.test.ts', () => {
timeout: 5000,
});
}, (err: any) => {
assert.match(err.message, /(timeout|ECONNREFUSED|other side closed)/);
assert.match(err.message, /(timeout|ECONNREFUSED|other side closed|ECONNRESET)/);
return true;
});
await assert.rejects(async () => {
Expand All @@ -232,7 +232,7 @@ describe('test/cfork.test.ts', () => {
timeout: 5000,
});
}, (err: any) => {
assert.match(err.message, /(timeout|ECONNREFUSED|other side closed)/);
assert.match(err.message, /(timeout|ECONNREFUSED|other side closed|ECONNRESET)/);
return true;
});
});
Expand All @@ -244,7 +244,7 @@ describe('test/cfork.test.ts', () => {
timeout: 5000,
});
}, (err: any) => {
assert.match(err.message, /ECONNREFUSED/);
assert.match(err.message, /ECONNREFUSED|ECONNRESET/);
return true;
});
});
Expand Down
73 changes: 36 additions & 37 deletions test/fixtures/kill_worker/master.cjs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
'use strict';

var path = require('path');
var util = require('util');
var cfork = require('../../');
/* eslint-disable @typescript-eslint/no-var-requires */
const path = require('node:path');
const util = require('node:util');
const cluster = require('node:cluster');
const http = require('node:http');
const { cfork, setDisableRefork } = require('../../..');

cfork({
exec: path.join(__dirname, '../worker.cjs'),
Expand All @@ -15,44 +16,42 @@ cfork({
duration: 60000,
autoCoverage: true,
})
.on('fork', function (worker) {
console.warn('[%s] [worker:%d] new worker start', Date(), worker.process.pid);
})
.on('listening', function (worker, address) {
console.warn('[%s] [worker:%d] listening on %j', Date(), worker.process.pid, address.port);
process.send('listening');
})
.on('disconnect', function (worker) {
var propertyName = worker.hasOwnProperty('exitedAfterDisconnect') ? 'exitedAfterDisconnect' : 'suicide';
console.warn('[%s] [master:%s] worker:%s disconnect, %s: %s, state: %s.',
Date(), process.pid, worker.process.pid, propertyName, worker[propertyName], worker.state);
})
.on('exit', function (worker, code, signal) {
var exitCode = worker.process.exitCode;
var propertyName = worker.hasOwnProperty('exitedAfterDisconnect') ? 'exitedAfterDisconnect' : 'suicide';
var err = new Error(util.format('worker %s died (code: %s, signal: %s, %s: %s, state: %s)',
worker.process.pid, exitCode, signal, propertyName, worker[propertyName], worker.state));
err.name = 'WorkerDiedError';
console.error('[%s] [master:%s] worker exit: %s', Date(), process.pid, err.stack);
})
.on('reachReforkLimit', function () {
process.send('reach refork limit');
});
.on('fork', function(worker) {
console.warn('[%s] [worker:%d] new worker start', Date(), worker.process.pid);
})
.on('listening', function(worker, address) {
console.warn('[%s] [worker:%d] listening on %j', Date(), worker.process.pid, address.port);
process.send('listening');
})
.on('disconnect', function(worker) {
const propertyName = worker.hasOwnProperty('exitedAfterDisconnect') ? 'exitedAfterDisconnect' : 'suicide';
console.warn('[%s] [master:%s] worker:%s disconnect, %s: %s, state: %s.',
Date(), process.pid, worker.process.pid, propertyName, worker[propertyName], worker.state);
})
.on('exit', function(worker, code, signal) {
const exitCode = worker.process.exitCode;
const propertyName = worker.hasOwnProperty('exitedAfterDisconnect') ? 'exitedAfterDisconnect' : 'suicide';
const err = new Error(util.format('worker %s died (code: %s, signal: %s, %s: %s, state: %s)',
worker.process.pid, exitCode, signal, propertyName, worker[propertyName], worker.state));
err.name = 'WorkerDiedError';
console.error('[%s] [master:%s] worker exit: %s', Date(), process.pid, err.stack);
})
.on('reachReforkLimit', function() {
process.send('reach refork limit');
});

process.once('SIGTERM', function () {
process.once('SIGTERM', function() {
process.exit(0);
});

var cluster = require('cluster');
var http = require('http');
var port = 1986;
const port = 1986;

http.createServer(function (req, res) {
http.createServer(function(req, res) {
// kill worker
var count = 0;
for (var id in cluster.workers) {
var worker = cluster.workers[id];
cfork.setDisableRefork(worker, true);
let count = 0;
for (const id in cluster.workers) {
const worker = cluster.workers[id];
setDisableRefork(worker, true);
worker.process.kill('SIGTERM');
count++;
}
Expand Down
61 changes: 30 additions & 31 deletions test/fixtures/one_worker_cluster/master.cjs
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
'use strict';
/* eslint-disable @typescript-eslint/no-var-requires */
const path = require('node:path');
const util = require('node:util');
const { fork } = require('../../..');

var path = require('path');
var util = require('util');
var cfork = require('../../');

cfork({
fork({
exec: path.join(__dirname, '../worker.cjs'),
slaves: [
path.join(__dirname, '../slave.cjs'),
Expand All @@ -15,34 +14,34 @@ cfork({
duration: 60000,
autoCoverage: true,
})
.on('fork', function (worker) {
console.warn('[%s] [worker:%d] new worker start', Date(), worker.process.pid);
})
.on('listening', function (worker, address) {
console.warn('[%s] [worker:%d] listening on %j', Date(), worker.process.pid, address.port);
process.send('listening');
})
.on('disconnect', function (worker) {
var propertyName = worker.hasOwnProperty('exitedAfterDisconnect') ? 'exitedAfterDisconnect' : 'suicide';
console.warn('[%s] [master:%s] worker:%s disconnect, %s: %s, state: %s.',
Date(), process.pid, worker.process.pid, propertyName, worker[propertyName], worker.state);
})
.on('exit', function (worker, code, signal) {
var exitCode = worker.process.exitCode;
var propertyName = worker.hasOwnProperty('exitedAfterDisconnect') ? 'exitedAfterDisconnect' : 'suicide';
var err = new Error(util.format('worker %s died (code: %s, signal: %s, %s: %s, state: %s)',
worker.process.pid, exitCode, signal, propertyName, worker[propertyName], worker.state));
err.name = 'WorkerDiedError';
console.error('[%s] [master:%s] worker exit: %s', Date(), process.pid, err.stack);
})
.on('reachReforkLimit', function () {
process.send('reach refork limit');
});
.on('fork', function(worker) {
console.warn('[%s] [worker:%d] new worker start', Date(), worker.process.pid);
})
.on('listening', function(worker, address) {
console.warn('[%s] [worker:%d] listening on %j', Date(), worker.process.pid, address.port);
process.send('listening');
})
.on('disconnect', function(worker) {
const propertyName = worker.hasOwnProperty('exitedAfterDisconnect') ? 'exitedAfterDisconnect' : 'suicide';
console.warn('[%s] [master:%s] worker:%s disconnect, %s: %s, state: %s.',
Date(), process.pid, worker.process.pid, propertyName, worker[propertyName], worker.state);
})
.on('exit', function(worker, code, signal) {
const exitCode = worker.process.exitCode;
const propertyName = worker.hasOwnProperty('exitedAfterDisconnect') ? 'exitedAfterDisconnect' : 'suicide';
const err = new Error(util.format('worker %s died (code: %s, signal: %s, %s: %s, state: %s)',
worker.process.pid, exitCode, signal, propertyName, worker[propertyName], worker.state));
err.name = 'WorkerDiedError';
console.error('[%s] [master:%s] worker exit: %s', Date(), process.pid, err.stack);
})
.on('reachReforkLimit', function() {
process.send('reach refork limit');
});

process.once('SIGTERM', function () {
process.once('SIGTERM', function() {
process.exit(0);
});

setTimeout(function () {
setTimeout(function() {
mock.uncaughtException;
}, 500);
44 changes: 0 additions & 44 deletions test/kill_worker.test.js

This file was deleted.

44 changes: 44 additions & 0 deletions test/kill_worker.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import assert from 'node:assert';
import childprocess, { ChildProcess } from 'node:child_process';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import urllib from 'urllib';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

describe('test/kill_worker.test.ts', () => {
let child: ChildProcess;
const messages = [];

before(function(done) {
const workerNum = 2;
const slaveNum = 1;
let listeningCount = 0;
child = childprocess.fork(path.join(__dirname, 'fixtures', 'kill_worker', 'master.cjs'));
child.on('message', function(m) {
messages.push(m);
console.log(m, listeningCount);
if (m === 'listening') {
++listeningCount;
if (listeningCount === (workerNum + slaveNum)) {
done();
}
}
});
});

after(function(done) {
setTimeout(function() {
child.kill('SIGTERM');
setTimeout(done, 1000);
}, 1000);
});

it('should kill all workers', async () => {
const response = await urllib.request('http://localhost:1986/', {
dataType: 'text',
});
assert.equal(response.data, 'kill 3 workers');
});
});
Loading

0 comments on commit 1f94388

Please sign in to comment.