fix(Shard): avoid caching null child in eval/fetchClientValue (#4823)

This commit is contained in:
Matt (IPv4) Cowley
2020-09-25 22:43:32 +01:00
committed by GitHub
parent 4e79e39e22
commit 77c0788b2c
2 changed files with 13 additions and 0 deletions

View File

@@ -23,9 +23,11 @@ const Messages = {
SHARDING_IN_PROCESS: 'Shards are still being spawned.', SHARDING_IN_PROCESS: 'Shards are still being spawned.',
SHARDING_ALREADY_SPAWNED: count => `Already spawned ${count} shards.`, SHARDING_ALREADY_SPAWNED: count => `Already spawned ${count} shards.`,
SHARDING_PROCESS_EXISTS: id => `Shard ${id} already has an active process.`, SHARDING_PROCESS_EXISTS: id => `Shard ${id} already has an active process.`,
SHARDING_WORKER_EXISTS: id => `Shard ${id} already has an active worker.`,
SHARDING_READY_TIMEOUT: id => `Shard ${id}'s Client took too long to become ready.`, SHARDING_READY_TIMEOUT: id => `Shard ${id}'s Client took too long to become ready.`,
SHARDING_READY_DISCONNECTED: id => `Shard ${id}'s Client disconnected before becoming ready.`, SHARDING_READY_DISCONNECTED: id => `Shard ${id}'s Client disconnected before becoming ready.`,
SHARDING_READY_DIED: id => `Shard ${id}'s process exited before its Client became ready.`, SHARDING_READY_DIED: id => `Shard ${id}'s process exited before its Client became ready.`,
SHARDING_NO_CHILD_EXISTS: id => `Shard ${id} has no active process or worker.`,
COLOR_RANGE: 'Color must be within the range 0 - 16777215 (0xFFFFFF).', COLOR_RANGE: 'Color must be within the range 0 - 16777215 (0xFFFFFF).',
COLOR_CONVERT: 'Unable to convert color to a number.', COLOR_CONVERT: 'Unable to convert color to a number.',

View File

@@ -124,6 +124,9 @@ class Shard extends EventEmitter {
.on('exit', this._exitListener); .on('exit', this._exitListener);
} }
this._evals.clear();
this._fetches.clear();
/** /**
* Emitted upon the creation of the shard's child process/worker. * Emitted upon the creation of the shard's child process/worker.
* @event Shard#spawn * @event Shard#spawn
@@ -225,6 +228,10 @@ class Shard extends EventEmitter {
* .catch(console.error); * .catch(console.error);
*/ */
fetchClientValue(prop) { fetchClientValue(prop) {
// Shard is dead (maybe respawning), don't cache anything and error immediately
if (!this.process && !this.worker) return Promise.reject(new Error('SHARDING_NO_CHILD_EXISTS', this.id));
// Cached promise from previous call
if (this._fetches.has(prop)) return this._fetches.get(prop); if (this._fetches.has(prop)) return this._fetches.get(prop);
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {
@@ -255,6 +262,10 @@ class Shard extends EventEmitter {
* @returns {Promise<*>} Result of the script execution * @returns {Promise<*>} Result of the script execution
*/ */
eval(script) { eval(script) {
// Shard is dead (maybe respawning), don't cache anything and error immediately
if (!this.process && !this.worker) return Promise.reject(new Error('SHARDING_NO_CHILD_EXISTS', this.id));
// Cached promise from previous call
if (this._evals.has(script)) return this._evals.get(script); if (this._evals.has(script)) return this._evals.get(script);
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {