同じ問題が発生し、さらに追跡しました。
根本原因は、DiscourseUpdates.has_unseen_features? が GitUtils.has_commit? を呼び出しており、これが以下を実行している点です。
git merge-base --is-ancestor <sha> HEAD
新しい Discourse Docker イメージでは、コンテナ内のリポジトリがプロミサリモートによる部分クローンとして構成されています。機能の SHA がローカルに存在しない場合、Git はリモートから遅延フェッチ(upload-pack)を試行し、呼び出しごとに約 3〜4 秒を要します。
複数の機能がチェックされるため、リクエスト時間が 30 秒以上になり、最終的には 502 エラー(Unicorn タイムアウト)が発生します。特に、このチェックが実行されるスタッフユーザーで顕著です。
主なポイント:
-
スタッフユーザーでのみ発生(
CurrentUserSerializerを介して) -
部分クローンにおけるコミットの欠落が原因
-
欠落オブジェクトに対する Git 操作により、低速なリモート検索がトリガーされる
-
コンテナ内で
git merge-base --is-ancestor <missing_sha> HEADを実行することで再現可能
簡単な緩和策として、GitUtils.has_commit? の結果をキャッシュすること(例:HEAD+SHA ごと)があり、これにより高コストな Git 呼び出しの繰り返しを防ぐことができます。