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

View File

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