From 3eff85a3d32c1f4ce4e7960fc1cfc0014a6b8467 Mon Sep 17 00:00:00 2001 From: dakkar Date: Sun, 21 Jul 2024 11:23:49 +0100 Subject: [PATCH 1/2] error out when we can't spawn workers - fixes #586 Setting `clusterLimit` to 0 means no workers are started, which usually breaks things. Also, some "hardening" things may prevent node from seeing how many CPUs the machine has, which has the same effect. With this commit we provide hopefully-useful error messages. --- packages/backend/src/boot/master.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts index 303ba94207..879249e231 100644 --- a/packages/backend/src/boot/master.ts +++ b/packages/backend/src/boot/master.ts @@ -180,7 +180,16 @@ async function connectDb(): Promise { */ async function spawnWorkers(limit = 1) { - const workers = Math.min(limit, os.cpus().length); + const cpuCount = os.cpus().length; + const workers = Math.min(limit, cpuCount); + if (workers === 0) { + const cause = cpuCount === 0 + ? 'you seem to have no CPUs (this may be caused by some "hardening" system)' + : "`config.clusterLimit` is 0 (if you don't want to use clustering, set the environment variable `MK_DISABLE_CLUSTERING` to a non-empty value instead)"; + bootLogger.error(`Configuration error: we can't create workers, ${cause}`, null, true); + process.exit(1); + } + bootLogger.info(`Starting ${workers} worker${workers === 1 ? '' : 's'}...`); await Promise.all([...Array(workers)].map(spawnWorker)); bootLogger.succ('All workers started'); From f18f30cb7914b7d8f7123f8e293fe8fc113ed474 Mon Sep 17 00:00:00 2001 From: dakkar Date: Sun, 21 Jul 2024 13:29:54 +0100 Subject: [PATCH 2/2] ignore cpuCount when it's 0 - fixes #586 seems more useful this way --- packages/backend/src/boot/master.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts index 879249e231..f757ed64b9 100644 --- a/packages/backend/src/boot/master.ts +++ b/packages/backend/src/boot/master.ts @@ -112,6 +112,11 @@ export async function masterMain() { await server(); } + if (config.clusterLimit === 0) { + bootLogger.error("Configuration error: we can't create workers, `config.clusterLimit` is 0 (if you don't want to use clustering, set the environment variable `MK_DISABLE_CLUSTERING` to a non-empty value instead)", null, true); + process.exit(1); + } + await spawnWorkers(config.clusterLimit); } @@ -181,14 +186,8 @@ async function connectDb(): Promise { async function spawnWorkers(limit = 1) { const cpuCount = os.cpus().length; - const workers = Math.min(limit, cpuCount); - if (workers === 0) { - const cause = cpuCount === 0 - ? 'you seem to have no CPUs (this may be caused by some "hardening" system)' - : "`config.clusterLimit` is 0 (if you don't want to use clustering, set the environment variable `MK_DISABLE_CLUSTERING` to a non-empty value instead)"; - bootLogger.error(`Configuration error: we can't create workers, ${cause}`, null, true); - process.exit(1); - } + // in some weird environments, node can't count the CPUs; we trust the config in those cases + const workers = cpuCount === 0 ? limit : Math.min(limit, cpuCount); bootLogger.info(`Starting ${workers} worker${workers === 1 ? '' : 's'}...`); await Promise.all([...Array(workers)].map(spawnWorker));