From fc2cb7e20e7df952e04984c3cce0baaa808aa260 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?=
 <46447427+samunohito@users.noreply.github.com>
Date: Tue, 7 Jan 2025 21:19:59 +0900
Subject: [PATCH] =?UTF-8?q?fix(backend):=20disableClustering=E8=A8=AD?=
 =?UTF-8?q?=E5=AE=9A=E6=99=82=E3=81=AE=E5=88=9D=E6=9C=9F=E5=8C=96=E3=83=AD?=
 =?UTF-8?q?=E3=82=B8=E3=83=83=E3=82=AF=E3=82=92=E8=AA=BF=E6=95=B4=20(#1522?=
 =?UTF-8?q?4)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* fix(backend): disableClustering設定時の初期化ロジックを調整

* onlyServer かつ enableCluster な場合、メインプロセスでlistenするとワーカープロセス側のlistenと衝突するため、メインプロセスはforkのみに制限する(listenしない)

* ログの追加

* fix CHANGELOG.md

* fix comment
---
 CHANGELOG.md                        |  2 +-
 packages/backend/src/boot/entry.ts  | 20 +++++++++++-------
 packages/backend/src/boot/master.ts | 32 ++++++++++++++++++++---------
 3 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index f7ba1afc5..f065ed307 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -26,7 +26,7 @@
 - Fix: ユーザーのプロフィール画面をアドレス入力などで直接表示した際に概要タブの描画に失敗する問題の修正( #15032 )
 - Fix: 起動前の疎通チェックが機能しなくなっていた問題を修正  
   (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/737)
-
+- Fix: disableClustering設定時の初期化ロジックを調整( #15223 )
 
 ## 2024.11.0
 
diff --git a/packages/backend/src/boot/entry.ts b/packages/backend/src/boot/entry.ts
index 25375c301..da585ad68 100644
--- a/packages/backend/src/boot/entry.ts
+++ b/packages/backend/src/boot/entry.ts
@@ -68,16 +68,22 @@ process.on('exit', code => {
 
 //#endregion
 
-if (cluster.isPrimary || envOption.disableClustering) {
-	await masterMain();
-
+if (!envOption.disableClustering) {
 	if (cluster.isPrimary) {
+		logger.info(`Start main process... pid: ${process.pid}`);
+		await masterMain();
 		ev.mount();
+	} else if (cluster.isWorker) {
+		logger.info(`Start worker process... pid: ${process.pid}`);
+		await workerMain();
+	} else {
+		throw new Error('Unknown process type');
 	}
-}
-
-if (cluster.isWorker || envOption.disableClustering) {
-	await workerMain();
+} else {
+	// 非clusterの場合はMasterのみが起動するため、Workerの処理は行わない(cluster.isWorker === trueの状態でこのブロックに来ることはない)
+	logger.info(`Start main process... pid: ${process.pid}`);
+	await masterMain();
+	ev.mount();
 }
 
 readyRef.value = true;
diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts
index 4bc5c799c..2b181af67 100644
--- a/packages/backend/src/boot/master.ts
+++ b/packages/backend/src/boot/master.ts
@@ -91,25 +91,37 @@ export async function masterMain() {
 		});
 	}
 
-	if (envOption.disableClustering) {
+	bootLogger.info(
+		`mode: [disableClustering: ${envOption.disableClustering}, onlyServer: ${envOption.onlyServer}, onlyQueue: ${envOption.onlyQueue}]`
+	);
+
+	if (!envOption.disableClustering) {
+		// clusterモジュール有効時
+
 		if (envOption.onlyServer) {
-			await server();
+			// onlyServer かつ enableCluster な場合、メインプロセスはforkのみに制限する(listenしない)。
+			// ワーカープロセス側でlistenすると、メインプロセスでポートへの着信を受け入れてワーカープロセスへの分配を行う動作をする。
+			// そのため、メインプロセスでも直接listenするとポートの競合が発生して起動に失敗してしまう。
+			// see: https://nodejs.org/api/cluster.html#cluster
 		} else if (envOption.onlyQueue) {
 			await jobQueue();
 		} else {
 			await server();
 			await jobQueue();
 		}
-	} else {
-		if (envOption.onlyServer) {
-			// nop
-		} else if (envOption.onlyQueue) {
-			// nop
-		} else {
-			await server();
-		}
 
 		await spawnWorkers(config.clusterLimit);
+	} else {
+		// clusterモジュール無効時
+
+		if (envOption.onlyServer) {
+			await server();
+		} else if (envOption.onlyQueue) {
+			await jobQueue();
+		} else {
+			await server();
+			await jobQueue();
+		}
 	}
 
 	if (envOption.onlyQueue) {