cluster: use Map to track handles in master

PR-URL: https://github.com/nodejs/node/pull/23125
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
Reviewed-By: Denys Otrishko <shishugi@gmail.com>
This commit is contained in:
cjihrig 2018-09-27 11:13:49 -04:00
parent 5a50989f5b
commit 847037eaed
No known key found for this signature in database
GPG Key ID: 7434390BDBE9B9C5
2 changed files with 17 additions and 18 deletions

View File

@ -148,7 +148,7 @@ function removeWorker(worker) {
delete cluster.workers[worker.id]; delete cluster.workers[worker.id];
if (keys(cluster.workers).length === 0) { if (keys(cluster.workers).length === 0) {
assert(keys(handles).length === 0, 'Resource leak detected.'); assert(handles.size === 0, 'Resource leak detected.');
intercom.emit('disconnect'); intercom.emit('disconnect');
} }
} }
@ -156,12 +156,10 @@ function removeWorker(worker) {
function removeHandlesForWorker(worker) { function removeHandlesForWorker(worker) {
assert(worker); assert(worker);
for (var key in handles) { handles.forEach((handle, key) => {
const handle = handles[key];
if (handle.remove(worker)) if (handle.remove(worker))
delete handles[key]; handles.delete(key);
} });
} }
cluster.fork = function(env) { cluster.fork = function(env) {
@ -277,7 +275,7 @@ function queryServer(worker, message) {
const key = `${message.address}:${message.port}:${message.addressType}:` + const key = `${message.address}:${message.port}:${message.addressType}:` +
`${message.fd}:${message.index}`; `${message.fd}:${message.index}`;
var handle = handles[key]; var handle = handles.get(key);
if (handle === undefined) { if (handle === undefined) {
let address = message.address; let address = message.address;
@ -302,12 +300,13 @@ function queryServer(worker, message) {
constructor = SharedHandle; constructor = SharedHandle;
} }
handles[key] = handle = new constructor(key, handle = new constructor(key,
address, address,
message.port, message.port,
message.addressType, message.addressType,
message.fd, message.fd,
message.flags); message.flags);
handles.set(key, handle);
} }
if (!handle.data) if (!handle.data)
@ -319,11 +318,11 @@ function queryServer(worker, message) {
errno: errno, errno: errno,
key: key, key: key,
ack: message.seq, ack: message.seq,
data: handles[key].data data: handles.get(key).data
}, reply); }, reply);
if (errno) if (errno)
delete handles[key]; // Gives other workers a chance to retry. handles.delete(key); // Gives other workers a chance to retry.
send(worker, reply, handle); send(worker, reply, handle);
}); });
@ -346,10 +345,10 @@ function listening(worker, message) {
// removed by a prior call to removeHandlesForWorker() so guard against that. // removed by a prior call to removeHandlesForWorker() so guard against that.
function close(worker, message) { function close(worker, message) {
const key = message.key; const key = message.key;
const handle = handles[key]; const handle = handles.get(key);
if (handle && handle.remove(worker)) if (handle && handle.remove(worker))
delete handles[key]; handles.delete(key);
} }
function send(worker, message, handle, cb) { function send(worker, message, handle, cb) {

View File

@ -4,7 +4,7 @@ const util = require('util');
module.exports = { module.exports = {
sendHelper, sendHelper,
internal, internal,
handles: {} // Used in tests. handles: new Map() // Used in tests.
}; };
const callbacks = new Map(); const callbacks = new Map();