const updateWorkers = () => { var i; const arrKeyWorkers = Object.keys(cluster.workers); if (arrKeyWorkers.length < workersCount) { for (i = arrKeyWorkers.length; i < workersCount; ++i) { const newWorker = cluster.fork(); logger.warn('worker %s started.', newWorker.process.pid); } } else { for (i = workersCount; i < arrKeyWorkers.length; ++i) { const killWorker = cluster.workers[arrKeyWorkers[i]]; if (killWorker) { killWorker.kill(); } } } }
async checkConnectionLeak() { const timeoutID = setTimeout(() => { log.error('Redis connection leak detected'); Metric.observeRedisLeak(); this.worker.disconnect(); setTimeout(() => { this.worker.kill(); }, this.options.heartBeatStanch * 1000); }, this.options.heartBeatTimeout * 1000); try { await this.ping(); log.debug('Redis pong'); timeoutID.close(); } catch (err) { log.error('Redis error: ', err.message); timeoutID.close(); } }
cluster.on('message', (worker, message) => { switch (message) { case 'reload': strapi.log.info('The server is restarting\n'); _.forEach(cluster.workers, worker => worker.send('isKilled')); break; case 'kill': _.forEach(cluster.workers, worker => worker.kill()); cluster.fork(); break; case 'stop': _.forEach(cluster.workers, worker => worker.kill()); process.exit(0); break; default: return; } });